📄 一句话概括
普通数据包按四元组精确命中套接字:数据进接收缓冲、校对序号、回 ACK、应用程序 read 取走——2.5.11 说的分派规则在服务器端现场重演。
📝 本节和前面几节的关系
连接建立后的大多数包是数据包;本篇看它们的归途。
一、归途四步
按四元组找到专属套接字(连接包时写好的); 数据放进接收缓冲; 校对序号,回 ACK; 应用程序 read() 把数据取走。
二、与客户端互为镜像
2.3.3~2.3.5 讲的序号、ACK、窗口机制在这里全部生效—— TCP 的可靠传输不分主客。
三、动手 Demo:数据包的处理
普通数据包来了,TCP 按四元组找套接字:
for s in ['源 IP + 源端口 + 目的 IP + 目的端口',
-> 精确命中某一位客人的专属套接字']:
print(s)
print()
print('数据进接收缓冲 -> 校对序号 -> 回 ACK')
print('-> 应用程序 read() 取走')
实跑输出:
--------------------------------------------------------------------
数据包的处理
--------------------------------------------------------------------
普通数据包来了,TCP 按四元组找套接字:
源 IP + 源端口 + 目的 IP + 目的端口
-> 精确命中某一位客人的专属套接字
数据进接收缓冲 -> 校对序号 -> 回 ACK
-> 应用程序 read() 取走
2.5.11 说过【按四元组分派】,这里是它的服务器现场。
找到套接字=找到了这位客人的全部状态(缓冲、序号), 6.1.2 的多任务之所以能对号入座,靠的就是这一步。
30 秒实验
- 写出四元组的四个成员。
- 想想两个客户端连同一端口,包怎么各归各位。
- 对照 2.3.3 复习 ACK 号的含义。
常见误区
- 以为按端口就能找到套接字——四元组才能唯一确定。
- 以为收到的数据直接给程序——先进缓冲排队。
自测三问(点开对答案)
1. 找套接字靠什么? —— 四元组精确匹配。 2. 数据先放哪? —— 接收缓冲。 3. 谁取走数据? —— 应用程序 read()。- ☐ 下一节(6.2.5 TCP 模块的断开操作)
相关笔记
- 使用ACK号确认网络包已收到 — ACK 机制
- TCP 模块的断开操作 — 故事的尾声
- 🔌 网络是怎样连接的 · 索引