首页 > 其他 > 详细

TCP状态图

时间:2021-05-22 10:42:49      阅读:31      评论:0      收藏:0      [点我收藏+]

技术分享图片

状态 解释
CLOSED 表示初始状态
LISTEN 表示服务器端的某个SOCKET处于监听状态,可以接受连接了
SYN_RCVD 表示接受到了SYN报文,此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。
SYN_SENT SYN_SENT状态表示客户端已发送SYN报文,这个状态与SYN_RCVD遥想呼应
ESTABLISHED 表示连接已经建立了
FIN_WAIT_1 FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即 进入到FIN_WAIT_1状态
FIN_WAIT_2 主动发送FIN报文的一方,等待对方回应ACK报文后,则进入到FIN_WAIT_2状态,这种情况也叫做半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。
TIME_WAIT 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了,如果FIN_WAIT_1状态下,收到了对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSING 实际情况中应该是很少见表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文
CLOSE_WAIT 当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对 方,此时则进入到CLOSE_WAIT状态
LAST_ACK 被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了
  • 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

    • 这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一 个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未 必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文 和FIN报文多数情况下都是分开发送的。
  • 为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

    • 这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到 ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于 LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的 ACK报文。

TCP状态图

原文:https://www.cnblogs.com/lodger47/p/14797832.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!