`

TCP协议握手协商通信详解

阅读更多

1、建立连接协议(三次握手)

  (1)客户端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1.

  (2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯。

  (3) 客户必须再次回应服务段一个ACK报文,这是报文段3.

  2、连接终止协议(四次握手)

  由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

  (1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。

  (2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。

  (3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。

  (4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

  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报文.

分享到:
评论

相关推荐

    利用Ethereal分析TCP协议

    通过本次实验,我们不仅学会了如何使用Ethereal捕获和分析TCP数据包,还深入了解了TCP协议的关键机制,包括连接建立过程中的三次握手、数据传输过程中的序号和确认号机制、重传机制以及流量控制与拥塞控制机制。...

    TCP三次握手四次挥手详解

    **TCP**(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。为了确保连接的可靠性,在TCP建立连接时,采用了三次握手的方式。 ##### 第一次握手 - **发起者**...

    tcp协议 看了就明白tcp是怎么一回事了

    ### TCP协议详解 #### 一、TCP协议的基本概念与工作机制 **TCP(Transmission Control Protocol,传输控制协议)**是一种面向连接的、可靠的、基于字节流的传输层通信协议。在设计之初,TCP的主要目标是尽可能提高...

    TCP握手过程

    在深入探讨TCP握手过程之前,我们首先需要理解TCP(Transmission Control Protocol)协议的基本概念及其在网络通信中的作用。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,设计用于在不可靠的互联网络...

    TCP(传输控制协议)啊啊

    《TCP传输控制协议详解》 TCP(Transmission Control Protocol),即传输控制协议,是网络通信中的一种基础协议,它为两台计算机之间的数据交换提供可靠、有序的连接。TCP的连接和建立过程遵循客户服务器模式,其中...

    TCP三次握手及会话劫持原理与实例

    ### TCP三次握手过程详解 #### 一、三次握手的基本概念 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。为了确保数据传输的可靠性和准确性,TCP采用了一种称为“三次握手”的机制来...

    TCP头部选项功能详解

    TCP(Transmission Control Protocol)作为一种面向连接的、可靠的、基于字节流的传输层通信协议,在互联网中起着至关重要的作用。为了应对日益复杂的网络环境以及提高服务质量,TCP头部设计了一系列可选字段(即...

    TCP 三次握手和四次挥手

    ### TCP 三次握手详解 #### 一、三次握手的基本概念 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过三次握手来建立一个连接,这一过程是TCP...

    TCP与TLS数据报文抓包

    1、生成 wireshark 工具可读取的 capture.pcap 抓包文件; 2、学习 “DNS解析步骤”报文结构; 3、学习 “TCP三次握手”报文结构;...一文详解 TCP与UDP 协议 https://xiaxl.blog.csdn.net/article/details/106223354

    HTTPS协议详解(一):HTTPS基础知识1

    1. **握手过程**:在建立连接时,客户端和服务器通过握手协议协商加密算法、生成会话密钥,并进行身份验证。握手过程包括多个步骤,如客户端发送加密方法、随机数等,服务器回应证书和加密方法选择等。 2. **加密...

    RTMP协议详解

    2. **RTMP连接建立**:基于已建立的TCP连接,客户端与服务器通过RTMP协议进行握手,协商连接参数。 3. **建立流媒体连接**:客户端通过`NetConnection`命令建立与服务器的连接。 4. **建立流**:客户端通过`...

    SSL协议详解.pdf

    2. **SSL握手层协议**:主要用于协商加密算法、加密密钥等参数,以及进行身份认证。握手协议确保在实际数据传输前完成这些准备工作,从而保证应用协议数据的安全性。 #### 四、SSL协议的应用 - **Web安全**:最...

    SSL&TLS 协议详解

    2. SSL/TLS握手协议(SSL Handshake Protocol / TLS Handshake):握手协议用于建立安全连接,包括身份认证、加密算法协商和共享密钥交换等步骤。在开始实际数据传输之前,客户端和服务器会通过一系列消息交换来完成...

    TCP.pptx交流

    TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,设计初衷是为了在网络中提供可靠的数据传输服务。其核心特性包括连接管理、流量控制、拥塞控制以及数据...

    WebSocket协议手册(rfc6455中文翻译).pdf

    WebSocket协议手册(rfc6455中文翻译)详细介绍了WebSocket通信协议的相关知识点,以下是手册中涵盖的知识点详解: 1. WebSocket协议概述: WebSocket是一种在单个TCP连接上进行全双工通信的协议,可以实现实时的双向...

    TCP IP技术培训

    - **TCP/IP详解卷1:协议**:该书详细介绍了TCP/IP协议族的工作原理和技术细节,是理解TCP/IP的重要参考书籍之一。 #### 二、TCP/IP协议栈结构及作用 - **提纲**:TCP/IP协议栈由多层构成,每一层都有其特定的功能...

    WebSocket 用法详解.docx

    在握手期间,客户端和服务器将协商使用的协议版本、支持的子协议、支持的扩展选项等。一旦握手完成,连接将保持打开状态,客户端和服务器就可以在连接上实时地传递数据。 WebSocket 协议使用的是双向数据传输,即...

    SSL协议详解

    2. SSL握手协议(SSL Handshake Protocol):握手协议负责建立安全连接,包括客户端和服务器的身份认证、加密算法的协商以及共享密钥的交换。此过程中,客户端首先发送“Hello”消息,服务器回应并可能提供生成主...

    SSL协议与SET协议分析

    - **SSL握手协议**:用于在客户端和服务器之间进行身份认证,并协商加密算法和密钥。 - **SSL更改密码说明协议**:用于通知对方密码已被更改。 - **SSL警告协议**:用于在发生错误时向另一方发出警告。 - **SSL...

    tcpip详解的课件

    TCP是一种面向连接的协议,因此连接的建立和终止是TCP通信的重要组成部分。 ##### 连接建立 - **三次握手**:TCP连接建立通常采用三次握手的方式。第一次握手由客户端发起连接请求(发送SYN标志位设为1的数据包);...

Global site tag (gtag.js) - Google Analytics