TCP CLOSE流程

TCP CLOSE流程

特征

u       发送一个FIN报文表示结束本端数据的发送,但是还可以接收数据,称之为半关闭

u       TCP是一个全双工的协议,两端全部close才完成了一个连接的关闭;

u       首先发起close(发送FIN),我们称之为主动关闭,对端的close我们称为被动关闭;

u       同时关闭;

 

半关闭

发送一个FIN报文表示结束本端数据的发送,继续接收对端发送的数据的状态,我们称之为半关闭。通过调用shutdown可以实现这个目的。

 

主动关闭

前提

应用层知道连接的存在:1、客户端已经发起connect2、服务器已经accept一个连接

 

初品

TCP各状态下,主动关闭时状态迁移分析:

1、  本端还没有收到对端的SYN报文报文(状态为CLOSED, LISTEN, SYN_SENT),直接释放TCP连接和SOCKET资源;

2、  本端已经接收到对端的SYN报文,但是之前没有关闭连接的动作(SYN_RCVD, ESTABLISHED状态),发送FIN报文给对端,状态转为FIN_WAIT_1

3、  对端已经关闭连接(half-close),本端还没有关闭(CLOSE_WAIT状态),发送FIN报文给对端,状态转为LAST_ACK

4、  本端已经发送FIN报文,连接还没有完全关闭(其他状态),保持状态不变,不做任何操作。

CLOSED

LISTEN

SYN_RCVD

TIME_WAIT

 

CLOSING

 

FIN_WAIT_2

LAST_ACK

 

ESTABLISHED

CLOSE_WAIT

 

FIN_WAIT_1

SYN_SENT

细尝

 

情况1已经完成了关闭TCP连接的过程,情况3属于被动关闭,在后续章节再仔细分析,情况4没有改变状态,因此就情况2后的细节进行分析。

现在连接已经处于FIN_WAIT_1状态,那么:

1、  接收到FINACK报文,进入FIN_WAIT_2状态,等待对端关闭连接;

2、  接收对端的FIN/ACK报文, 发送ACK,进入TIME_WAIT状态,2MSL时间后丢弃连接(先处理ACK,再处理FIN);

3、  接收到对端的FIN,回ACK,进入CLOSING状态(同时关闭,后续章节分析);

4、  FIN发送超时,连续若干次发送失败,丢弃连接;

5、  接收到对端的RST报文,丢弃连接。

CLOSED

TIME_WAIT

 

CLOSING

 

FIN_WAIT_2

FIN_WAIT_1

深究

Ø      FIN_WAIT_2状态

FIN_WAIT_2是一个等待状态,可能:

1、  对端仍有数据需要发送,等待接收对端的数据;

2、  对端发送FIN报文,回ACK,进入TIME_WAIT状态;

3、  对端因意外崩溃导致不能发送FIN报文过来,连接一直僵死到inactive超时为止;

如果在一个系统资源紧张的系统中,出现情况2是不可饶恕的问题。如何解决?启动2MSL定时器,在这段时间还没有接收到对端的FIN报文直接丢弃连接。

Ø      2MSL等待状态

概念:TIME_WAIT状态又成为  2MSL状态,一个主动关闭的连接在进入TIME_WAIT状态后,必须等待2MSL的时间后再关闭,防止最后发送的ACK丢失。

 

注意点:

12MSL是基于IP报文的跳数,而不是时间;

2、当TCP处于2MSL状态,不可以创建同一连接;

 

 

被动关闭

 

这里研究接收到对端发送过来的FIN报文处理的情况,包括但不限于被动关闭:

1、  本端没有发送和接收过FIN报文(SYN_RCVDESTABLISHED状态),回ACK,进入CLOSE_WAIT状态,等待应用程序关闭;

2、  本端已经发送过FIN报文但没有被确认(FIN_WAIT_1状态),进入CLOSING状态(同时关闭);

3、  本端已经发送过FIN报文并被确认(FIN_WAIT_2状态),进入TIME_WAIT状态;

4、  连接已主动关闭但没有丢弃(TIME_WAIT状态),说明对端没有收到ACK,重传ACK,并重启2MSL定时器;

5、  其他状态下不处理。

CLOSED

LISTEN

SYN_RCVD

TIME_WAIT

 

CLOSING

 

FIN_WAIT_2

LAST_ACK

 

ESTABLISHED

CLOSE_WAIT

 

FIN_WAIT_1

SYN_SENT

 

总结

为了方便理解状态的变迁,不妨认为SYN报文表明发送者想发送数据,FIN报文表明发送者停止发送报文。所以SYN_SENT状态只能主动发送FIN,而SYN_RCVD状态下即可发送FIN,也可以接收FIN

 

 

参考资料:

1TCP/IP详解卷1:协议

2TCP/IP详解卷2:实现 

 

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。其传输流程主要包括连接建立、数据传输和连接释放三个阶段,具体如下: 1. **连接建立(三次握手)**: - 客户端发送 SYN 报文(SYN=1, seq=x)给服务器,进入 SYN_SENT 状态。 - 服务器收到后回复 SYN+ACK 报文(SYN=1, ACK=1, seq=y, ack=x+1),进入 SYN_RCVD 状态。 - 客户端收到后发送 ACK 报文(ACK=1, seq=x+1, ack=y+1),双方进入 ESTABLISHED 状态,连接建立成功。 2. **数据传输**: - 双方通过已建立的连接进行可靠的数据传输。 - 使用序列号和确认应答机制保证数据顺序与完整性。 - 采用滑动窗口机制实现流量控制,防止接收方缓冲区溢出。 - 使用拥塞控制算法(如慢启动、拥塞避免等)动态调整发送速率,避免网络过载。 - 若数据包丢失或出错,通过超时重传或快速重传机制进行恢复。 3. **连接释放(四次挥手)**: - 主动关闭方(如客户端)发送 FIN 报文(FIN=1, seq=u),进入 FIN_WAIT_1 状态。 - 被动关闭方(如服务器)回复 ACK 报文(ACK=1, seq=v, ack=u+1),进入 CLOSE_WAIT 状态;客户端收到后进入 FIN_WAIT_2。 - 服务器处理完数据后发送 FIN 报文(FIN=1, ACK=1, seq=w, ack=u+1),进入 LAST_ACK 状态。 - 客户端回复 ACK 报文(ACK=1, seq=u+1, ack=w+1),进入 TIME_WAIT 状态,等待 2MSL 后关闭连接;服务器收到后关闭连接。 ```python # 模拟 TCP 三次握手与四次挥手的状态变化(简化示意) def tcp_handshake_and_close(): print("Client sends SYN") # 第一次握手 print("Server receives SYN and sends SYN+ACK") # 第二次握手 print("Client receives SYN+ACK and sends ACK") # 第三次握手,连接建立 print("Connection Established - Data Transfer Begins") # 数据传输过程(略) print("Data is being transferred reliably...") print("Client sends FIN") # 第一次挥手 print("Server acknowledges with ACK") # 第二次挥手 print("Server sends FIN after data done") # 第三次挥手 print("Client acknowledges with ACK") # 第四次挥手 print("Connection Closed") tcp_handshake_and_close() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值