前置知识
目标:理解网络通信核心概念,建立分层思维
- OSI/TCP-IP模型
- 掌握各层核心协议(物理层/数据链路层/网络层/传输层/应用层)
- 理解封装与解封装过程
- 关键工具:
ping
(ICMP)、traceroute
(TTL)、arp
命令
- IP与路由基础
- IPv4地址分类、子网划分、NAT原理
- 路由表解读(
route print
/ip route
) - 实验:使用Packet Tracer模拟静态路由配置
- 传输层协议
- TCP三次握手/四次挥手、滑动窗口机制
- UDP无连接特性对比
- 实验:
netstat -ano
分析本地连接状态
- 关键协议学习
- DHCP分配过程抓包分析
- DNS查询解析流程(递归/迭代查询)
- HTTP请求响应结构
OSI/TCP-IP模型
OSI七层模型与TCP/IP四层模型对比
模型结构与对应关系
OSI模型 | TCP/IP模型 | 核心功能 | 数据单元名称 |
---|---|---|---|
应用层(Application) | 应用层 | 用户接口,提供网络服务 | 数据(Data) |
表示层(Presentation) | 数据格式转换、加密/解密 | ||
会话层(Session) | 建立/管理会话连接 | ||
传输层(Transport) | 传输层 | 端到端可靠传输、流量控制 | 数据段(Segment) |
网络层(Network) | 网络层(Internet) | 逻辑寻址、路由选择 | 数据包(Packet) |
数据链路层(Data Link) | 网络接口层 | MAC寻址、帧同步、错误检测 | 帧(Frame) |
物理层(Physical) | 物理介质传输、比特流处理 | 比特(Bit) |
核心差异:
- TCP/IP将OSI的应用层、表示层、会话层合并为应用层;
- OSI的数据链路层+物理层对应TCP/IP的网络接口层。
各层核心协议详解
物理层(Physical Layer)
- 核心功能:传输原始比特流(0/1),定义物理介质特性(电压、接口、线缆)。
- 协议/标准:
- IEEE 802.3(以太网)
- RS-232(串口通信)
- 光纤标准(如1000BASE-SX)
- 典型设备:中继器、集线器、光纤收发器
数据链路层(Data Link Layer)
- 核心功能:MAC地址寻址、帧同步、错误校验(CRC)、流量控制。
- 核心协议:
- 以太网(Ethernet):MAC地址格式(00:1A:2B:3C:4D:5E)
- ARP(地址解析协议):IP → MAC地址映射
- PPP(点对点协议):拨号上网、PPPoE宽带接入
- VLAN(802.1Q):带标签的帧传输
- 典型设备:交换机(二层)、网桥
网络层(Network Layer)
- 核心功能:逻辑寻址(IP)、路由选择、拥塞控制。
- 核心协议:
- IPv4/IPv6:IP地址分类、子网划分、NAT
- ICMP(Internet控制报文协议):
ping
、traceroute
基础 - IGMP(组管理协议):组播成员管理
- 路由协议:OSPF、BGP、RIP
- 典型设备:路由器、三层交换机
传输层(Transport Layer)
- 核心功能:端到端可靠传输(端口号)、流量控制、错误恢复。
- 核心协议:
- TCP(传输控制协议):面向连接、三次握手、滑动窗口
- UDP(用户数据报协议):无连接、低延迟、无拥塞控制
- SCTP(流控制传输协议):多路径传输(5G核心网常用)
- 关键概念:端口号(HTTP:80, HTTPS:443)、SYN Flood攻击防御
应用层(Application Layer)
- 核心功能:直接为用户应用程序提供网络服务。
- 核心协议:
- HTTP/HTTPS:网页浏览
- DNS:域名解析(UDP 53端口)
- FTP/SFTP:文件传输
- SMTP/POP3/IMAP:电子邮件
- SSH:安全远程登录
- DHCP:动态IP分配
封装与解封装过程
发送端封装流程(从上到下)
- 应用层:生成原始数据(如HTTP请求)
→ 数据格式:[HTTP头] + 网页内容
- 传输层:添加TCP/UDP头部(源端口、目的端口)
→ 数据单元:[TCP头] + [HTTP数据]
- 网络层:添加IP头部(源IP、目的IP、TTL)
→ 数据单元:[IP头] + [TCP数据段]
- 数据链路层:添加MAC头部(源MAC、目的MAC)和帧尾(FCS)
→ 数据单元:[MAC头] + [IP数据包] + [FCS]
- 物理层:转换为比特流,通过物理介质传输
→ 数据单元:101010...
接收端解封装流程(从下到上)
- 物理层:接收比特流,转换为数据帧
- 数据链路层:校验FCS,剥离MAC头部
- 网络层:检查IP地址,剥离IP头部
- 传输层:验证端口号,剥离TCP/UDP头部
- 应用层:处理原始数据(如渲染网页)
关键字段示例:
- TCP头:源端口(16位)、目的端口(16位)、序列号(32位)、ACK号(32位)
- IP头:版本(4位)、TTL(8位)、协议号(TCP=6, UDP=17)
- MAC头:目的MAC(6字节)、源MAC(6字节)、类型(0x0800表示IPv4)
关键工具与协议关联
ping
(ICMP协议)
-
所属层级:网络层(ICMP协议)
-
作用:测试网络连通性,测量往返时间(RTT)。
-
原理:发送ICMP Echo Request → 接收ICMP Echo Reply。
-
示例:
ping www.google.com # 输出: # 64 bytes from 172.217.160.110: icmp_seq=1 ttl=115 time=25.3 ms
-
关键字段解析:
ttl=115
:数据包经过的路由跳数(每经过一跳TTL-1)time=25.3ms
:往返延迟
traceroute
(TTL机制)
-
所属层级:网络层(IP协议TTL字段)
-
作用:追踪数据包路径,诊断网络瓶颈。
-
原理:
- 发送TTL=1的UDP包 → 第一跳路由器返回 ICMP 超时报文
- 逐步增加TTL值,直到到达目标主机。
-
示例:
traceroute www.baidu.com # 输出: # 1 192.168.1.1 1.234 ms # 2 10.100.50.1 5.678 ms # ... # 12 220.181.38.148 30.2 ms
-
扩展工具:
mtr
(实时路径监控+统计丢包率)
arp
命令(ARP协议)
-
所属层级:数据链路层
-
作用:管理本地ARP缓存表(IP ↔ MAC映射)。
-
常用操作:
arp -a # 查看ARP缓存表 arp -d 192.168.1.1 # 删除指定IP的ARP条目 arp -s 192.168.1.1 00:1a:2b:3c:4d:5e # 静态绑定IP-MAC
-
典型问题:ARP欺骗攻击(使用
arpwatch
工具检测)。
总结图表
OSI/TCP-IP模型对照与工具定位
OSI层 | TCP/IP层 | 核心协议 | 关键工具 | 数据单元 |
---|---|---|---|---|
应用层 | 应用层 | HTTP, DNS, FTP | curl, nslookup | 数据 |
传输层 | 传输层 | TCP, UDP | netstat, ss | 数据段 |
网络层 | 网络层 | IP, ICMP | ping, traceroute | 数据包 |
数据链路层 | 网络接口层 | Ethernet, ARP | arp, tcpdump | 帧 |
物理层 | RS-232, IEEE 802.3 | iperf | 比特 |
学习建议:
- 使用Wireshark抓包验证各层头部结构(过滤条件:
tcp
、icmp
、arp
)。 - 在GNS3/Packet Tracer中模拟网络拓扑,实践ARP请求、ICMP通信过程。
- 理解
telnet 80
手动发送HTTP请求,观察TCP握手与数据流。
- 版本:表示 IP 协议的版本。
- 首部长度:首部的长度,单位是 4 字节。
- 区分服务:暂时无意义。
- 总长度:首部和数据之和的长度,单位为字节,当数据报的总长度超过数据链路层的最大传送单元时就必须进行分片处理。将一个 IP 数据报分成多个分片,每个分片都具有 IP 首部。
- 标识:对分片进行标识,同一个数据报的分片具有同样的标识。
- 标志:占 3 位。最低位记为 MF(More Fragment),MF = 1 表示后面“还有分片”,MF = 0 表示这是多个数据报片中的最后一个;中间一位记为 DF(Don't Fragment),只有当 DF = 0 时才允许分片。
- 片偏移:表示该分片在原分组中的相对位置,片偏移以 8 个字节为偏移单位。
- 生存时间:TTL,表示该数据报在网络中可以被转发的次数,每经过一次转发,这个值减 1。
- 首部校验和:这个字段只检验数据报的首部,不检验数据部分。
- 源地址
- 目的地址
- **可变部分:**可变部分中包括用于增加 IP 数据报功能的选项,这些选项一个一个拼起来,中间不需要分隔符,最后用 0 填充为 4 字节的整数倍。
可以看到首部长度值为5行,20bytes(5行*
4字节每行=20字节)
首部长度是 4bit,而24是16,所以它的取值范围是0-15(也可理解为4bit即是4个1,转换成十进制就是15),图中每行是4个字节(32bits),所以最大长度就是15*
4=60字节。
TCP协议
一些专业
- 序号 :用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。
- 确认号:期望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。
- 数据偏移 :指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。
- 确认 ACK :当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。
- 同步 SYN:在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。
- 终止 FIN:用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放运输连接。
- 窗口:窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
SYN:同步标志 同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。 ACK:确认标志 确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure-1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。 RST:复位标志 复位标志有效。用于复位相应的TCP连接。 URG:紧急标志 紧急(The urgent pointer) 标志有效。紧急标志置位, PSH:推标志 该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。 FIN:结束标志 带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据。 在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.其中,对于我们日常的分析有用的就是前面的五个字段。它们的含义是:SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有 DATA数据传输,RST表示连接重置。 其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,如果只是单个的一个SYN,它表示的只是建立连接。 TCP的几次握手就是通过这样的ACK表现出来的。但SYN与FIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。 RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接; 而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。 PSH为1的情况,一般只出现在DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。TCP的连接建立和连接关闭,都是通过请求-响应的模式完成的。
TCP 流
TCP 流,就是英文的 TCP Stream。Stream 这个词有“流”的意思,也有“连续的 事件”这样一个含义,所以它是有前后、有顺序的,这也正对应了 TCP 的特性。
一个 TCP 流,对应的就是一个五元组:传输协议类型、源 IP、源端口、目的 IP、目的端口。
握手
三次握手流程
第一步:客户端发送 SYN(同步请求)
- 报文内容:
- 标志位:
SYN=1
(请求建立连接) - 序列号(Sequence Number):
seq=x
(随机生成的初始值)
- 标志位:
- 客户端状态:
SYN_SENT
- 作用:客户端向服务器声明自己的初始序列号(
x
),请求建立连接。
第二步:服务器回复 SYN-ACK(同步确认)
- 报文内容:
- 标志位:
SYN=1
(接受连接请求) +ACK=1
(确认客户端的 SYN) - 序列号:
seq=y
(服务器随机生成的初始值) - 确认号(Acknowledgment Number):
ack=x+1
(期望收到客户端下一个报文的序列号)
- 标志位:
- 服务器状态:
SYN_RECEIVED
- 作用:
- 确认客户端的
SYN
(通过ack=x+1
) - 声明服务器的初始序列号(
y
)
- 确认客户端的
第三步:客户端发送 ACK(最终确认)
- 报文内容:
- 标志位:
ACK=1
- 序列号:
seq=x+1
(客户端初始序列号 +1) - 确认号:
ack=y+1
(期望收到服务器下一个报文的序列号)
- 标志位:
- 双方状态:
ESTABLISHED
- 作用:
- 确认服务器的
SYN
(通过ack=y+1
) - 连接正式建立,双方可开始传输数据。
- 确认服务器的
关键机制解析
-
序列号(Sequence Number):
- 初始值为随机数(防止历史报文干扰)
- 后续数据按序列号顺序传输,确保可靠性。
-
为什么需要三次握手?
- 防止已失效的连接请求:若只有两次握手,网络中滞留的旧
SYN
报文可能被服务器误认为新请求,导致资源浪费。 - 双向确认:确保双方均确认对方的发送和接收能力正常。
- 防止已失效的连接请求:若只有两次握手,网络中滞留的旧
抓包示例(Wireshark视角)
No. Time Source Destination Protocol Info
1 0.000000 Client_IP Server_IP TCP SYN (seq=100)
2 0.000042 Server_IP Client_IP TCP SYN, ACK (seq=200, ack=101)
3 0.000078 Client_IP Server_IP TCP ACK (seq=101, ack=201)
- 观察要点:
- 三次交互的
SYN
和ACK
标志位变化 - 序列号(
seq
)和确认号(ack
)的递增逻辑 - 时间间隔(RTT,反映网络延迟)
- 三次交互的
常见问题与故障场景
-
握手失败原因:
- SYN未到达:防火墙拦截、网络不通
- SYN-ACK未返回:服务器未监听端口、负载过高
- ACK丢失:客户端未正确处理 SYN-ACK
-
SYN洪泛攻击(SYN Flood):
- 攻击者伪造大量
SYN
请求但不回复ACK
,耗尽服务器资源。 - 防御:SYN Cookie 技术、限制半开连接数。
- 攻击者伪造大量
扩展思考
- 四次挥手(连接终止):通过
FIN
和ACK
报文分四次交互,确保数据完整传输。 - TCP Fast Open(TFO):优化握手流程,允许在首次 SYN 中携带数据(需协议支持)。
掌握三次握手原理后,可通过 Wireshark 抓包验证理论,并进一步分析网络延迟、连接重置(RST)等故障。
挥手
以下是 TCP 四次挥手(Four-way Handdrawal) 的详细解析,这是 TCP 连接终止的标准过程,确保双方数据完整传输并安全释放资源:
四次挥手流程
第一步:主动关闭方发送 FIN(终止请求)
- 报文内容:
- 标志位:
FIN=1
(请求终止连接) - 序列号(Sequence Number):
seq=u
(当前已传输数据的最后一个字节序号 +1)
- 标志位:
- 主动方状态:从
ESTABLISHED
变为FIN_WAIT_1
- 作用:通知对方“我已无数据发送,请求关闭连接”(但仍可接收数据)。
第二步:被动关闭方回复 ACK(确认终止请求)
- 报文内容:
- 标志位:
ACK=1
- 确认号(Acknowledgment Number):
ack=u+1
(确认 FIN 报文) - 序列号:
seq=v
(被动方当前数据序号)
- 标志位:
- 被动方状态:从
ESTABLISHED
变为CLOSE_WAIT
- 作用:
- 确认收到 FIN 请求(
ack=u+1
) - 被动方可能仍有数据待发送(此时进入半关闭状态,只能发送不能接收)。
- 确认收到 FIN 请求(
第三步:被动关闭方发送 FIN(最终关闭请求)
- 报文内容:
- 标志位:
FIN=1
+ACK=1
- 序列号:
seq=w
(若第二步后被动方未发送新数据,则w=v
) - 确认号:
ack=u+1
(与第二步一致)
- 标志位:
- 被动方状态:从
CLOSE_WAIT
变为LAST_ACK
- 触发条件:被动方数据全部发送完成后,主动发起 FIN 请求。
第四步:主动关闭方回复 ACK(最终确认)
- 报文内容:
- 标志位:
ACK=1
- 序列号:
seq=u+1
(第一步 FIN 报文的序列号 +1) - 确认号:
ack=w+1
(确认被动方的 FIN 报文)
- 标志位:
- 主动方状态:从
FIN_WAIT_2
进入TIME_WAIT
(等待 2MSL 后关闭) - 作用:
- 确保被动方收到最终 ACK(若丢失,被动方会重传 FIN)
- 等待处理网络中残留的旧报文(防止干扰新连接)。
关键机制解析
-
为什么需要四次挥手?
- TCP 是全双工协议,双方需独立关闭各自的发送通道:
- 主动方发 FIN 表示“我不再发送数据”
- 被动方发 FIN 表示“我也停止发送数据”
- ACK 和 FIN 不能合并发送(被动方可能需处理遗留数据)。
- TCP 是全双工协议,双方需独立关闭各自的发送通道:
-
TIME_WAIT 状态的意义:
- 等待时间:2MSL(Maximum Segment Lifetime,报文最大生存时间,通常 60~120秒)
- 核心作用:
- 确保最后一个 ACK 到达被动方(若丢失,被动方会重传 FIN)
- 清除网络中滞留的旧报文(避免与新连接冲突)。
-
半关闭状态(Half-Close):
- 在第二步后,被动方处于
CLOSE_WAIT
状态,仍可向主动方发送数据。 - 典型场景:服务器通知客户端“数据已传完,准备关闭”。
- 在第二步后,被动方处于
抓包示例(Wireshark视角)
No. Time Source Destination Protocol Info
1 0.000000 Client_IP Server_IP TCP FIN, ACK (seq=1000, ack=5000)
2 0.000042 Server_IP Client_IP TCP ACK (seq=5000, ack=1001)
3 5.000120 Server_IP Client_IP TCP FIN, ACK (seq=5000, ack=1001)
4 5.000150 Client_IP Server_IP TCP ACK (seq=1001, ack=5001)
- 观察要点:
- 前两次交互关闭主动方通道,后两次关闭被动方通道。
- 序列号和确认号的递增逻辑(
ack=seq+1
)。 - 时间戳差异(第三步可能有延迟,因被动方需处理数据)。
常见问题与故障场景
-
挥手异常情况:
- FIN 丢失:主动方重传 FIN(超时机制)。
- LAST_ACK 状态卡死:若第四步 ACK 丢失,被动方持续重传 FIN。
- 大量 TIME_WAIT 连接:高频短连接导致端口耗尽(优化:调整
SO_REUSEADDR
参数)。
💡注意:慎用
net.ipv4.tcp_tw_recycle = 1
,可能导致 NAT 问题。 -
为什么有时看到三次挥手?
- 被动方的 ACK 和 FIN 可能合并发送(当被动方无数据待发时),但严格遵循 TCP 标准应为四次。
-
恶意 FIN 攻击:
- 攻击者伪造 FIN 报文强制关闭连接。
- 防御:校验 SEQ/ACK 号合法性,或启用 TCP 身份验证(如 TCP-AO)。
问题现象 | 可能原因 | 排查方法 |
---|---|---|
仅有SYN无响应 | 防火墙拦截/服务未启动 | 检查目标端口netstat -tulpn |
FIN后长时间无ACK | 应用层未释放连接 | 跟踪应用close()调用 |
出现多个FIN包 | TCP连接复用 | 检查HTTP Keep-Alive设置 |
RST替代FIN | 应用异常终止 | 结合程序日志分析 |
扩展思考
- 同时关闭(Simultaneous Close):双方同时发送 FIN,进入
CLOSING
状态,最终通过 ACK 确认。 - RST 报文强制终止:通过
RST=1
直接重置连接(不经历四次挥手,用于异常场景)。
掌握四次挥手机制后,可有效诊断以下问题:
- 服务器出现大量
CLOSE_WAIT
连接(通常因应用未正确调用close()
) - 客户端
TIME_WAIT
积累导致无法建立新连接 - 防火墙误杀 FIN/ACK 报文导致连接无法正常关闭
排查工具
常见排查工具如下:
- 应用层 HTTP:浏览器开发工具
- 表示层/会话层:浏览器开发工具、tcpdump + wireshark
- 传输层:nc、iftop、telnet、netstat、ss
- 网络层:traceroute、route、mtr、ip
- 数据链路层/物理层:ethtool