Java 网络概述 和 TCP 和 UDP

网络7层模型:OSI 标准 open system interconnection

这里写图片描述
应用层所使用的协议:
远程登陆协议:Telnet
文件传输协议: FTP
超文本传输协议: HTTP
域名服务DNS
简单邮件传输协议: SMTP
邮局协议:POP3

传输层协议:
TCP : 面向连接的可靠的传输协议
UDP : 是无连接的,不可靠的传输协议

网络层协议:
网际协议 IP
互联网控制协议 ICMP
Internet组管理协议 IGMP

TCP : (Transfer Control Protocal) 面向连接可靠的传输协议, 通过TCP协议传输,得到的是一个顺序的,无差错的数据流,发送方和接收方成对的两个Socket之间必须建立连接,以便在TCP协议上进行通信,当一个Socket(通常是Server socket)等待建立连接时,另一个Socket可以发送请求,一旦两个连接建立起来,他们就可以进行双向传输数据。
需要连接,需要校验,适合准确率要求高的场景

UDP : (User Datagram Protocal )是无连接的,不可靠的传输协议,他发送的每一个数据报都是一个独立的信息,包括完整的源地址或者目的地址,它在网络上以任何可能的路径传往目的地,因此能够达到目标,达到目的地的时间,以及内容的正确性都是不能够保证的。

它传输的数据块比较大,适合大数据量的传输或者准确率要求不要的场景,比如视频传输
UDP发送的数据块的大小是有限制的,一般在64KB之内,而且接受方接受的数据可能是无序的, 而TCP一旦建立了连接,就可以按照统一的格式传输大量的数据, 它传输的数据是有序的 因此Http ,ftp 都是基于TCP协议的

为什么有了TCP还要使用UDP呢?
这里写图片描述

TCP/IP 建立连接和断开连接的方式:(三次握手,四次挥手) 很重要
首选来图示一下建立连接和断开连接的方式,
这里写图片描述

建立连接需要三次握手:
第一:客户端向服务器发送一个连接请求 (SYN)
第二:服务器端接收到连接请求,为与此客户端的连接分配一定的资源,并发送 (SYN+ACK) 给客户端,通知已经接受到消息,可以建立连接。
第三: 客户端接收到(SYN+ACK),为此次连接分配资源,并将ACK返回发送给服务器端。
这样连接就被建立起来了
(可以看到双方之间在进行通信,发送的消息不只是通知双方可以建立连接,也包含的身份认证, 客户端发送的SYN,服务器又返回,通过验证SYN可以判断是不是自己请求的服务器, 服务器发送了ACK ,然后客户端又返回ACK,可以判断是不是正确的客户)

断开连接的四次挥手: (无论是服务器端先断开连接,还是客户端先断开连接,遵循的都是这样的一个流程)
假设是客户端首先发起了断开请求:
第一步: 客户发起了close请求,要求断开连接,发送一个FIN信号(此时客户端隐藏的含义就是我要断开连接,我已经没有什么数据要发送给你了)
第二步: 服务器端接收到了FIN信号,并对此作出回应,发送ACK消息,表示我已经接收到了你的请求,收到了你最后的数据。 (此时客户端收到ACK消息后就会关闭读通道,不再从服务器读数据)
第三步: 服务器端向客户端发送了一个FIN信号,表示可以断开与你的连接了(此时隐藏的含义是,服务器端已经没有什么数据发送给客户端了)
第四步: 客户端接收到了服务器端发送的FIN信号,给服务器发送一个确认的ACK信号,表示已经收到你的关闭请求和最后的数据了。

里面有好几个wait,是我们需要重点了解的,以及为什么要wait?

一句话可以概括这个原因: 就是消息在网络中的接收与传输问题(消息延迟或者消息发送失败)

TIME_WAIT
CLOSE_WAIT
假设发起TCP连接关闭的一方称为client,被动关闭的一方称为server, 那么 TIME_WAIT 发生在client, CLOSE_WAIT 发生在server, 当服务器端接收到客户端发送的FIN信号之后(第一次挥手)就会进入 CLOSE_WAIT 状态; 当客户端接收到了服务器端发送的FIN信号之后(第三次挥手),就会进入TIME_WAIT 状态;

【注意】 在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。
【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:
一、保证TCP协议的全双工连接能够可靠关闭。我们必须假设网络是不可靠的,有可以最后一个ACK丢失,这样服务器端就接受不到ACK消息之后就会重发close请求,所以TIME_WAIT状态就是用来重发可能丢失的ACK报文
二、保证这次连接的重复数据段从网络中消失。 如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,就会造成数据混淆。

TCP/IP 模型:
网络接口(对应着物理层和数据链路层)
网络层
传输层
应用层(对应着 会话层,表示层,应用层):

Java的网络类 在java.net 包中
URL(Uniform resouce locator)统一资源定位符,表示互联网上某一资源的定位符 包括协议表示符,资源名字(主机名,文件名,端口号,引用)对于http协议默认的监听端口号就是80
路由器和交换机的不同:
第一层: 物理层 网线,集线器
第二层:数据链路层 网卡,交换机,网桥
第三层:网络层 路由器 (三层交换机)
交换机利用物理地址或者说MAC地址来确定转发数据的目的地址不对数据包本身进行解析,MAC地址通常是硬件自带的,由网卡生产商来分配的,而且已经固化到了网卡中去,一般来说是不可更改的
路由器利用不同网络地址(即IP地址)来确定数据转发的地址,也就是说路由器能够解析接收到的数据包,从而获得包头部的Ip地址信息,按照路由协议进行动态转发, IP地址是在软件中实现的,是描述设备所在的网络。
另外传统的交换机只能分割冲突域,不能分割广播域;而路由器可以分割广播域,连接到路由器上的网段会被分配成不同的广播域,广播数据不会穿过路由器,路由器仅仅转发特定地址的数据包,不传送不支持路由协议的数据包传送和未知目标网络数据包的传送,从而可以防止广播风暴

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值