TCP套接字状态变化梳理

本文深入剖析TCP协议在数据传输中的套接字状态变化,包括连接建立、数据传输和断开过程。重点讨论了三次握手、四次挥手以及TIME_WAIT状态的作用。同时,提到了在双方同时断开连接时出现的CLOSING状态,解释了其状态转换逻辑。理解这些状态对于网络编程和问题排查至关重要。
摘要由CSDN通过智能技术生成

        Linux对于数据传输,传输层提供了可靠的TCP协议。该协议的可靠性主要体现在其许多特点,如传输数据时需建立连接、窗口检测、超速重传、乱序重排等。本篇主要就TCP数据传输过程中的套接字状态变化进行分析。

        TCP正常的数据连接建立(三次握手)、数据传输、及连接断开(四次挥手)中套接字的状态入下图所示。

        上图中清晰的描述了TCP协议在连接、数据传输、断开时,客户端、服务端的套接字状态的详细变化。需要注意的有三点如下:

        1、客户端的套接字状态的改变是发生在一个套接字身上;而服务端套接字的变化状态是发生在两个套接字,一个为专门接收连接的套接字(状态一直会是:LISTEN),另一个是在服务端接收到SYN连接包(应用层程序调用accep函数)时内核程序返回的一个专门处理该连接的套接字(该开始状态为:SYN_RECV)。

        2、当连接成功之后两端的状态都为ESTABLISHED,此次两端都可以发送、接收数据。当一端发送FIN包(连接时只能是客户端发送SYN包,断开时可以是任意一端发送FIN包)时,表明该端数据发送已经完成,之后不能发送数据但可以接收对端发送的数据。

        3、TIME_WAIT状态是为了避免最后发送的ACK包在传输时丢失,导致对端状态一直不能关闭。TIME_WAIT状态会持续2MSL后更新为CLOSE状态。

        在学习Linux内核协议栈代码时发现套接字在除了上述给出的状态外,还存在一种状态为CLOSING状态。该状态出现的场景比较特殊,当客户端与服务端几乎同时打算断开连接(发送FIN包)时会出现。状态变化如下图:

        注意:当两端同时发送FIN包时,说明两端的数据包已完全发送成功(发送的数据包都收到了应答,后续都无需进行数据传输)。

        当发送完FIN包后(状态变为FIN_WAIT1)期望收到对端的ACK包,当收到对端的FIN包时说明对方也希望断开连接,此时该端状态变为CLOSING(而不会变为FIN_WAIT2状态),当再次收到开始发送的FIN包的应答ACK包时,该端状态再次变为TIME_WAIT,等待2MSL后变为CLOSE状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值