IT技术互动交流平台

TCP 状态转移以及一些概念

来源:IT165收集  发布日期:2016-07-21 21:36:01

在 TCP/IP 协议当中,我们创建连接与终止连接的时候会涉及到内部状态的转换,其中有个全图很乱看不懂,就用下面简化的图来部分学习下内部状态的转换过程。

创建连接详细的说明如下

client 发起创建连接的时候,状态变成 SYN_SENTserver 收到了创建连接请求,并且返回 ACK 后状态变成 SYN_RCVDclient 收到 ACK 并且回复了 ACK 后状态变成 ESTABLISHEDserver 收到了 ACK 后状态也变成了 ESTABLISHED

断开连接详细的说明如下

client 发起主动关闭请求,状态变成了 FIN_WAIT_1server 收到请求并且回复 ACK 后,状态变成 CLOSE_WAITclient 收到 ACK 后,状态变成了 FIN_WAIT_2server 数据都传出完毕,发起真正关闭连接请求,状态变成 LAST_ACKclient 收到关闭请求,回复 ACK 后状态变成 TIME_WAITserver 收到 ACK 后,状态变成 CLOSED

一些概念的解释

TIME_WAIT 其实就是 2倍的 MSL 时间,等待超过时间后 client 的状态也会变成 CLOSEDMSL,MSL指的是报文段的最大生存时间,如果报文段在网络活动了MSL时间,还没有被接收,那么会被丢弃。关于MSL的大小,RFC 793协议中给出的建议是两分钟,不过实际上不同的操作系统可能有不同的设置。

TIME_WAIT 存在的必要,以及等待时间为什么是 2倍的 MSL ?

举个例子:主动关闭的一方收到被动关闭的一方发出的FIN包后,回应ACK包,同时进入TIME_WAIT状态,但是因为网络原因,主动关闭的一 方发送的这个ACK包很可能延迟,从而触发被动连接一方重传FIN包。极端情况下,这一去一回,就是两倍的MSL时长。如果主动关闭的一方跳过 TIME_WAIT直接进入CLOSED,或者在TIME_WAIT停留的时长不足两倍的MSL,那么当被动关闭的一方早先发出的延迟包到达后,就可能出 现类似下面的问题:

旧的TCP连接已经不存在了,系统此时只能返回RST包新的TCP连接被建立起来了,延迟包可能干扰新的连接

不管是哪种情况都会让TCP不再可靠,所以TIME_WAIT状态有存在的必要性。

Tag标签: 状态   概念  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规