TCP状态机、标志位、序列号学习(一)

本文深入解析TCP连接的三次握手过程及各状态含义,包括SYN、ACK等标志位的作用,帮助读者理解TCP连接的建立与关闭流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       最简单的TCP状态机演变,当然是大学时期,几乎人人都知道的TCP三次握手:
       SYN->SYN,ACK->ACK
       很显然,上面的说法过于简单了,如果对TCP的理解,仅仅局限于此的话,很难在协议分析中获取更多的线索。很有必要详细了解一下,看这幅图先:

       很复杂的状态转换,是吧?三次握手,呵呵,理解的过于肤浅了,握手确实只有三步,但是握手之后了,如何说话?通信结束时,如何分手?这都是需要了解的。

      在了解如上的过程前,我们需要理解上图出现的各个状态的意义。

标志位

URG:头部中的紧急指针部分应该被检查
     此标志表示TCP包的紧急指针域(后面马上就要说到)有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据。

ACK:确认号应该被检查
     此标志表示应答域有效,就是说前面所说的TCP应答号将会包含在TCP数据包中;有两个取值:0和1,为1的时候表示应答域有效,反之为0。

PSH:接受者应该尽快将数据交给下一层处理
     这个标志位表示Push操作。所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队。

RST:连接应该被重置
     这个标志表示连接复位请求。用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包。

SYN:初始化一个连接
     表示同步序号,用来建立连接。SYN标志位和ACK标志位搭配使用,当连接请求的时候,SYN=1,ACK =0;连接被相应的时候,SYN=1,ACK=1;这个标志的数据包经常被用来进行端口扫描。扫描者发送一个只有SYN的数据包,如果对方主机响应了一个数据包回来,就表明这台主机存在这个端口;但是由于这种扫描方式只是进行TCP三次握手的第一次握手,因此这种扫描的成功将导致被扫描的机器消耗资源,因此一台安全的主机将会强制要求一个连接严格的进行TCP的三次握手。

FIN:发送方(应该是连接双方)完成数据传送
     表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP 数据包后,连接将被断开。这个标志的数据包也经常被用于进行端口扫描。当一个FIN标志的TCP数据包发送到一台计算机的特定端口,如果这台计算机响应了这个数据,并且反馈回来一个RST标志的TCP包,就表明这台计算机上没有打开这个端口,但是这台计算机是存在的;如果这台计算机没有反馈回来任何数据包,这就表明,这台被扫描的计算机存在这个端口。

PS:还有一种数据包,不包含任何标志位,可以称为Null数据包,计算机收到NULL的数据包(未试验),将回应一个FIN标志的TCP数据包。

状态机

LISTEN:侦听来自远方的TCP端口的连接请求

SYN-SENT:在发送连接请求后等待匹配的连接请求

SYN-RECEIVED:在收到和发送一个连接请求后等待对连接请求的确认

ESTABLISHED:代表一个打开的连接,数据可以传送给用户

FIN-WAIT-1:等待远程TCP的连接中断请求,或先前的连接中断请求的确认

FIN-WAIT-2:从远程TCP等待连接中断请求

CLOSE-WAIT:等待从本地用户发来的连接中断请求

CLOSING:等待远程TCP对连接中断的确认

LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认

TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认

CLOSED:没有任何连接状态

      好,现在我们可以对照上图来解释下TCP的状态演变过程了,分为三个阶段

阶段一:建立TCP连接
      TCP建立连接,也就是我们常说的三次握手,它需要三步完成。在 TCP 的三次握手中,发送第一个 SYN 的一端执行的是主动打开。而接收这个 SYN 并发回下一个 SYN 的另一端执行的是被动打开。
      结合最上面的TCP状态图,我们提取建立TCP连接的部分出来详细说明:

 

 

 

 

      详细步骤如下:
       第 1步:客户端向服务器发送一个同步数据包请求建立连接,该数据包中,初始序列号是客户端随机产生的一个值(假设为J),确认号是 0;参考报文:


      第 2步:服务器收到这个同步请求数据包后,会对客户端进行一个同步确认。这个数据包中,序列号是服务器随机产生的一个值(假设为K),确认号是客户端的初始序列号J+1;参考报文:


      第 3步:客户端收到这个同步确认数据包后,再对服务器进行一个确认。该数据包中,序列号是上一个同步请求数据包中的确认号值J+1,确认号是服务器的初始序列号K+1。参考报文:

阶段二:传输TCP数据

  百度文章有长度限制,担心出问题,见——TCP状态机、标志位、序列号学习(二)吧!

阶段三:关闭TCP连接

……

### TCP状态机图解及其工作原理 TCP协议的状态转换机制通过系列定义良好的状态来管理连接的生命周期。这些状态确保数据传输过程中的可靠性以及错误恢复能力。 #### 基本概念 TCP状态机的核心在于其有限数量的状态集合,每种状态对应特定的行为模式。以下是主要状态及其含义: - **CLOSED**: 初始状态,表示没有任何活动连接[^1]。 - **LISTEN**: 服务器进程等待来自客户端的新连接请求。 - **SYN_SENT**: 客户端发送同步(SYN)包以发起新连接。 - **SYN_RECEIVED**: 接收到对方发来的SYN包并已回应确认(ACK)。 - **ESTABLISHED**: 双方完成三次握手,进入正常的数据交换阶段。 - **FIN_WAIT_1**, **FIN_WAIT_2**, **CLOSING**, **TIME_WAIT**, 和其他关闭相关状态: 这些状态处理主动或被动关闭过程中可能出现的各种情况。 #### 工作流程概述 当两个设备之间建立TCP连接时,它们会经历所谓的“三步握手”过程: 1. 客户端向服务器发出带有 SYN (Synchronize Sequence Number)标志位设置为1 的初始序列号 x 的分组; 2. 服务端接收到该请求后返回自己的 SYN=y 同时附带对前面提到的那个x值加作为应答字段的内容给客户知道它已经准备好接受进步通信了; 3. 最终由原提出者再次回复个单纯只有acknowledgement标记置顶y+1即可宣告整个链路正式开通可以开始实际资料传递作业. 同样,在结束通讯前也需要遵循四次挥手的标准步骤逐步释放资源直至完全断开联系为止. ```python def tcp_handshake(): """ Simulate a basic three-way handshake process. This function demonstrates how client and server exchange sequence numbers during connection establishment. """ import socket # Create a dummy socket object for demonstration purposes only sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: # Client sends its initial sequence number 'ISN' ISN_client = generate_random_sequence_number() # Server receives request from client with ISN=client_ISN received_ISN_server_side = receive_packet_from_network() # Server responds back acknowledging receipt of packet plus own ISN value send_acknowledgment_and_own_isn(received_ISN_server_side + 1) # Finally, client acknowledges reception of server's ISN confirm_reception_of_servers_isn(server_sent_ISN_plus_one()) print("Connection established successfully!") except Exception as e: handle_exception(e) # Helper functions omitted here but would include logic like generating random seq num etc... ``` 上述伪代码片段展示了简化版的手动模拟TCP三次握手机制的过程. 实际应用中涉及更多复杂因素考虑比如超时重传控制等等.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值