引言:网络通信的底层语言
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作为强大的分析工具,能够帮助我们直观地观察网络协议的运作,是网络故障排查和性能优化的利器。建议读者在实际环境中多加练习,结合具体场景进行分析,逐步积累经验。