📄 一句话概括
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 秒实验
- netstat -ano 看本机连接的四元组。
- 想想两条【本机 5000 → 同一服务器 80】的连接怎么区分(源端口不同)。
- 查查【端口复用】什么时候才允许(SO_REUSEPORT)。
常见误区
- 以为目的端口就能定位连接——四元组才行。
- 以为 IP 层直接交应用——先过 TCP 组织成流。
自测三问(点开对答案)
1. IP 层分派看什么? —— 协议号(6/17)。 2. TCP 命中套接字靠什么? —— 四元组完全匹配。 3. 为什么要四元组? —— 同端口服务多连接,须唯一区分。- ☐ 下一节(2.6.1 不需要重发的数据用UDP发送更高效)
相关笔记
- 套接字的实体就是通信控制信息 — 控制信息兑现
- 接收HTTP响应消息 — 数据的归宿
- 🔌 网络是怎样连接的 · 索引