【网络编程】TCP通讯时序详解(三次握手和四次挥手)

本文详细解析了TCP连接的建立(三次握手)与关闭(四次握手)过程,并介绍了数据传输期间的关键机制,如确认应答和最大段尺寸。

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

TCP通信时序

下图是一次TCP通讯的时序图。TCP连接建立断开。包含大家熟知的三次握手和四次握手。

 

 

 

TCP通讯时序

在这个例子中,首先客户端主动发起连接、发送请求,然后服务器端响应请求,然后客户端主动关闭连接。两条竖线表示通讯的两端,从上到下表示时间的先后顺序,注意,数据从一端传到网络的另一端也需要时间,所以图中的箭头都是斜的。双方发送的段按时间顺序编号为1-10,各段中的主要信息在箭头上标出,例如段2的箭头上标着SYN, 8000(0), ACK1001, ,表示该段中的SYN位置132位序号是8000,该段不携带有效载荷(数据字节数为0),ACK位置132位确认序号是1001,带有一个mssMaximum Segment Size最大报文长度)选项值为1024

建立连接(三次握手)的过程:

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

客户端发出段1SYN位表示连接请求。序号是1000,这个序号在网络通讯中用作临时的地址,每发一个数据字节,这个序号要加1,这样在接收端可以根据序号排出数据包的正确顺序,也可以发现丢包的情况,另外,规定SYN位和FIN位也要占一个序号,这次虽然没发数据,但是由于发了SYN位,因此下次再发送应该用序号1001mss表示最大段尺寸,如果一个段太大,封装成帧后超过了链路层的最大帧长度,就必须在IP层分片,为了避免这种情况,客户端声明自己的最大段尺寸,建议服务器端发来的段不要超过这个长度。

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

服务器发出段2,也带有SYN位,同时置ACK位表示确认,确认序号是1001,表示“我接收到序号1000及其以前所有的段,请你下次发送序号为1001的段”,也就是应答了客户端的连接请求,同时也给客户端发出一个连接请求,同时声明最大尺寸为1024

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

客户端发出段3,对服务器的连接请求进行应答,确认序号是8001。在这个过程中,客户端和服务器分别给对方发了连接请求,也应答了对方的连接请求,其中服务器的请求和应答在一个段中发出,因此一共有三个段用于建立连接,称为“三方握手(three-way-handshake)”。在建立连接的同时,双方协商了一些信息,例如双方发送序号的初始值、最大段尺寸等。

TCP通讯中,如果一方收到另一方发来的段,读出其中的目的端口号,发现本机并没有任何进程使用这个端口,就会应答一个包含RST位的段给另一方。例如,服务器并没有任何进程使用8080端口,我们却用telnet客户端去连接它,服务器收到客户端发来的SYN段就会应答一个RST段,客户端的telnet程序收到RST段后报告错误Connection refused

$ telnet 192.168.0.200 8080

Trying 192.168.0.200...

telnet: Unable to connect to remote host: Connection refused

数据传输的过程:

1. 客户端发出段4,包含从序号1001开始的20个字节数据。

2. 服务器发出段5,确认序号为1021,对序号为1001-1020的数据表示确认收到,同时请求发送序号1021开始的数据,服务器在应答的同时也向客户端发送从序号8001开始的10个字节数据,这称为piggyback

3. 客户端发出段6,对服务器发来的序号为8001-8010的数据表示确认收到,请求发送序号8011开始的数据。

在数据传输过程中,ACK和确认序号是非常重要的,应用程序交给TCP协议发送的数据会暂存在TCP层的发送缓冲区中,发出数据包给对方之后,只有收到对方应答的ACK段才知道该数据包确实发到了对方,可以从发送缓冲区中释放掉了,如果因为网络故障丢失了数据包或者丢失了对方发回的ACK段,经过等待超时后TCP协议自动将发送缓冲区中的数据包重发。

关闭连接(四次握手)的过程:

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

1. 客户端发出段7FIN位表示关闭连接的请求。

2. 服务器发出段8,应答客户端的关闭连接请求。

