1. 同一个请求,为什么会有好几种地址
前面已经整理了地址与 DNS和子网划分。但抓包时,除了 IP 和 MAC,还会看到端口、序列号、协议号和各种长度。
这一篇把第五天的分层模型、第七天的传输层,以及第八天的可靠性、MTU 和 MSS 放在一起理解。
先抓住一条主线:应用产生数据,每一层加上完成自己工作所需的信息,接收方再逐层处理。
2. OSI 七层与 TCP/IP 模型
| OSI 层次 | 可以先这样理解 | TCP/IP 四层模型中的位置 |
|---|---|---|
| 应用层 | 应用使用的通信协议与服务 | 应用层 |
| 表示层 | 数据表示、编码等功能 | 应用层 |
| 会话层 | 会话建立、维持等功能 | 应用层 |
| 传输层 | 端到端传输,区分应用端点 | 传输层 |
| 网络层 | 逻辑寻址与跨网络转发 | 网际层 |
| 数据链路层 | 本地链路上的帧交付 | 网络接口层 |
| 物理层 | 传输电信号、光信号等 | 网络接口层 |
教材还常把 TCP/IP 的网络接口层拆成数据链路层和物理层,得到便于教学的五层表示。模型有不同划分方式,不意味着同一个数据包真的走了两套网络。
OSI 更适合用来划分职责,实际协议的功能也未必严格落在单独一格里。
3. 封装:每一层关心不同的问题
以 IPv4 以太网上的普通 HTTP/1.1 请求为例:
应用数据 ↓ 加 TCP 首部TCP 段:源端口、目的端口、序列号等 ↓ 加 IPv4 首部IP 包:源 IP、目的 IP、TTL 等 ↓ 加以太网首部与帧校验信息以太网帧:源 MAC、目的 MAC、Type、FCS 等 ↓ 物理层发送信号 / 比特流PDU 是“协议数据单元”的统称。入门时常把 TCP 的 PDU 叫段,UDP 的叫数据报,网络层的叫包,数据链路层的叫帧。
3.1 三种“交给谁”
| 字段 | 接收方用它判断什么 |
|---|---|
| 以太网 Type | 帧中承载的是 IPv4、ARP 还是其他协议 |
| IPv4 Protocol | 上层是 TCP(6)、UDP(17)还是其他协议 |
| TCP/UDP 目的端口 | 交给本机的哪个传输层端点 |
协议号 6 不是 TCP 端口 6。不同层的字段要分开理解。
以太网 FCS 使用 CRC 检测传输错误,它不是加密,也不是“没有 FCS 错误就一定安全”。另外,抓包能否显示 FCS,取决于网卡、驱动和抓包位置。
4. 端口把通信交给具体应用
TCP 和 UDP 的端口字段都是 16 位,取值范围为 0~65535。其中 0 是保留端口,不能把完整范围简单写成 1~65535。
按 IANA 端口登记表的分类,系统端口为 0~1023、用户端口为 1024~49151、动态或私有端口为 49152~65535。客户端临时端口的实际分配范围仍取决于操作系统。
| 服务 | 常见端口 | 本文需要记住的边界 |
|---|---|---|
| HTTP | TCP 80 | 常见 HTTP/1.1 默认端口 |
| HTTPS | 443 | 常见 HTTP/1.1、HTTP/2 使用 TCP;HTTP/3 使用 QUIC/UDP |
| DNS | UDP/TCP 53 | 不能认为 DNS 只使用 UDP |
| FTP | TCP 21、20 | 21 用于控制;20 是传统主动模式的服务器数据端口 |
| TFTP | UDP 69 | 初始请求端口,后续传输使用选定的传输标识端口 |
| DHCPv4 | UDP 67、68 | 服务器 67,客户端 68 |
| Telnet | TCP 23 | 远程终端协议 |
| SSH | TCP 22 | 加密远程登录协议 |
这些都是常见约定,服务也可以配置其他端口。FTP 被动模式更不是固定用 20 传数据。
假设客户端用本地端口 51000 访问服务器的 80 端口,返回时源、目的端口方向相反。连接识别还要结合双方 IP 和传输协议,而不只看一个端口数字。
5. TCP 与 UDP 的区别,不能只背“快”和“慢”
| 对比项 | TCP | UDP |
|---|---|---|
| 通信方式 | 面向连接 | 无连接数据报 |
| 数据组织 | 字节流,不保留应用消息边界 | 保留数据报边界 |
| 有序可靠交付 | 协议提供确认、重传、排序等机制 | 协议自身不提供这些保证 |
| 流量控制 | 有 | 协议自身没有 |
| 拥塞控制 | 有相应机制 | 协议自身没有,应用需按需实现 |
| 基本首部长度 | 最少 20 字节,可带选项 | 固定 8 字节 |
TCP 的可靠性并不保证对方业务已经处理成功。连接失败时,应用仍要处理错误;支付、文件保存等业务还需要自己的确认机制。
UDP 本身没有 TCP 式的重传与排序,但运行在 UDP 上的应用或协议可以提供这些能力。不能从“底层是 UDP”直接推出“业务一定不可靠”。
同样,“TCP 一定慢,UDP 一定快”也不成立。性能还取决于网络条件、实现和应用需求。
6. 三次握手在确认什么
以下是不携带应用数据的简化过程:
客户端 A 服务器 B │ │ │── SYN,seq=x ────────────────────────>│ │<─ SYN+ACK,seq=y,ack=x+1 ────────────│ │── ACK,seq=x+1,ack=y+1 ─────────────>│ │ │双方分别提出自己的初始序列号,再确认对方的序列号。SYN 本身占用一个序列号,因此确认值会加 1。
这里 ACK 标志表示确认字段有效,ack 的数值表示期望收到的下一个字节序号,两者不要混为一谈。
6.1 为什么 TCP 叫字节流
假设接下来发送 100 字节,起始序列号为 1001;接收方收到完整连续数据后,确认号可以是 1101。
应用连续两次写入数据,并不意味着接收方一定通过两次读取分别取回。TCP 负责有序字节流,消息边界需要应用协议自己定义。
例如,HTTP 可以通过首部和消息长度等规则区分内容;自定义协议也可以使用长度字段或明确分隔符。
7. 确认、重传和窗口怎样配合
课堂把可靠性拆成确认、重传、排序和流控,可以对应到几个具体问题:
- 对方收到哪里了?看确认号。
- 数据可能丢了怎么办?通过超时或其他丢包检测机制触发重传。
- 到达顺序乱了怎么办?依据序列号组织字节流。
- 对方来不及接收怎么办?受接收窗口约束。
滑动窗口让发送方在等待确认时继续发送一定数量的数据,而不必每发一小段就完全停下来。
同时,接收窗口关注接收方的处理能力,拥塞窗口关注网络中的拥塞情况。可发送的数据还要考虑已经发出但尚未确认的部分,不能把“窗口”理解成随便发送的固定包数。
7.1 连接关闭为什么常画成四次挥手
A B│── FIN ─────────────────>│ A 不再发送│<─ ACK ──────────────────│ B 确认│<─ FIN ──────────────────│ B 也不再发送│── ACK ─────────────────>│ A 确认TCP 的两个方向可以分别关闭,B 确认收到 A 的 FIN 时,可能还要继续发送剩余数据。
这是一张典型示意图,不是“关闭连接必须恰好四个包”的规定。确认与 FIN 可能合并,异常连接也可能通过 RST 终止。上述 TCP 机制可进一步对照 RFC 9293。
8. TTL 限制的是 IP 包继续转发的寿命
路由器转发 IPv4 包时会减少 TTL。若剩余值不足以继续转发,包会被丢弃,并可能返回 ICMP Time Exceeded。
普通二层交换不会像三层转发一样减少 IP TTL。
如果 Ping 回复显示 ttl=127,在已知回复初始 TTL 为 128 的前提下,可以推测回复经过了一次三层转发。但不能仅凭 127 确定对方操作系统,也不能忽略回程路径与去程可能不同。
9. MTU 与 MSS:先问限制的是哪一层
普通以太网常见 IP MTU 是 1500 字节,表示链路能够承载的 IP 包大小上限。它包含 IP 首部,不包含外层以太网首部和 FCS。
MSS 讨论的是一个 TCP 段中的数据部分大小。
在没有 IP/TCP 选项、没有额外隧道开销的 IPv4 示例里:
IP MTU 1500- IPv4 首部 20- TCP 首部 20= TCP 数据 1460 字节所以 1460 是有条件的常见值,不是 TCP 的固定常量。IPv6 首部、隧道、路径中的较小 MTU,以及实际选项开销,都可能影响可承载的数据量。
IMPORTANTMSS 选项表示发送该 SYN 的一端能够接收的最大 TCP 数据段大小。双方分别通告,约束的是对方发来的数据;实际发送大小还要考虑路径限制等条件。它不是简单地让双向通信共同选定一个最小值。参见 RFC 9293 的 MSS 定义。
10. TCP 分段与 IP 分片要分开
TCP 可以把应用字节流组织成多个段。IP 分片则处理一个 IP 包超过相应链路承载能力的问题,发生的层次不同。
IPv4 分片相关字段包括:
| 字段 | 作用 |
|---|---|
| Identification | 同一原始数据报的分片使用相同标识,接收方还要结合源、目的地址和协议等信息重组 |
| DF | Don’t Fragment,不允许分片 |
| MF | More Fragments,后面是否还有分片 |
| Fragment Offset | 分片在原始数据中的位置,以 8 字节为单位 |
IPv4 包过大且允许分片时,路由器可能进行分片;如果设置 DF 而链路又放不下,则需要丢弃并按条件返回 ICMP 通知。IPv6 路由器不会替源主机分片。
UDP 没有 TCP 那样的流式分段机制,但承载 UDP 的 IP 包仍可能发生 IPv4 分片。因此“UDP 不分段”不等于“UDP 的 IP 包绝不会分片”。
11. 抓包时按层找证据
在 eNSP 中复用已经建立的客户端、服务器拓扑,可以尝试这些 Wireshark 显示过滤器:
tcp.flags.syn == 1tcp.flags.fin == 1tcp.analysis.retransmissionip.flags.mf == 1 || ip.frag_offset > 0查看握手时的 MSS 选项、TCP 序列号与确认号、IP TTL 和包长,再对照外层 MAC。
过滤器只能帮助定位现象。没有捕获到重传或分片并不意味着实验失败;如果没有制造对应条件,正常通信本来就可能看不到它们。
下一篇:VRP 设备管理、远程登录与配置保存。