🔌 第六章 请求到达Web服务器,响应返回浏览器
📄 一句话概括

包交到 IP 模块查两件事:目的 IP 是不是自己(不是就按转发处理)、协议号是几(6 交 TCP、17 交 UDP)——与客户端侧的分派规则一字不差。

📝 本节和前面几节的关系

包进协议栈第一层 IP;本篇看 IP 的两个判断。

一、两个判断

目的 IP 是不是我:是就收下自己处理; 不是(路由器场景)就按 3.3.4 查表转发; 协议号:6 交 TCP、17 交 UDP——决定下一站。

二、规矩不分主客

与 2.5.11 的客户端侧分派完全一致; IP 模块只有一个,收发共用。

三、动手 Demo:IP 层的分派

包交到 IP 模块,先查两件事:

for a, b in [('目的 IP 是不是我','不是就转发,是就收下'),
             ('协议号','6 -> TCP,17 -> UDP')]:
    print('%-14s %s' % (a, b))

实跑输出:

--------------------------------------------------------------------
IP 层的分派
--------------------------------------------------------------------
  包交到 IP 模块,先查两件事:

  查什么               结论
  ------------------------------------------------------------
  目的 IP 是不是我     不是就转发(服务器上不常见),是就收下
  协议号               6 -> TCP,17 -> UDP
  ------------------------------------------------------------

  与 2.5.11 客户端侧的分派规则完全一致——
  规矩不分主客。

⭐ 2026 现状:协议号 41(IPv6 隧道)、47(GRE) 等也走同一张分派表——机制从未变过。

30 秒实验

  1. 背出 TCP 与 UDP 的协议号。
  2. 想想服务器什么时候也会走【转发】分支。
  3. 对照 2.5.3 复习 IP 头里的关键字段。

常见误区

  1. 以为 IP 收包要判断很多——核心就两个判断。
  2. 以为客户端与服务器的 IP 层不同——同一个模块。
自测三问(点开对答案) 1. IP 模块查什么? —— 目的 IP、协议号。 2. 协议号 6 是谁? —— TCP。 3. 目的 IP 不是自己怎么办? —— 按路由表转发。

相关笔记