`
linmomo02
  • 浏览: 181844 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

tcp 状态详解

tcp 
阅读更多

对tcp的几种状态一直比较模糊,在实际应用中对这几种状态有个充分的理解还是很重要的。


tcp链接建立和断开的过程如下所示:




1 、建立连接协议(三次握手)
( 1 )客户端发送一个带 SYN 标志的 TCP 报文到服务器。这是三次握手过程中的报文 1 。
( 2 ) 服务器端回应客户端的,这是三次握手中的第 2 个报文,这个报文同时带 ACK 标志和 SYN 标志。因此它表示对刚才客户端 SYN 报文的回应;同时又标志 SYN 给客户端,询问客户端是否准备好进行数据通讯。
( 3 ) 客户必须再次回应服务段一个 ACK 报文,这是报文段 3 。


[size=14px; background-color: #e9e9e9; color: #333333;]2、连接终止协议(四次握手)[/size] [size=14px; background-color: #e9e9e9; color: #333333;]   由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。[/size] [size=14px; background-color: #e9e9e9; color: #333333;] (1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。[/size] [size=14px; background-color: #e9e9e9; color: #333333;] (2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。[/size] [size=14px; background-color: #e9e9e9; color: #333333;] (3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。[/size] [size=14px; background-color: #e9e9e9; color: #333333;] (4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。[/size]



CLOSED: 这个没什么好说的了,表示初始状态。
LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个 SOCKET 处于监听状态,可以接受连接了。
SYN_RCVD: 这个状态表示接受到了 SYN 报文,在正常情况下,这个状态是服务器端的 SOCKET 在建立 TCP 连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用 netstat 你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次 TCP 握手过程中最后一个 ACK 报文不予发送。因此这种状态时,当收到客户端的 ACK 报文后,它会进入到 ESTABLISHED 状态。
SYN_SENT: 这个状态与 SYN_RCVD 遥想呼应,当客户端 SOCKET 执行 CONNECT 连接时,它首先发送 SYN 报文,因此也随即它会进入到了 SYN_SENT 状态,并等待服务端的发送三次握手中的第 2 个报文。 SYN_SENT 状态表示客户端已发送 SYN 报文。
ESTABLISHED :这个容易理解了,表示连接已经建立了。
FIN_WAIT_1: 这个状态要好好解释一下,其实 FIN_WAIT_1 和 FIN_WAIT_2 状态的真正含义都是表示等待对方的 FIN 报文。而这两种状态的区别是: FIN_WAIT_1 状态实际上是当 SOCKET 在 ESTABLISHED 状态时,它想主动关闭连接,向对方发送了 FIN 报文,此时该 SOCKET 即进入到 FIN_WAIT_1 状态。而当对方回应 ACK 报文后,则进入到 FIN_WAIT_2 状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应 ACK 报文,所以 FIN_WAIT_1 状态一般是比较难见到的,而 FIN_WAIT_2 状态还有时常常可以用 netstat 看到。
FIN_WAIT_2 :上面已经详细解释了这种状态,实际上 FIN_WAIT_2 状态下的 SOCKET ,表示半连接,也即有一方要求 close 连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。
TIME_WAIT: 表示收到了对方的 FIN 报文,并发送出了 ACK 报文,就等 2MSL 后即可回到 CLOSED 可用状态了。如果 FIN_WAIT_1 状态下,收到了对方同时带 FIN 标志和 ACK 标志的报文时,可以直接进入到 TIME_WAIT 状态,而无须经过 FIN_WAIT_2 状态。
CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送 FIN 报文后,按理来说是应该先收到(或同时收到)对方的 ACK 报文,再收到对方的 FIN 报文。但是 CLOSING 状态表示你发送 FIN 报文后,并没有收到对方的 ACK 报文,反而却也收到了对方的 FIN 报文。什么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时 close 一个 SOCKET 的话,那么就出现了双方同时发送 FIN 报文的情况,也即会出现 CLOSING 状态,表示双方都正在关闭 SOCKET 连接。
CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方 close 一个 SOCKET 后发送 FIN 报文给自己,你系统毫无疑问地会回应一个 ACK 报文给对方,此时则进入到 CLOSE_WAIT 状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close 这个 SOCKET ,发送 FIN 报文给对方,也即关闭连接。所以你在 CLOSE_WAIT 状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送 FIN 报文后,最后等待对方的 ACK 报文。当收到 ACK 报文后,也即可以进入到 CLOSED 可用状态了。
最后有 2 个问题的回答,我自己分析后的结论(不一定保证 100% 正确)
1、 为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的 LISTEN 状态下的 SOCKET 当收到 SYN 报文的建连请求后,它可以把 ACK 和 SYN ( ACK 起应答作用,而 SYN 起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的 FIN 报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭 SOCKET, 也即你可能还需要发送一些数据给对方之后,再发送 FIN 报文给对方来表示你同意现在可以关闭连接了,所以它这里的 ACK 报文和 FIN 报文多数情况下都是分开发送的。
2、 为什么 TIME_WAIT 状态还需要等 2MSL 后才能返回到 CLOSED 状态?
这是因为:虽然双方都同意关闭连接了,而且握手的 4 个报文也都协调和发送完毕,按理可以直接回到 CLOSED 状态(就好比从 SYN_SEND 状态到 ESTABLISH 状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的 ACK 报文会一定被对方收到,因此对方处于 LAST_ACK 状态下的 SOCKET 可能会因为超时未收到 ACK 报文,而重发 FIN 报文,所以这个 TIME_WAIT 状态的作用就是用来重发可能丢失的 ACK 报文,并保证于此。

https 工作原理参见:http://www.cnblogs.com/ttltry-air/archive/2012/08/20/2647898.html

 

  • 大小: 26.7 KB
分享到:
评论

相关推荐

    tcp连接状态详解 描述了tcp协议常用的命令

    TCP 连接状态详解 TCP 连接状态是指在 TCP 协议中,连接的不同阶段所对应的状态。这些状态包括 LISTEN、SYN-SENT、SYN-RECEIVED、ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、CLOSE-WAIT、CLOSING、LAST-ACK、TIME-WAIT...

    TCP-IP详解(三卷全)

    《TCP/IP详解》是网络通信领域的一部经典之作,由W. Richard Stevens撰写,共分为三卷,全面而深入地探讨了TCP/IP协议族的各个方面。这套书籍是网络工程师、系统管理员以及对网络技术感兴趣的学者不可或缺的参考资料...

    tcp-ip详解卷1:协议.TCP-IP详解卷2:TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议

    《TCP/IP详解》系列是网络通信领域的经典之作,由W. Richard Stevens著,全面而深入地探讨了TCP/IP协议族的各个层面。本系列分为三卷,每卷都包含了丰富的技术知识,对于理解网络通信机制及其应用至关重要。 卷1:...

    TCP-IP详解(卷一、二、三)超清pdf电子版

    深入TCP/IP实现细节,TCP连接的建立和拆除过程中“三次握手”和“四次挥手”的机制保证了通信双方的状态同步和数据的完整传输。拥塞控制算法如慢启动、拥塞避免等策略,则是防止网络过载和保障通信质量的重要手段。...

    TCP-IP详解卷[1,2,3]卷.完整版.中文版.pdf

    《TCP/IP详解》是计算机网络领域的一本经典著作,由W. Richard Stevens撰写,全面而深入地探讨了TCP/IP协议族的各个方面。该书分为三卷,分别涵盖了网络接口层、互联层和传输层,以及应用层的重要概念和技术。这里...

    TCP状态机详细描述

    ### TCP状态机详解 #### 一、引言 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。本文旨在深入解析TCP状态机的工作原理及其背后的逻辑,以便读者能够更好地理解和...

    详解10种TCP连接状态详解.zip

    详解10种TCP连接状态详解.zip LISTEN服务器在等待进入呼叫 CLOSED无连接是活动的或正在进行 SYN_SENT应用已经开始,打开一个连接 ESTABLISHED 表示正常数据传输状态 ...

    TCP状态转换图详解.pdf

    TCP状态转换图详解.pdf

    TCP-IP详解卷三

    2.5 T/TCP的扩展状态 28 2.6 小结 30 第3章 T/TCP使用举例 31 3.1 概述 31 3.2 客户重新启动 31 3.3 常规的T/TCP事务 33 3.4 服务器收到过时的重复SYN 34 3.5 服务器重启动 35 3.6 请求或应答超出报文段最大长度MSS ...

    modbus_tcp_详解

    ### MODBUS TCP详解 #### 开放型MODBUS-TCP规范概览 MODBUS TCP是一种将传统的MODBUS协议与TCP/IP网络结合的通信标准,旨在提供一种高效、可靠且易于实施的自动化设备通信方式。该规范最初由施耐德电气公司的Andy ...

    TCP有限状态机

    ### TCP有限状态机详解 #### 一、引言 TCP(传输控制协议)是一种面向连接的、可靠...了解TCP状态机对于理解TCP协议的工作原理至关重要,尤其对于网络工程师而言,掌握这些基础知识对于解决实际网络问题非常有帮助。

    TCP/IP详解 卷1完整版

    非扫描版TCP/IP详解卷一,你值得拥有: 《TCP/IP详解,卷1:协议》是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者用Lawrence Berkeley实验室的tcpdump程序...

    TCP/IP协议详解全三卷 下载

    《TCP/IP协议详解》这套书籍分为三卷,详细地介绍了TCP/IP协议的各个方面。第一卷《TCP/IP协议》主要关注协议层面,包括网络接口层(如以太网)、互联网层(IP协议、ICMP、ARP/RARP)和传输层(TCP、UDP),以及它们...

    tcp协议详解及其规范

    TCP在实际应用中可能遇到各种问题,如延迟开窗(Slow Start)、TCP中间宿主机问题、TIME_WAIT状态等,这些问题都需要通过理解和优化TCP机制来解决。 综上所述,TCP协议的详解涵盖了连接建立、数据传输、可靠性保障...

    TCP/IP详解(卷一)

    7. **TCP状态机**:详细展示了TCP连接在不同阶段的状态转换,包括CLOSED、LISTEN、SYN_SENT、SYN_RCVD、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、CLOSING、LAST_ACK和TIME_WAIT等状态。 8. **UDP的应用**...

    tcp ip 详解第三卷

    《TCP/IP详解第三卷》是深入理解TCP协议及其相关应用的重要教材,对于网络通信和互联网技术的从业者或学习者来说,具有极高的参考价值。本书主要涵盖了TCP事务协议、HTTP、NNTP以及UNIX域协议等内容,以下是这些知识...

    pythonTCP协议详解.doc

    Python TCP 协议详解 TCP 协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的 RFC 793 定义。它需要经过创建连接、数据传送、终止连接三个步骤。 一、TCP ...

Global site tag (gtag.js) - Google Analytics