`

TCP关闭过程

 
阅读更多

状态迁移

1. SO_LINGER/ SO_REUSEADDR
    TCP正常的关闭过程如下(四次握手过程):
(FIN_WAIT_1) A       ---FIN--->       B(CLOSE_WAIT)
(FIN_WAIT_2) A       <--ACK--       B(CLOSE_WAIT)
(TIME_WAIT)A        <--FIN----       B(LAST_ACK)
(TIME_WAIT)A        ---ACK->       B(CLOSED)


Ø A端首先发送一个FIN请求给B端,要求关闭,发送后A段的TCP状态变更为FIN_WAIT_1,接收到FIN请求后B端的TCP状态变更为CLOSE_WAIT
Ø B接收到ACK请求后,B回一个ACK给A端,确认接收到的FIN请求,接收到ACK请求后,A端的TCP状态变更为为FIN_WAIT_2。
Ø B端再发送一个FIN请求给A端,与连接过程的3次握手过程不一样,这个FIN请求之所以并不是与上一个请求一起发送,之所以如此处理,是因为TCP是双 通道的,允许在发送ACK请求后,并不马上发FIN请求,即只关闭A到B端的数据流,仍然允许B端到A端的数据流。这个ACK请求发送之后,B端的TCP状态变更为LAST_ACK,A端的状态变更为TIME_WAIT。
Ø A端接收到B端的FIN请求后,再回B端一个ACK信息,对上一个FIN请求进行确认,到此时B端状态变更为CLOSED,Socket可以关闭。

 


除了如上正常的关闭(优雅关闭)之外,TCP还提供了另外一种非优雅的关闭方式RST(Reset)
(CLOSED) A ---RST--> B (CLOSED)
Ø A端发送RST状态之后,TCP进入CLOSED状态,B端接收到RST后,也即可进入CLOSED状态。
在第一种关闭方式上(优雅关闭),非常遗憾,A端在最后发送一个ACK请求后,并不能马上将该Socket回收,因为A并不能确定B一定能够接收到这个ACK请求,因此A端必须对这个Socket维持TIME_WAIT状态2MSL(MSL=Max Segment Lifetime,取决于操作系统和TCP实现,该值为30秒、60秒或2分钟)。如果A端是客户端,这并不会成为问题,但如果A端是服务端,那就很危险了,如果连接的Socket非常多,而又维持如此多的TIME_WAIT状态的话,那么有可能会将Socket耗尽(报Too Many Open File)。
服务端为了解决这个问题,可选择的方式有三种:
Ø 保证由客户端主动发起关闭(即做为B端)
Ø 关闭的时候使用RST的方式
Ø 对处于TIME_WAIT状态的TCP允许重用
一般我们当然最好是选择第一种方式,实在没有办法的时候,我们可以使用SO_LINGER选择第二种方式,使用SO_REUSEADDR选择第三种方式

分享到:
评论

相关推荐

    tcp_tcp协议;_OneNET平台_onenet_newpfu_tcp连接onenet_

    5. 断开连接:当不再需要连接时,执行四次挥手的TCP关闭过程,释放资源。 在OneNET平台上,你可以通过API或者OneNET提供的SDK来访问和管理设备。这些工具可以帮助你接收设备数据、发送控制指令,甚至构建复杂的业务...

    C#实现TCP客户端服务端之间的通讯

    为了确保双方都完成数据发送,通常会采用四次挥手的TCP关闭过程。 在C#TCP通讯DEMO中,我们可以看到以下几个关键类和方法的实现: - `TcpClient`和`TcpListener`:这两个类分别代表了TCP客户端和服务端。`...

    tcp连接建立-关闭-窗口-慢启动1

    本文将深入探讨TCP连接的建立、关闭过程,以及窗口机制和慢启动的概念。 1. **TCP连接建立** - 通常被称为“三次握手”(Three-Way Handshake)。在TCP连接开始时,客户端(Source Port)发送一个SYN(同步序列编号...

    TCP握手详细过程以及抓包分析

    本文将深入探讨TCP连接的建立过程,即著名的“三次握手”,以及TCP连接的终止,通常被称为“四次挥手”。同时,我们还将简要介绍抓包分析的概念,这对于理解网络通信的实际过程至关重要。 TCP连接的建立始于客户端...

    两个TCP应用同时相互连接和关闭、抓包数据

    本话题将深入探讨两个TCP应用如何同时进行连接和关闭过程,以及如何通过抓包数据来分析这一过程。抓包数据在网络诊断和问题排查中起到至关重要的作用,它能直观地展示网络通信的细节。 首先,TCP连接的建立通常遵循...

    详解TCP协议建立连接全过程状态变迁图.doc

    TCP通过三次握手建立连接,确保数据的可靠传输,而其状态变迁图则清晰地展示了这个过程。本文将深入解析TCP协议建立连接的全过程,以及涉及到的状态变迁。 首先,TCP连接的建立始于客户端,它通过发送一个SYN(同步...

    TCP服务端和TCP客户端工具软件

    这些工具可能简化了TCP服务端和客户端的设置过程,使得非专业开发者也能轻松进行网络通信测试。 总的来说,理解TCP服务端和客户端的工作机制对于网络编程和网络故障排查至关重要。熟练掌握相关工具的使用,可以帮助...

    Wireshark分析TCP连接断开过程分析与总结.docx

    Wireshark 分析 TCP 连接断开过程分析与总结 Wireshark 是一个功能强大的网络协议分析工具,能够对 TCP 连接断开过程进行详细的分析和总结。下面我们将对 Wireshark 分析 TCP 连接断开过程进行详细的分析和总结。 ...

    MODBUS-TCP.rar_TCP通信标准_modbus TCP_modbus 标准_modbus-tcp_modbus标准

    3. **错误检测**:MODBUS-TCP使用CRC(循环冗余校验)来检测数据传输过程中的错误。TCP协议本身也提供了错误检测和重传机制,进一步增强了数据传输的可靠性。 4. **连接管理**:TCP的三次握手建立连接,四次挥手...

    TCP调试助手源码_tcp助手源码_TCP助手源代码_TCP助手源码_

    7. **连接管理**:TCP提供全双工通信,支持半关闭状态,允许一方结束数据传输而不影响另一方的数据传输。 8. **选项与标志**:TCP头部包含各种选项和标志位,如Nagle算法、TCP窗口缩放、时间戳等,这些可以优化协议...

    利用ethereal分析tcp建立与释放过程

    ttcp允许我们在两端分别设置发送和接收,从而观察TCP连接的建立和关闭过程。 总的来说,利用Ethereal进行网络封包分析,可以帮助我们更好地理解和诊断TCP连接的问题,同时加深对TCP协议本身的理解。通过实践操作,...

    TCPTrace-TCP追踪

    2. **连接跟踪**:TCPTrace可以追踪TCP连接的完整生命周期,包括连接建立、数据交换和连接关闭的全过程。 3. **报文分析**:它能解析TCP报文头,揭示TCP选项和标志,如SYN、ACK、FIN、RST等,帮助分析连接状态和...

    Window下杀掉TCP连接

    9. **TCP/IP配置**:了解TCP/IP协议的工作原理,例如熟知的三次握手和四次挥手过程,有助于理解为何有时候需要手动关闭TCP连接。 掌握这些方法和知识,有助于你在遇到需要强制结束TCP连接的情况时,能够迅速有效地...

    tcp转发工具,中转TCP请求

    这个过程中,服务器需要正确处理TCP连接的建立、维护和关闭,确保数据的完整性和顺序。 4. **源码解析**:Java源码提供了实现TCP转发的具体逻辑。通常,这包括使用Java的`ServerSocket`类创建服务器端监听,使用`...

    点对点简单控制(可关机)

    5. **断开连接**:在完成控制操作后,客户端和服务器可以通过四次挥手的TCP关闭过程断开连接。当然,如果需要持续监控或控制,连接也可以保持开放。 值得注意的是,为了确保安全,远程控制功能需要严谨的安全措施,...

    wireshake抓包分析tcp及http过程详解.doc

    TCP 连接关闭过程 在 HTTP 请求和响应完成后,客户端和服务器需要关闭 TCP 连接。关闭过程需要经过三次握手。首先,客户端向服务器发送 FIN 报文,标志位 FIN 置 1。然后,服务器向客户端回复确认包(ACK),标志位...

    TCP关闭问题详细介绍

    四次挥手是TCP关闭连接的过程,用于保证数据的完整传输和资源的正常释放。整个过程涉及四次数据包的交互: 1. 当客户端或服务器希望关闭连接时,会发送一个带有终止位(FIN)的数据包给对方,表示一方没有数据要...

    STM32F103控制 W5500 作为 TCP 客户端连接到 TCP 服务器—W5500STM32F103

    在项目实施过程中,开发者可能需要使用到如lwIP或uIP这样的轻量级TCP/IP协议栈库,这些库为嵌入式系统提供了实现TCP/IP功能的支持。此外,开发过程中还需要对网络编程有深入理解,例如端口号的分配、IP地址的解析等...

    tcp.rar_sendto TCP_tcp 数据包

    在这个场景中,我们将关注如何使用`sendto()`函数来发送TCP数据包,以及这个过程中的关键知识点。 首先,`sendto()`函数是用于UDP(用户数据报协议)的,它允许程序员指定目标地址和端口,直接发送数据。然而,在...

Global site tag (gtag.js) - Google Analytics