3. 服务器发出段9,其中也包含FIN位,向客户端发送关闭连接请求。

4. 客户端发出段10,应答服务器的关闭连接请求。

建立连接的过程是三方握手,而关闭连接通常需要4个段,服务器的应答和关闭连接请求通常不合并在一个段中,因为有连接半关闭的情况,这种情况下客户端关闭连接之后就不能再发送数据给服务器了,但是服务器还可以发送数据给客户端,直到服务器也关闭连接为止。

<think>好的,我现在要帮用户解决如何使用Wireshark查看TCP三次握手四次挥手,以及每个字段的含义。首先,我需要确认用户的需求是什么。用户可能正在学习网络协议,特别是TCP连接的建立终止过程,想通过Wireshark这个工具来实际观察这些过程,同时理解每个数据包中的字段意义。 接下来,我需要回忆TCP三次握手四次挥手的基本流程。三次握手包括SYN、SYN-ACK、ACK,而四次挥手则是FIN-ACK的两次交换。用户可能已经了解这些理论,现在需要实际操作的部分,所以重点应该放在如何在Wireshark中捕获分析这些数据包。 然后,我需要考虑用户可能不熟悉Wireshark的操作步骤。比如如何设置过滤器,如何启动捕获,如何识别相关的数据包。这时候,分步骤的指导会很有效。同时,用户可能对每个TCP字段的含义不太清楚,所以需要详细解释每个关键字段,如源端口、目的端口、序列号、确认号、标志位(SYN、ACK、FIN等)、窗口大小等。 还要注意用户可能的误区。例如,为什么三次握手是三个数据包,而四次挥手需要四个?这时候在解释的时候需要简明扼要,避免让用户感到困惑。同时,在Wireshark中,数据包的显示可能会有其他协议混杂,所以需要指导用户使用正确的过滤表达式,比如tcp.port == 目标端口或者直接使用tcp.flags.syn == 1来筛选握手包。 另外,用户可能对实际的抓包结果有疑问,比如为什么有时候看到的挥手只有三个包?这可能是因为某些情况下,服务器可以将FINACK合并发送,但通常还是四次。这时候需要解释可能出现的特殊情况,但主要还是以标准流程为主。 最后,要确保回答结构清晰,步骤明确,解释到位。可能还需要提醒用户一些注意事项,比如确保捕获的数据流量确实包含目标连接,避免其他无关数据干扰分析。同时,提供一些示例截图或示例数据包,但因为是文本回复,可能需要用文字描述代替,比如用括号注明Wireshark中的显示内容。 总结下来,回答需要包括以下几个部分: 1. Wireshark的捕获设置过滤方法。 2. 三次握手的具体步骤每个数据包的字段解释。 3. 四次挥手的具体步骤字段解释。 4. 常见字段的详细说明,如序列号、确认号、标志位等。 5. 注意事项常见问题解答。 在写作过程中,要保持语言简洁,步骤清晰,避免使用过于专业的术语,或者在必要时进行解释。同时,检查是否有遗漏的关键点,比如TCP选项字段中的MSS、窗口缩放等,但用户可能主要关注核心字段,所以可以适当简化,重点放在基本字段上。</think>--- ### **Wireshark 抓取 TCP 三次握手四次挥手** #### **一、准备工作** 1. **打开 Wireshark** → 选择要监听的网卡(如 Wi-Fi/以太网) 2. **设置过滤器**(避免无关流量干扰): ```bash tcp.port == 目标端口 # 例如 tcp.port == 80(HTTP) 或 tcp.flags.syn == 1 # 筛选所有 SYN 包 ``` 3. **开始捕获** → 触发目标 TCP 连接(如访问网页、启动 FTP 连接) --- ### **二、三次握手分析** **流程**:`SYN → SYN-ACK → ACK` --- #### **1. 第一次握手(SYN)** - **抓包特征**:Flags [SYN] - **关键字段**: - **Source Port**:客户端随机端口(如 54321) - **Destination Port**:服务端端口(如 80) - **Sequence Number**:初始序列号(如 Seq=0) - **Window Size**:客户端接收窗口大小(如 8192) - **TCP Options**: - `MSS(Maximum Segment Size)`:客户端支持的最大报文长度(如 1460) - `Window Scale`:窗口缩放因子(若支持) --- #### **2. 第二次握手(SYN-ACK)** - **抓包特征**:Flags [SYN, ACK] - **关键字段**: - **Acknowledgment Number**:客户端序列号+1(如 Ack=1) - **Sequence Number**:服务端初始序列号(如 Seq=0) - **Window Size**:服务端接收窗口大小 - **TCP Options**: - `MSS`:服务端支持的 MSS - `SACK Permitted`:是否支持选择性确认 --- #### **3. 第三次握手(ACK)** - **抓包特征**:Flags [ACK] - **关键字段**: - **Acknowledgment Number**:服务端序列号+1(如 Ack=1) - **Sequence Number**:客户端序列号+1(如 Seq=1) --- ### **三、四次挥手分析** **流程**:`FIN → ACK → FIN → ACK` --- #### **1. 第一次挥手(FIN)** - **抓包特征**:Flags [FIN, ACK](主动关闭方发送) - **关键字段**: - **Sequence Number**:当前已发送数据的最后字节+1 - **Acknowledgment Number**:确认对方最后接收的字节 --- #### **2. 第二次挥手(ACK)** - **抓包特征**:Flags [ACK] - **作用**:确认收到 FIN 包(此时连接进入半关闭状态) --- #### **3. 第三次挥手(FIN)** - **抓包特征**:Flags [FIN, ACK](被动关闭方发送) - **字段含义**:同第一次挥手,方向相反 --- #### **4. 第四次挥手(ACK)** - **抓包特征**:Flags [ACK] - **作用**:确认最终 FIN 包,连接完全关闭 --- ### **四、关键字段详解** | 字段 | 说明 | |---------------------|----------------------------------------------------------------------| | **Source Port** | 发送方端口号(范围 0-65535) | | **Destination Port**| 接收方端口号 | | **Sequence Number** | 当前报文段第一个字节的编号(保证数据顺序) | | **Acknowledgment** | 期望收到的下一个字节编号(确认机制核心) | | **Header Length** | TCP 头部长度(单位:4字节,通常 20-60字节) | | **Flags** | 控制位(SYN/ACK/FIN/RST/PSH/URG) | | **Window Size** | 接收窗口剩余容量(流量控制关键) | | **Checksum** | 错误检测(覆盖头部、数据伪头部) | | **Urgent Pointer** | 紧急数据偏移量(需配合 URG 标志使用) | --- ### **五、Wireshark 操作技巧** 1. **颜色标记**:SYN(浅蓝)、ACK(绿色)、FIN(粉红) 2. **跟踪流**:右键数据包 → Follow → TCP Stream(查看完整会话) 3. **时序图**:Statistics → Flow Graph → 生成握手/挥手流程图 4. **字段筛选**: ```bash tcp.flags.fin == 1 # 筛选 FIN 包 tcp.analysis.retransmission # 查找重传包 ``` --- ### **六、典型场景案例** **案例 1:HTTP 连接建立** ```text 1. [SYN] Client:54321 → Server:80 2. [SYN,ACK] Server:80 → Client:54321 3. [ACK] Client:54321 → Server:80 ``` **案例 2:异常挥手(RST 重置)** ```text 1. [FIN,ACK] Client → Server 2. [RST] Server → Client # 服务端直接终止连接 ``` --- ### **七、注意事项** 1. **NAT 干扰**:局域网设备经过 NAT 时,Wireshark 可能捕获不到完整挥手 2. **延迟确认**:ACK 可能与其他数据包合并发送(表现为三次挥手) 3. **TIME_WAIT 状态**:主动关闭方会保留连接信息 2MSL(通常 60秒) 通过 Wireshark 的抓包分析,可以直观验证 TCP 协议的工作机制,是网络故障排查的重要技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值