TCP的状态迁移

TCP的状态迁移不复杂。
TCP有11个状态,这些状态在TCP的三次握手和四次挥手里面都牵涉到。这些状态之间的迁移就是三次握手和四次挥手的过程。
再回顾一下三次握手和四次挥手的过程吧http://blog.csdn.net/u010902721/article/details/45955681
然后对照着看。
这里写图片描述
先看图下方的图例,实线表示客户端的状态迁移图,虚线表示服务器的状态迁移图。先分开来看再与三次握手、四次挥手对照着看就清晰多了。

客户端:

连接

  1. client初始处于CLOSED状态,调用connect()函数向服务器发送连接请求(应用进程主动打开,发:SYN)后进入SYN_SENT。
  2. 收到来自服务器的确认报文(收:SYN,ACK)后,回复ack(发:ACK),然后进入ESTABLISHED状态。
  3. 如果收到的报文(收:SYN)只有SYN没有ACK,客户端就进入了SYN_RCV状态,如果再收到RST报文就进入了LISTEN状态;如果应用程序关闭,则进入FIN_WAIT_1状态。这些都是非正常的状态迁移。

断开

  1. 调用close()函数发送FIN报文,进入FIN_WAIT_1状态,此时有三个路径,根据收到的确认报文来选择;
  2. 如果收到FIN,表示server几乎与client同时调用close()函数想结束连接。就进入了CLOSEING状态,然后收到ACK后进入了TIME_WAIT状态;
  3. 如果收到FIN+ACK,这就是三次挥手了,进入TIME_WAIT状态;
  4. 如果只收到ACK,表示server端还有要传输的数据,需要四次挥手才能断开。进入FIN_WAIT2状态。再收到FIN报文时表示server端也传输数据结束了,要断开连接。进入TIME_WAIT状态。
  5. 在TIME_WAIT状态等待2MSL的时间后进入了CLOSED状态。

服务器

连接

  1. 等待连接;
  2. 收到来自client的连接请求SYN,进入SYN收到状态;
  3. 收到ACK报文,进入ESTABLISHED状态。三次握手结束。

断开

  1. 收到FIN报文,表示客户端不再发送数据,请求断开,此时进入CLOSE_WAIT状态;
  2. 自己的数据发送完后发送FIN报文,进入LAST_ACK状态;
  3. 收到ACK后进入了CLOSED状态。

2MSL的TIME_WAIT状态

MSL(Maximum Segment Lifetime)是一个报文最大生存时间。为什么是2MSL呢?来自《TCP/IP详解》的解释是:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。这样可以让TCP再次发送最后的ACK以防止这个ACK丢失(另一端超时并重发最后一个FIN)。在这期间client的(IP地址:端口号)和server的(IP地址:端口号)均不可以被使用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值