理解TCP和UDP

2019-02-13  本文已影响0人  猪蹄胖

一、TCP端口

二、TCP报文结构

三、TCP连接的建立和释放

TCP的整个交互过程可总结为:先建立连接、然后传输数据、最后释放连接

其实网络上的传输是没有连接的,TCP所谓的连接,只不过是通信双方维护一个连接状态,看上去像是有连接

image.png

三次握手,连接建立过程

TCP连接的建立采用客户-服务器方式,主动发起连接建立的一方叫客户端client,被动等待建立连接的一方叫服务端Server

对于建立连接的三次握手,主要目的是初始化Sequence Number,并且通信的双方都需要告知对方自己的初始化序号,此过程也叫SYN阶段.
这个序号是作为接下来数据通信的序号,用来保证应用层接受到的数据不会因为网络上的传输问题二乱序TCP需要用序号进行数据拼接

四次挥手,释放链接

TCP的连接是全双工(可以同时发送和接受)的连接,因此在关闭连接时,必须关闭传送和接收两个方向的连接
客户端给服务器发送一个携带FINTCP结束报文,然后服务器返回给客户端一个确认报文,同时发送一个结束报文,当客户端恢复一个确认报文后,连接结束

结束之前都处于ESTABLISHED状态,模拟客户端先主动断开连接

Client

CLOSED -> SYN_SENT -> ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED

Server

CLOSED -> LISTEN -> SYN_RECEIVED -> ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED

MSL

Maximum Segment Lifetime(数据包的最大生命周期),是一个数据包能在互联网上生存的最长时间,若超过这个时间则该数据包将会消失在网络中。
操作系统通常会将2MSL设为4分钟,最低不少于30秒,因而``TIME_WAIT状态一般维持在30秒至4分钟。这个是TCP/IP设计者设计的,也就是无法解决的。

TIME_WAIT

TIME_WAIT状态的存在主要有两个原因:

可靠地实现TCP全双工连接的终止
关闭TCP时,最后的ACK包是由主动关闭方发出的,如果ACK包丢失,被动关闭方将重发FIN包,因此主动方必须维护状态信息,以接收它重发这个ACK包。如果不维持这个状态信息,那么主动方将回到CLOSED状态,而被动方重发的FIN包响应RST包,产生一个错误,为避免四次握手协议中包丢失的情况,主动关闭方必须维持TIME_WAIT状态。

确保迷路数据包重新出现而影响新连接
TCP数据包可能由于路由器异常而迷路,在迷路期间,数据包发送方可能因超时而重发这个包,迷路的数据包在路由器恢复后也会被送到目的地,这个迷路的数据包就称为Lost Duplicate
在关闭一个TCP连接后,如果马上使用相同的IP地址和端口建立新的TCP连接,那可能出现迷路重复数据包在前一个连接关闭后再次出现,影响新建立的连接。为了避免这一情况,TCP协议不允许使用处于TIME_WAIT状态的连接的IP和端口启动一个新连接,只有经过2MSL的时间,确保上一次连接中所有的迷路重复数据包都已消失在网络中,才能安全地建立新连接。

对于Client而言,每个连接都需要占用一个端口,而系统允许的可用端口数不足65000个,大量建立连接和主动断开,会耗尽端口

对Server而言(特别是处理高并发短连接的Server),Server对每个端口上的连接数受到文件描述符的最大打开数的限制。所以,如果Server主动关闭连接,也会出现端口耗尽的情况

CLOSING

不管如何CLOSING状态的TCP连接,即便没有收到自己发送FIN之后的ACK,也不会永久保持下去,保持多久取决于自己发送FIN时刻的RTT,然后RTT计算出的RTO按照最大的退避次数来退避,直到最终执行了固定次数的退避后,算出来的那个比较大的超时时间到期,然后TCP socket就销毁了。

四、TCP状态流转

image.png
上一篇下一篇

猜你喜欢

热点阅读