🔌 第二章 用电信号传输TCP/IP数据
📄 一句话概括

IP 层按协议号分派:6 给 TCP、17 给 UDP;TCP 再按四元组(源/目的 IP+端口)精确命中套接字,把数据放进对应接收缓冲。

📝 本节和前面几节的关系

包上交了;本篇看它最后怎么找到【属于哪条连接】。

一、两级分派

IP 层看协议号:6→TCP、17→UDP; TCP 看四元组:源 IP+源端口+目的 IP+目的端口, 四样全对上才算这条连接的包。

二、为什么需要四元组

同一台服务器 80 端口同时服务上千连接—— 只看目的端口分不清,四元组才能唯一命中。

三、动手 Demo:IP 把包递给 TCP

两级分派:

for s in ['看 IP 头协议号:',
          '  6  -> TCP 模块',
          '  17 -> UDP 模块',
          'TCP 按 四元组 精确命中套接字']:
    print(s)

实跑输出:

--------------------------------------------------------------------
IP 把包递给 TCP
--------------------------------------------------------------------
  IP 层收到载荷后的分派逻辑:

    看 IP 头协议号:
      6  -> TCP 模块(按 TCP 头端口找套接字)
      17 -> UDP 模块
      1  -> ICMP(控制消息,给协议栈自己看)

  TCP 再按【源IP+源端口+目的IP+目的端口】四元组
  精确命中是哪条连接的套接字。

1.4.2 的门牌表在这里兑现——描述符背后, 就是靠四元组维系的对应关系。

30 秒实验

  1. netstat -ano 看本机连接的四元组。
  2. 想想两条【本机 5000 → 同一服务器 80】的连接怎么区分(源端口不同)。
  3. 查查【端口复用】什么时候才允许(SO_REUSEPORT)。

常见误区

  1. 以为目的端口就能定位连接——四元组才行。
  2. 以为 IP 层直接交应用——先过 TCP 组织成流。
自测三问(点开对答案) 1. IP 层分派看什么? —— 协议号(6/17)。 2. TCP 命中套接字靠什么? —— 四元组完全匹配。 3. 为什么要四元组? —— 同端口服务多连接,须唯一区分。

相关笔记