Wireshark抓包分析TCP/IP通信全过程 从三次握手到数据传输再到四次挥手详解网络底层原理

引言:网络通信的底层语言
TCP/IP协议簇是现代互联网通信的基石,它定义了数据如何在网络中传输和路由。理解TCP/IP通信过程对于网络工程师、开发人员以及任何对网络技术感兴趣的人来说都至关重要。Wireshark作为一款功能强大的网络协议分析工具,能够捕获网络数据包并以可视化的方式展示通信细节,让我们能够”亲眼看到”TCP/IP协议的运作过程。
本文将通过Wireshark抓包分析,详细讲解TCP/IP通信的完整生命周期,包括TCP三次握手建立连接、数据传输过程以及TCP四次挥手断开连接。我们将深入剖析每个阶段的协议细节,并结合实际抓包数据进行分析,帮助读者彻底理解网络底层原理。
一、Wireshark基础与抓包准备
1.1 Wireshark简介与安装
Wireshark(前身为Ethereal)是一个开源的网络协议分析器,能够实时捕获和分析网络数据包。它支持数百种协议的解析,提供强大的过滤和统计功能。
安装步骤:
访问Wireshark官网(
https://www.wireshark.org/)
根据操作系统下载对应版本
Windows系统建议安装Npcap驱动
macOS可通过Homebrew安装:
brew install wireshark
1.2 抓包环境准备
在进行抓包分析前,需要做好以下准备:
1. 确定抓包位置
本机抓包:直接在通信双方的一台机器上捕获
网络设备抓包:通过端口镜像或TAP设备捕获
网关抓包:在路由器或防火墙上捕获
2. 选择合适的网络接口
# Linux下查看网络接口
ip addr show
# 或
ifconfig

# Windows下查看网络接口
ipconfig /all
3. 设置捕获过滤器(可选)
捕获过滤器在抓包前设置,用于减少不需要的数据包:
# 只捕获HTTP流量
port 80

# 只捕获特定主机的流量
host 192.168.1.100

# 只捕获TCP协议
tcp
1.3 Wireshark界面与基本操作
Wireshark主界面包含三个主要面板:
Packet List(数据包列表)
:显示捕获的数据包摘要
Packet Details(数据包详情)
:显示选定数据包的协议层次结构
Packet Bytes(数据包字节)
:显示数据包的原始字节数据
基本操作:
选择网络接口开始捕获(Capture → Options)
使用显示过滤器筛选特定流量(Filter栏输入过滤表达式)
右键数据包可追踪TCP流(Follow → TCP Stream)
使用Statistics菜单查看统计信息
二、TCP协议基础回顾
2.1 TCP报文段结构
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。TCP报文段由头部和数据两部分组成,头部通常为20字节。
TCP报文段结构:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 源端口 (16位) | 目的端口 (16位) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 序列号 (32位) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 确认号 (32位) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 头部长度 | 保留 |U|A|P|R|S|F| 窗口大小 (16位) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 校验和 (16位) | 紧急指针 (16位) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 选项(如果头部长度>5) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
关键字段说明:
序列号(Sequence Number)
:标识数据段在发送方字节流中的位置
确认号(Acknowledgment Number)
:期望收到的下一个字节的序列号
头部长度
:表示TCP头部的长度(以32位字为单位)
控制标志(Flags)
:
URG:紧急指针有效
ACK:确认号有效
PSH:接收方应尽快将这个报文段交给应用层
RST:重置连接
SYN:同步序列号,用于发起连接
FIN:发送方完成发送任务,用于关闭连接
窗口大小
:用于流量控制,表示接收方还能接收多少字节的数据
2.2 TCP的可靠性机制
TCP通过以下机制确保数据的可靠传输:
序列号和确认号
:确保数据按顺序到达
超时重传
:发送方在超时未收到确认时重传数据
流量控制
:通过滑动窗口机制防止发送方淹没接收方
拥塞控制
:通过慢启动、拥塞避免等算法防止网络拥塞
三、TCP三次握手详解
3.1 三次握手过程概述
TCP三次握手是建立可靠连接的过程,确保通信双方都能正确初始化序列号并确认对方的接收和发送能力。
三次握手流程:
SYN(同步)
:客户端发送SYN包(SYN=1,seq=x)到服务器
SYN-ACK(同步-确认)
:服务器回复SYN-ACK包(SYN=1,ACK=1,seq=y,ack=x+1)
ACK(确认)
:客户端发送ACK包(ACK=1,seq=x+1,ack=y+1)
3.2 Wireshark抓包分析三次握手
假设我们访问一个Web服务器(例如192.168.1.100:80),让我们分析实际的抓包数据。
场景设置:
客户端:192.168.1.50
服务器:192.168.1.100:80
操作:使用浏览器访问
http://192.168.1.100
抓包结果分析:
第一次握手:SYN包
Frame 1: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
Arrival Time: Jan 1, 2024 10:00:00.123456789
Epoch Time: 1704067200.123456789 seconds
[Time shift for this packet: 0.000000000 seconds]
[Time since first frame in this TCP stream: 0.000000000 seconds]
Frame Number: 1
Frame Length: 60 bytes
Capture Length: 60 bytes
[Protocols in frame: eth:ipv4:tcp]
[Coloring Rule Name: TCP SYN/FIN]
[Coloring Rule String: tcp.flags.syn & 0x02 || tcp.flags.fin & 0x01]

Ethernet II, Src: Apple_12:34:56 (00:11:22:33:44:55), Dst: TPLink_67:89:ab (aa:bb:cc:dd:ee:ff)
Destination: TPLink_67:89:ab (aa:bb:cc:dd:ee:ff)
Source: Apple_12:34:56 (00:11:22:33:44:55)
Type: IPv4 (0x0800)

Internet Protocol Version 4, Src: 192.168.1.50, Dst: 192.168.1.100
0100 …. = Version: 4
…. 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
Total Length: 40
Identification: 0x1234 (4660)
Flags: 0x0000
Fragment offset: 0
Time to live: 64
Protocol: TCP (6)
Header checksum: 0xabcd [validation disabled]
Source Address: 192.168.1.50
Destination Address: 192.168.1.100

Transmission Control Protocol, Src Port: 54321, Dst Port: 80, Seq: 0, Len: 0
Source Port: 54321
Destination Port: 80
[Stream index: 0]
[TCP Segment Len: 0]
Sequence Number: 0 (relative sequence number: 0)
Sequence Number (raw): 0x1a2b3c4d
Next Sequence Number: 1 (relative next sequence number: 1)
Acknowledgment Number: 0 (relative ack number: 0)
0101 …. = Header Length: 20 bytes (5)
Flags: 0x0002 (SYN)
0000 …. …. …. …. …. …. …. …. = Reserved: 0
…. 0… …. …. …. …. …. …. …. = Nonce: 0
…. ..0. …. …. …. …. …. …. …. = Congestion Window Reduced (CWR): 0
…. …0 …. …. …. …. …. …. …. = ECN-Echo (ECE): 0
…. …. 0… …. …. …. …. …. …. = Urgent (URG): 0
…. …. .0.. …. …. …. …. …. …. = Acknowledgment (ACK): 0
…. …. ..0. …. …. …. …. …. …. = Push (PSH): 0
…. …. …0 …. …. …. …. …. …. = Reset (RST): 0
…. …. …. 1… …. …. …. …. …. = Syn (SYN): 1
…. …. …. .0.. …. …. …. …. …. = Fin (FIN): 0
Window: 64240
[Calculated window size: 64240]
Checksum: 0x5678 [validation disabled]
Urgent Pointer: 0
Options: (12 bytes), Maximum segment size, No-Operation, No-Operation, SACK permitted, End of Option List
TCP Option – Maximum segment size: 1460 bytes
Kind: Maximum Segment Size (2)
Length: 4
MSS Value: 1460
TCP Option – No-Operation: 1
Kind: No-Operation (1)
TCP Option – No-Operation: 1
Kind: No-Operation (1)
TCP Option – SACK permitted: 1
Kind: SACK permitted (4)
Length: 2
TCP Option – End of Option List: 0
Kind: End of Option List (0)
[SEQ/ACK analysis]
[TCP Analysis Flags]
关键信息提取:
源端口
:54321(客户端随机端口)
目的端口
:80(HTTP服务)
序列号
:0x1a2b3c4d(原始序列号)
标志位
:SYN=1,其他标志为0
窗口大小
:64240
TCP选项
:MSS=1460(最大段大小),SACK permitted(允许选择确认)
第二次握手:SYN-ACK包
Frame 2: 60 bytes on wire (480 bits), 60 bytes captured (480 bits)
Arrival Time: Jan 1, 2024 10:00:00.123789012
Epoch Time: 1704067200.123789012 seconds
[Time shift for this packet: 0.000000000 seconds]
[Time since first frame in this TCP stream: 0.000332223 seconds]
Frame Number: 2
Frame Length: 60 bytes
Capture Length: 60 bytes
[Protocols in frame: eth:ipv4:tcp]
[Coloring Rule Name: TCP SYN/FIN]
[Coloring Rule String: tcp.flags.syn & 0x02 || tcp.flags.fin & 0x01]

Ethernet II, Src: TPLink_67:89:ab (aa:bb:cc:dd:ee:ff), Dst: Apple_12:34:56 (00:11:22:33:44:55)
Destination: Apple_12:34:56 (00:11:22:33:44:55)
Source: TPLink_67:89:ab (aa:bb:cc:dd:ee:ff)
Type: IPv4 (0x0800)

Internet Protocol Version 4, Src: 192.168.1.100, Dst: 192.168.1.50
0100 …. = Version: 4
…. 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
Total Length: 40
Identification: 0x5678 (22136)
Flags: 0x0000
Fragment offset: 0
Time to live: 64
Protocol: TCP (6)
Header checksum: 0xef01 [validation disabled]
Source Address: 192.168.1.100
Destination Address: 192.168.1.50

Transmission Control Protocol, Src Port: 80, Dst Port: 54321, Seq: 0, Ack: 1, Len: 0
Source Port: 80
Destination Port: 54321
[Stream index: 0]
[TCP Segment Len: 0]
Sequence Number: 0 (relative sequence number: 0)
Sequence Number (raw): 0x7f8a9b0c
Next Sequence Number: 1 (relative next sequence number: 1)
Acknowledgment Number: 1 (relative ack number: 1)
Acknowledgment Number (raw): 0x1a2b3c4e
0101 …. = Header Length: 20 bytes (5)
Flags: 0x0012 (SYN, ACK)
0000 …. …. …. …. …. …. …. …. = Reserved: 0
…. 0… …. …. …. …. …. …. …. = Nonce: 0
…. ..0. …. …. …. …. …. …. …. = Congestion Window Reduced (CWR): 0
…. …0 …. …. …. …. …. …. …. = ECN-Echo (ECE): 0
…. …. 0… …. …. …. …. …. …. = Urgent (URG): 0
…. …. .1.. …. …. …. …. …. …. = Acknowledgment (ACK): 1
…. …. ..0. …. …. …. …. …. …. = Push (PSH): 0
…. …. …0 …. …. …. …. …. …. = Reset (RST): 0
…. …. …. 1… …. …. …. …. …. = Syn (SYN): 1
…. …. …. .0.. …. …. …. …. …. = Fin (FIN): 0
Window: 29200
[Calculated window size: 29200]
Checksum: 0x9abc [validation disabled]
Urgent Pointer: 0
Options: (12 bytes), Maximum segment size, No-Operation, No-Operation, SACK permitted, End of Option List
TCP Option – Maximum segment size: 1460 bytes
Kind: Maximum Segment Size (2)
Length: 4
MSS Value: 1460
TCP Option – No-Operation: 1
Kind: No-Operation (1)
TCP Option – No-Operation: 1
Kind: No-Operation (1)
TCP Option – SACK permitted: 1
Kind: SACK permitted (4)
Length: 2
TCP Option – End of Option List: 0
Kind: End of Option List (0)
[SEQ/ACK analysis]
[TCP Analysis Flags]
关键信息提取:
源端口
:80(服务器HTTP端口)
目的端口
:54321(客户端端口)
序列号
:0x7f8a9b0c(服务器的初始序列号)
确认号
:0x1a2b3c4e(客户端序列号+1)
标志位
:SYN=1,ACK=1
窗口大小
:29200
第三次握手:ACK包
Frame 3: 54 bytes on wire (432 bits), 54 bytes captured (432 bits)
Arrival Time: Jan 1, 2024 10:00:00.124012345
Epoch Time: 1704067200.124012345 seconds
[Time shift for this packet: 0.000000000 seconds]
[Time since first frame in this TCP stream: 0.000555556 seconds]
Frame Number: 3
Frame Length: 54 bytes
Capture Length: 54 bytes
[Protocols in frame: eth:ipv4:tcp]
[Coloring Rule Name: TCP ACK]
[Coloring Rule String: tcp.flags.ack & 0x10 && !tcp.flags.syn && !tcp.flags.fin && tcp.len == 0]

Ethernet II, Src: Apple_12:34:56 (00:11:22:33:44:55), Dst: TPLink_67:89:ab (aa:bb:cc:dd:ee:ff)
Destination: TPLink_67:89:ab (aa:bb:cc:dd:ee:ff)
Source: Apple_12:34:56 (00:11:22:33:44:55)
Type: IPv4 (0x0800)

Internet Protocol Version 4, Src: 192.168.1.50, Dst: 192.168.1.100
0100 …. = Version: 4
…. 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
Total Length: 40
Identification: 0x1235 (4661)
Flags: 0x0000
Fragment offset: 0
Time to live: 64
Protocol: TCP (6)
Header checksum: 0xabcc [validation disabled]
Source Address: 192.168.1.50
Destination Address: 192.168.1.100

Transmission Control Protocol, Src Port: 54321, Dst Port: 80, Seq: 1, Ack: 1, Len: 0
Source Port: 54321
Destination Port: 80
[Stream index: 0]
[TCP Segment Len: 0]
Sequence Number: 1 (relative sequence number: 1)
Sequence Number (raw): 0x1a2b3c4e
Next Sequence Number: 1 (relative next sequence number: 1)
Acknowledgment Number: 1 (relative ack number: 1)
Acknowledgment Number (raw): 0x7f8a9b0d
0101 …. = Header Length: 20 bytes (5)
Flags: 0x0010 (ACK)
0000 …. …. …. …. …. …. …. …. = Reserved: 0
…. 0… …. …. …. …. …. …. …. = Nonce: 0
…. ..0. …. …. …. …. …. …. …. = Congestion Window Reduced (CWR): 0
…. …0 …. …. …. …. …. …. …. = ECN-Echo (ECE): 0
…. …. 0… …. …. …. …. …. …. = Urgent (URG): 0
…. …. .1.. …. …. …. …. …. …. = Acknowledgment (ACK): 1
…. …. ..0. …. …. …. …. …. …. = Push (PSH): 0
…. …. …0 …. …. …. …. …. …. = Reset (RST): 0
…. …. …. 0… …. …. …. …. …. = Syn (SYN): 0
…. …. …. .0.. …. …. …. …. …. = Fin (FIN): 0
Window: 64240
[Calculated window size: 64240]
Checksum: 0x5679 [validation disabled]
Urgent Pointer: 0
[SEQ/ACK analysis]
[TCP Analysis Flags]
关键信息提取:
源端口
:54321
目的端口
:80
序列号
:0x1a2b3c4e(客户端序列号+1)
确认号
:0x7f8a9b0d(服务器序列号+1)
标志位
:ACK=1,其他标志为0
窗口大小
:64240
3.3 三次握手的底层原理
1. 序列号同步的重要性
序列号用于标识TCP流中每个字节的位置。在三次握手中,双方交换初始序列号(ISN),确保后续数据传输的顺序性。
2. 为什么需要三次握手?
防止历史连接请求突然到达
:如果客户端发送的第一个SYN包在网络中滞留,到达服务器时客户端已经放弃连接,服务器会误认为需要建立新连接。三次握手可以确保双方都确认了对方的初始序列号。
验证双方的收发能力
:SYN包证明客户端能发送,SYN-ACK证明服务器能接收和发送,ACK证明客户端能接收。
3. TCP选项的作用
MSS(Maximum Segment Size)
:协商最大段大小,避免IP分片
SACK(Selective Acknowledgment)
:允许选择性确认,提高重传效率
Window Scale
:扩大窗口大小,提高吞吐量
四、TCP数据传输过程详解
4.1 数据传输机制概述
连接建立后,TCP开始数据传输。数据传输涉及以下关键机制:
序列号管理
:每个字节都有唯一序列号
确认机制
:接收方通过ACK确认收到的数据
流量控制
:通过滑动窗口防止接收方被淹没
拥塞控制
:防止网络过载
重传机制
:处理丢失或损坏的数据包
4.2 HTTP请求/响应抓包分析
继续之前的场景,客户端发送HTTP GET请求,服务器返回HTTP响应。
HTTP请求数据包
Frame 4: 154 bytes on wire (1232 bits), 154 bytes captured (1232 bits)
Arrival Time: Jan 1, 2024 10:00:00.124234567
Epoch Time: 1704067200.124234567 seconds
Frame Number: 4
Frame Length: 154 bytes
Capture Length: 154 bytes
[Protocols in frame: eth:ipv4:tcp:http]

Transmission Control Protocol, Src Port: 54321, Dst Port: 80, Seq: 1, Ack: 1, Len: 100
Source Port: 54321
Destination Port: 80
[Stream index: 0]
[TCP Segment Len: 100]
Sequence Number: 1 (relative sequence number: 1)
Sequence Number (raw): 0x1a2b3c4e
Next Sequence Number: 101 (relative next sequence number: 101)
Acknowledgment Number: 1 (relative ack number: 1)
Acknowledgment Number (raw): 0x7f8a9b0d
0101 …. = Header Length: 20 bytes (5)
Flags: 0x0018 (PSH, ACK)
0000 …. …. …. …. …. …. …. …. = Reserved: 0
…. 0… …. …. …. …. …. …. …. = Nonce: 0
…. ..0. …. …. …. …. …. …. …. = Congestion Window Reduced (CWR): 0
…. …0 …. …. …. …. …. …. …. = ECN-Echo (ECE): 0
…. …. 0… …. …. …. …. …. …. = Urgent (URG): 0
…. …. .1.. …. …. …. …. …. …. = Acknowledgment (ACK): 1
…. …. ..1. …. …. …. …. …. …. = Push (PSH): 1
…. …. …0 …. …. …. …. …. …. = Reset (RST): 0
…. …. …. 0… …. …. …. …. …. = Syn (SYN): 0
…. …. …. .0.. …. …. …. …. …. = Fin (FIN): 0
Window: 64240
[Calculated window size: 64240]
Checksum: 0xef02 [validation disabled]
Urgent Pointer: 0
[SEQ/ACK analysis]
[TCP Analysis Flags]

Hypertext Transfer Protocol
GET / HTTP/1.1\r\n
Host: 192.168.1.100\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n
Accept-Language: en-US,en;q=0.5\r\n
Accept-Encoding: gzip, deflate, br\r\n
Connection: keep-alive\r\n
\r\n
关键信息:
序列号
:1(相对序列号)
确认号
:1(相对确认号)
标志位
:PSH=1(推送数据),ACK=1
数据长度
:100字节
HTTP请求
:GET / HTTP/1.1
HTTP响应数据包
Frame 5: 280 bytes on wire (2240 bits), 280 bytes captured (2240 bits)
Arrival Time: Jan 1, 2024 10:00:00.124567890
Epoch Time: 1704067200.124567890 seconds
Frame Number: 5
Frame Length: 280 bytes
Capture Length: 280 bytes
[Protocols in frame: eth:ipv4:tcp:http]

Transmission Control Protocol, Src Port: 80, Dst Port: 54321, Seq: 1, Ack: 101, Len: 226
Source Port: 80
Destination Port: 54321
[Stream index: 0]
[TCP Segment Len: 226]
Sequence Number: 1 (relative sequence number: 1)
Sequence Number (raw): 0x7f8a9b0d
Next Sequence Number: 227 (relative next sequence number: 227)
Acknowledgment Number: 101 (relative ack number: 101)
Acknowledgment Number (raw): 0x1a2b3cb2
0101 …. = Header Length: 20 bytes (5)
Flags: 0x0018 (PSH, ACK)
Window: 29200
[Calculated window size: 29200]
Checksum: 0x567a [validation disabled]
Urgent Pointer: 0

Hypertext Transfer Protocol
HTTP/1.1 200 OK\r\n
Date: Mon, 01 Jan 2024 10:00:00 GMT\r\n
Server: Apache/2.4.58 (Ubuntu)\r\n
Last-Modified: Sun, 31 Dec 2023 23:59:59 GMT\r\n
ETag: “123-456789abcdef”\r\n
Accept-Ranges: bytes\r\n
Content-Length: 123\r\n
Content-Type: text/html; charset=UTF-8\r\n
\r\n
[HTTP response body (123 bytes)]
关键信息:
序列号
:1(相对序列号)
确认号
:101(客户端序列号+100)
标志位
:PSH=1,ACK=1
数据长度
:226字节(包含HTTP头和正文)
HTTP响应
:200 OK
HTTP响应确认包
Frame 6: 54 bytes on wire (432 bits), 54 bytes captured (432 bits)
Arrival Time: Jan 1, 2024 10:00:00.124789012
Epoch Time: 1704067200.124789012 seconds
Frame Number: 6
Frame Length: 54 bytes
Capture Length: 54 bytes
[Protocols in frame: eth:ipv4:tcp]

Transmission Control Protocol, Src Port: 54321, Dst Port: 80, Seq: 101, Ack: 227, Len: 0
Source Port: 54321
Destination Port: 80
[Stream index: 0]
[TCP Segment Len: 0]
Sequence Number: 101 (relative sequence number: 101)
Sequence Number (raw): 0x1a2b3cb2
Next Sequence Number: 101 (relative next sequence number: 101)
Acknowledgment Number: 227 (relative ack number: 227)
Acknowledgment Number (raw): 0x7f8a9bf7
0101 …. = Header Length: 20 bytes (5)
Flags: 0x0010 (ACK)
Window: 64014
[Calculated window size: 64014]
Checksum: 0x567b [validation disabled]
Urgent Pointer: 0
关键信息:
确认号
:227(服务器序列号+226)
标志位
:ACK=1
窗口大小
:64014(更新后的窗口值)
4.3 数据传输中的关键概念
滑动窗口机制
滑动窗口是TCP流量控制的核心机制。接收方通过通告窗口大小(Window Size)告诉发送方还能接收多少数据。
示例分析:
客户端发送窗口大小:64240
服务器发送窗口大小:29200
实际传输速率受双方窗口限制
累积确认
TCP使用累积确认机制,确认号表示期望收到的下一个字节的序列号。例如:
服务器发送数据字节范围:1-226
客户端确认号:227,表示已正确收到1-226字节
重传机制
当数据包丢失时,TCP会重传。在Wireshark中,重传包会显示为”TCP Retransmission”。
重传触发条件:
超时未收到ACK
收到重复ACK(通常3个重复ACK触发快速重传)
五、TCP四次挥手详解
5.1 四次挥手过程概述
TCP四次挥手是关闭连接的过程,确保双方都能正确完成数据传输并释放资源。
四次挥手流程:
FIN
:主动关闭方发送FIN包(FIN=1,seq=u)
ACK
:被动关闭方回复ACK包(ACK=1,ack=u+1)
FIN
:被动关闭方发送FIN包(FIN=1,seq=v)
ACK
:主动关闭方回复ACK包(ACK=1,ack=v+1)
5.2 Wireshark抓包分析四次挥手
继续之前的HTTP通信,现在客户端关闭连接。
第一次挥手:FIN包
Frame 7: 54 bytes on wire (432 bits), 54 bytes captured (432 bits)
Arrival Time: Jan 1, 2024 10:00:00.125012345
Epoch Time: 1704067200.125012345 seconds
Frame Number: 7
Frame Length: 54 bytes
Capture Length: 54 bytes
[Protocols in frame: eth:ipv4:tcp]

Transmission Control Protocol, Src Port: 54321, Dst Port: 80, Seq: 101, Ack: 227, Len: 0
Source Port: 54321
Destination Port: 80
[Stream index: 0]
[TCP Segment Len: 0]
Sequence Number: 101 (relative sequence number: 101)
Sequence Number (raw): 0x1a2b3cb2
Next Sequence Number: 102 (relative next sequence number: 102)
Acknowledgment Number: 227 (relative ack number: 227)
Acknowledgment Number (raw): 0x7f8a9bf7
0101 …. = Header Length: 20 bytes (5)
Flags: 0x0011 (FIN, ACK)
0000 …. …. …. …. …. …. …. …. = Reserved: 0
…. 0… …. …. …. …. …. …. …. = Nonce: 0
…. ..0. …. …. …. …. …. …. …. = Congestion Window Reduced (CWR): 0
…. …0 …. …. …. …. …. …. …. = ECN-Echo (ECE): 0
…. …. 0… …. …. …. …. …. …. = Urgent (URG): 0
…. …. .1.. …. …. …. …. …. …. = Acknowledgment (ACK): 1
…. …. ..0. …. …. …. …. …. …. = Push (PSH): 0
…. …. …0 …. …. …. …. …. …. = Reset (RST): 0
…. …. …. 0… …. …. …. …. …. = Syn (SYN): 0
…. …. …. .1.. …. …. …. …. …. = Fin (FIN): 1
Window: 64014
[Calculated window size: 64014]
Checksum: 0x567c [validation disabled]
Urgent Pointer: 0
关键信息:
标志位
:FIN=1,ACK=1
序列号
:101(客户端最后发送的字节序号+1)
确认号
:227(服务器最后发送的字节序号+1)
第二次挥手:ACK包
Frame 8: 54 bytes on wire (432 bits), 54 bytes captured (432 bits)
Arrival Time: Jan 1, 2024 10:00:00.125234567
Epoch Time: 1704067200.125234567 seconds
Frame Number: 8
Frame Length: 54 bytes
Capture Length: 54 bytes
[Protocols in frame: eth:ipv4:tcp]

Transmission Control Protocol, Src Port: 80, Dst Port: 54321, Seq: 227, Ack: 102, Len: 0
Source Port: 80
Destination Port: 54321
[Stream index: 0]
[TCP Segment Len: 0]
Sequence Number: 227 (relative sequence number: 227)
Sequence Number (raw): 0x7f8a9bf7
Next Sequence Number: 227 (relative next sequence number: 227)
Acknowledgment Number: 102 (relative ack number: 102)
Acknowledgment Number (raw): 0x1a2b3cb3
0101 …. = Header Length: 20 bytes (5)
Flags: 0x0010 (ACK)
Window: 29200
[Calculated window size: 29200]
Checksum: 0x567d [validation disabled]
Urgent Pointer: 0
关键信息:
标志位
:ACK=1
确认号
:102(客户端FIN包的序列号+1)
第三次挥手:FIN包
Frame 9: 54 bytes on wire (432 bits), 54 bytes captured (432 bits)
Arrival Time: Jan 1, 2024 10:00:00.125456789
Epoch Time: 1704067200.125456789 seconds
Frame Number: 9
Frame Length: 54 bytes
Capture Length: 54 bytes
[Protocols in frame: eth:ipv4:tcp]

Transmission Control Protocol, Src Port: 80, Dst Port: 54321, Seq: 227, Ack: 102, Len: 0
Source Port: 80
Destination Port: 54321
[Stream index: 0]
[TCP Segment Len: 0]
Sequence Number: 227 (relative sequence number: 227)
Sequence Number (raw): 0x7f8a9bf7
Next Sequence Number: 228 (relative next sequence number: 228)
Acknowledgment Number: 102 (relative ack number: 102)
Acknowledgment Number (raw): 0x1a2b3cb3
0101 …. = Header Length: 20 bytes (5)
Flags: 0x0011 (FIN, ACK)
Window: 29200
[Calculated window size: 29200]
Checksum: 0x567e [validation disabled]
Urgent Pointer: 0
关键信息:
标志位
:FIN=1,ACK=1
序列号
:227(服务器最后发送的字节序号+1)
确认号
:102(客户端最后发送的字节序号+1)
第四次挥手:ACK包
Frame 10: 54 bytes on wire (432 bits), 54 bytes captured (432 bits)
Arrival Time: Jan 1, 2024 10:00:00.125678901
Epoch Time: 1704067200.125678901 seconds
Frame Number: 10
Frame Length: 54 bytes
Capture Length: 54 bytes
[Protocols in frame: eth:ipv4:tcp]

Transmission Control Protocol, Src Port: 54321, Dst Port: 80, Seq: 102, Ack: 228, Len: 0
Source Port: 54321
Destination Port: 80
[Stream index: 0]
[TCP Segment Len: 0]
Sequence Number: 102 (relative sequence number: 102)
Sequence Number (raw): 0x1a2b3cb3
Next Sequence Number: 102 (relative next sequence number: 102)
Acknowledgment Number: 228 (relative ack number: 228)
Acknowledgment Number (raw): 0x7f8a9bf8
0101 …. = Header Length: 20 bytes (5)
Flags: 0x0010 (ACK)
Window: 64014
[Calculated window size: 64014]
Checksum: 0x567f [validation disabled]
Urgent Pointer: 0
关键信息:
标志位
:ACK=1
确认号
:228(服务器FIN包的序列号+1)
5.3 TIME_WAIT状态
在第四次挥手后,主动关闭方(客户端)会进入TIME_WAIT状态,持续2MSL(Maximum Segment Lifetime,最大报文段生存时间),通常为30秒到2分钟。
TIME_WAIT的作用:
确保最后一个ACK被服务器接收
:如果这个ACK丢失,服务器会重发FIN,客户端在TIME_WAIT状态可以响应重发的FIN
防止历史连接的数据包干扰新连接
:让网络中残留的旧报文段过期
5.4 为什么需要四次挥手?
TCP是全双工的,连接是两个方向独立的。当一方发送FIN时,只是表示”我没有数据要发送了”,但对方可能还有数据要发送。因此需要两次FIN和两次ACK来分别关闭两个方向的数据流。
六、TCP高级特性与优化
6.1 TCP Keepalive机制
TCP Keepalive用于检测连接是否仍然活跃,防止连接因长时间空闲而被关闭。
Keepalive工作原理:
连接建立后,如果2小时没有数据传输,TCP会发送Keepalive探测包
如果连续发送多个探测包都没有响应,认为连接已断开
Wireshark中的Keepalive包:
Frame 11: 54 bytes on wire (432 bits), 54 bytes captured (432 bits)
Arrival Time: Jan 1, 2024 10:02:00.125012345
Frame Number: 11
Frame Length: 54 bytes
Capture Length: 54 bytes
[Protocols in frame: eth:ipv4:tcp]

Transmission Control Protocol, Src Port: 54321, Dst Port: 80, Seq: 102, Ack: 228, Len: 0
Source Port: 54321
Destination Port: 80
[Stream index: 0]
[TCP Segment Len: 0]
Sequence Number: 102 (relative sequence number: 102)
Sequence Number (raw): 0x1a2b3cb3
Next Sequence Number: 102 (relative next sequence number: 102)
Acknowledgment Number: 228 (relative ack number: 228)
Acknowledgment Number (raw): 0x7f8a9bf8
0101 …. = Header Length: 20 bytes (5)
Flags: 0x0010 (ACK)
Window: 64014
[Calculated window size: 64014]
Checksum: 0x5680 [validation disabled]
Urgent Pointer: 0
[Keep-Alive packet]
6.2 TCP快速重传与快速恢复
快速重传
:当收到3个重复ACK时,不等待超时立即重传对应数据包。
快速恢复
:在快速重传后,将拥塞窗口减半,然后逐步增加,而不是像超时重传那样将窗口重置为1。
Wireshark中的快速重传:
Frame 12: 154 bytes on wire (1232 bits), 154 bytes captured (1232 bits)
Arrival Time: Jan 1, 2024 10:00:00.126012345
Frame Number: 12
Frame Length: 154 bytes
Capture Length: 154 bytes
[Protocols in frame: eth:ipv4:tcp:http]
[Coloring Rule Name: TCP Retransmission]
[Coloring Rule String: tcp.analysis.retransmission]

Transmission Control Protocol, Src Port: 54321, Dst Port: 80, Seq: 101, Ack: 227, Len: 100
Source Port: 54321
Destination Port: 80
[Stream index: 0]
[TCP Segment Len: 100]
Sequence Number: 101 (relative sequence number: 101)
Sequence Number (raw): 0x1a2b3cb2
Next Sequence Number: 201 (relative next sequence number: 201)
Acknowledgment Number: 227 (relative ack number: 227)
Acknowledgment Number (raw): 0x7f8a9bf7
0101 …. = Header Length: 20 bytes (5)
Flags: 0x0018 (PSH, ACK)
Window: 64014
[Calculated window size: 64014]
Checksum: 0x5681 [validation disabled]
Urgent Pointer: 0
[This is a retransmission]
[TCP Analysis Flags]
[TCP Retransmission: True]
6.3 TCP拥塞控制算法
TCP使用多种拥塞控制算法来优化网络性能:
慢启动(Slow Start)
:初始拥塞窗口较小,指数增长
拥塞避免(Congestion Avoidance)
:达到阈值后线性增长
快速恢复(Fast Recovery)
:处理快速重传后的窗口调整
拥塞窗口变化示例:
初始窗口:1 MSS
慢启动:1 → 2 → 4 → 8 → 16 → …
阈值:32 MSS
拥塞避免:32 → 33 → 34 → 35 → …
七、Wireshark高级分析技巧
7.1 使用显示过滤器
显示过滤器用于在已捕获的数据包中筛选特定流量:
常用过滤器:
# 过滤特定TCP流
tcp.stream eq 0

# 过滤特定IP地址
ip.addr eq 192.168.1.50

# 过滤特定端口范围
tcp.portrange 8000-9000

# 过滤TCP标志
tcp.flags.syn eq 1
tcp.flags.fin eq 1
tcp.flags.reset eq 1

# 过滤重传包
tcp.analysis.retransmission

# 过滤重复ACK
tcp.analysis.duplicate_ack

# 过滤窗口大小
tcp.window_size < 1000 # 组合过滤器 ip.addr eq 192.168.1.50 and tcp.port eq 80 and tcp.flags.syn eq 1 7.2 TCP流分析 Wireshark提供TCP流分析功能,可以查看完整的通信过程: 操作步骤: 右键任意TCP数据包 → Follow → TCP Stream 在弹出窗口中查看完整的通信内容 可以保存流内容为文本或二进制文件 TCP流窗口显示: No. Time Source Destination Protocol Length Info 1 0.000000 192.168.1.50 192.168.1.100 TCP 60 54321 → 80 [SYN] Seq=0 Win=64240 Len=0 2 0.000332 192.168.1.100 192.168.1.50 TCP 60 80 → 54321 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 3 0.000556 192.168.1.50 192.168.1.100 TCP 54 54321 → 80 [ACK] Seq=1 Ack=1 Win=64240 Len=0 4 0.000778 192.168.1.50 192.168.1.100 HTTP 154 GET / HTTP/1.1 5 0.001111 192.168.1.100 192.168.1.50 HTTP 280 HTTP/1.1 200 OK 6 0.001333 192.168.1.50 192.168.1.100 TCP 54 54321 → 80 [ACK] Seq=101 Ack=227 Win=64014 Len=0 7 0.001556 192.168.1.50 192.168.1.100 TCP 54 54321 → 80 [FIN, ACK] Seq=101 Ack=227 Win=64014 Len=0 8 0.001778 192.168.1.100 192.168.1.50 TCP 54 80 → 54321 [ACK] Seq=227 Ack=102 Win=29200 Len=0 9 0.002000 192.168.1.100 192.168.1.50 TCP 54 80 → 54321 [FIN, ACK] Seq=227 Ack=102 Win=29200 Len=0 10 0.002222 192.168.1.50 192.168.1.100 TCP 54 54321 → 80 [ACK] Seq=102 Ack=228 Win=64014 Len=0 7.3 统计分析功能 Wireshark提供强大的统计功能: 1. 流量统计(Statistics → Conversations) 查看每对IP地址之间的流量 分析TCP流的吞吐量、延迟等 2. 协议分级(Statistics → Protocol Hierarchy) 查看各协议占比 识别网络中的主要协议 3. TCP流图(Statistics → TCP Stream Graph) 时间序列图:显示数据包随时间的变化 窗口大小图:显示窗口大小变化 RTT图:显示往返时间 4. HTTP统计(Statistics → HTTP) 请求/响应统计 请求方法分布 状态码分布 7.4 跟踪文件分析 对于大型捕获文件,可以使用tshark(命令行版Wireshark)进行分析: # 提取特定TCP流 tshark -r capture.pcap -Y "tcp.stream eq 0" -w stream0.pcap # 统计重传包数量 tshark -r capture.pcap -Y "tcp.analysis.retransmission" | wc -l # 提取HTTP请求 tshark -r capture.pcap -Y "http.request" -T fields -e http.request.method -e http.request.uri # 计算RTT tshark -r capture.pcap -q -z io,stat,1,"tcp.analysis.ack_rtt" 八、常见问题与故障排查 8.1 连接建立失败 问题现象 :三次握手无法完成 可能原因及排查: 防火墙阻止 :检查服务器防火墙是否开放对应端口 “`bash Linux检查iptables iptables -L -n | grep 80 # Windows检查防火墙规则 netsh advfirewall firewall show rule name=all 2. **服务未监听**:服务器端口没有进程监听 ```bash # Linux检查端口监听 netstat -tuln | grep 80 ss -tuln | grep 80 # Windows检查端口监听 netstat -ano | findstr :80 SYN丢包 :网络拥塞或路由问题 在Wireshark中观察是否有SYN重传 使用ping和traceroute检查网络连通性 8.2 数据传输问题 问题现象 :连接建立但数据传输缓慢或失败 可能原因及排查: 窗口大小为0 :接收方缓冲区满 在Wireshark中观察Window Size字段 检查接收方应用是否处理缓慢 大量重传 :网络丢包严重 统计重传率: tcp.analysis.retransmission 检查网络质量,使用ping测试 MSS不匹配 :导致IP分片 在Wireshark中检查TCP选项MSS值 理想情况:MSS = MTU - 40(IPv4)或 MTU - 60(IPv6) 8.3 连接异常关闭 问题现象 :连接突然中断,出现RST包 可能原因及排查: RST包 :一方强制关闭连接 在Wireshark中过滤 tcp.flags.reset eq 1 检查应用日志,查找崩溃或异常退出 TIME_WAIT过多 :服务器端口耗尽 检查TIME_WAIT连接数: netstat -an | grep TIME_WAIT | wc -l 考虑启用SO_REUSEADDR或SO_REUSEPORT Keepalive超时 :长时间空闲连接被断开 检查Keepalive设置: sysctl net.ipv4.tcp_keepalive_time 调整Keepalive参数或应用层实现心跳 8.4 性能优化建议 1. 调整TCP参数 # Linux系统优化 # 增大TCP窗口大小 sysctl -w net.ipv4.tcp_window_scaling=1 sysctl -w net.core.rmem_max=16777216 sysctl -w net.core.wmem_max=16777216 # 启用TCP快速打开 sysctl -w net.ipv4.tcp_fastopen=3 # 调整Keepalive参数 sysctl -w net.ipv4.tcp_keepalive_time=600 sysctl -w net.ipv4.tcp_keepalive_intvl=30 sysctl -w net.ipv4.tcp_keepalive_probes=5 2. 应用层优化 使用连接池减少连接建立开销 合理使用HTTP/2或HTTP/3 启用压缩减少传输数据量 实现应用层心跳机制 3. 网络设备优化 启用QoS保证关键流量 调整MTU大小避免分片 优化路由路径 九、实际案例分析 9.1 案例1:HTTP服务响应缓慢 问题描述 :用户访问网站时,页面加载缓慢,但服务器负载正常。 抓包分析过程: 捕获流量 :在客户端和服务器之间捕获流量 观察TCP握手 :三次握手正常完成,耗时约2ms 观察HTTP请求 :GET请求正常发送 发现异常 :服务器响应前有明显的延迟(约2秒) 深入分析 :检查服务器处理时间,发现数据库查询缓慢 解决方案 : 优化数据库索引 增加应用缓存 使用CDN加速静态资源 9.2 案例2:TCP重传导致性能下降 问题描述 :文件传输速度远低于预期带宽。 抓包分析过程: 观察吞吐量 :使用Wireshark统计功能计算实际吞吐量 发现重传 :大量TCP重传包,重传率约5% 分析原因 :检查网络路径,发现中间路由器丢包 验证假设 :使用ping测试,发现丢包率约3% 解决方案 : 更换网络路径 联系ISP解决网络质量问题 启用FEC(前向纠错)减少重传影响 9.3 案例3:连接数过多导致端口耗尽 问题描述 :服务器出现”Too many open files”错误。 抓包分析过程: 观察连接状态 :大量TIME_WAIT状态连接 分析原因 :短连接频繁建立和关闭 统计数量 :单台客户端建立数千个连接 解决方案 : 启用SO_REUSEADDR 改用长连接或连接池 调整内核参数: net.ipv4.tcp_tw_reuse=1 十、总结与最佳实践 10.1 TCP/IP通信核心要点回顾 三次握手 :确保双方序列号同步和收发能力验证 数据传输 :序列号、确认号、滑动窗口保证可靠传输 四次挥手 :确保双方都能正确关闭连接 可靠性机制 :重传、流量控制、拥塞控制 10.2 Wireshark使用最佳实践 1. 抓包策略 在靠近源或目的的位置抓包 使用捕获过滤器减少数据量 保存原始捕获文件以备后续分析 2. 分析技巧 从握手开始分析,建立时间线 关注异常标志(RST、重传、重复ACK) 使用统计功能识别性能瓶颈 3. 故障排查流程 1. 检查网络连通性(ping、traceroute) 2. 检查端口可达性(telnet、nc) 3. 捕获流量分析(Wireshark) 4. 检查应用日志 5. 检查系统资源(CPU、内存、网络) 10.3 进一步学习资源 官方文档: Wireshark官方文档: https://www.wireshark.org/docs/ TCP协议规范:RFC 793, RFC 1323, RFC 2018 推荐书籍: 《TCP/IP详解 卷1:协议》 《Wireshark网络分析实战》 《计算机网络:自顶向下方法》 在线资源: Wireshark Q&A论坛 Stack Overflow网络分析标签 各大云服务商的网络最佳实践文档 通过本文的详细讲解和实际抓包示例,相信读者已经对TCP/IP通信全过程有了深入的理解。Wireshark作为强大的分析工具,能够帮助我们直观地观察网络协议的运作,是网络故障排查和性能优化的利器。建议读者在实际环境中多加练习,结合具体场景进行分析,逐步积累经验。