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

普通数据包按四元组精确命中套接字:数据进接收缓冲、校对序号、回 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 秒实验

  1. 写出四元组的四个成员。
  2. 想想两个客户端连同一端口,包怎么各归各位。
  3. 对照 2.3.3 复习 ACK 号的含义。

常见误区

  1. 以为按端口就能找到套接字——四元组才能唯一确定。
  2. 以为收到的数据直接给程序——先进缓冲排队。
自测三问(点开对答案) 1. 找套接字靠什么? —— 四元组精确匹配。 2. 数据先放哪? —— 接收缓冲。 3. 谁取走数据? —— 应用程序 read()。

相关笔记