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

控制信息不进套接字就进头部——TCP 头管端口与对账、IP 头管端到端、MAC 头管下一跳;收方一层只剥一层。

📝 本节和前面几节的关系

2.2.1 说连接靠记录;本篇看【记录】除了存在内存里,还有一部分随包出门——那就是头部。

一、两层记录

套接字里的记录是静态账本(这条连接的整体状态); 包头里的记录是随包裹的便签(这个包的序号等)。 两者配合才能对账。

二、三个头三个信封

TCP 头(端口、序号、ACK、窗口)、IP 头(源/目的 IP、协议号)、 MAC 头(源/目的 MAC、类型)——2.5 节逐个展开。

三、动手 Demo:头部的分工

三个头各管一摊:

for h, w, d in [('TCP 头','TCP 层','端口、序号、ACK、窗口'),
               ('IP 头','IP 层','源/目的 IP、协议号'),
               ('MAC 头','网卡驱动','源/目的 MAC、类型')]:
    print('%-8s %-8s %s' % (h, w, d))

实跑输出:

--------------------------------------------------------------------
头部的分工
--------------------------------------------------------------------
  每一层都给数据加一个头,控制信息各归各:

  头部       谁加         记着什么
  ----------------------------------------------
  TCP 头     TCP 层       端口、序号、ACK、窗口
  IP 头      IP 层        源/目的 IP、协议号
  MAC 头     网卡驱动     源/目的 MAC、类型
  ----------------------------------------------

  收包方反着剥:MAC 头给驱动看、IP 头给 IP 层看、
  TCP 头给 TCP 层看——一层只读自己的信封。

【一层只读自己的信封】是分层世界的礼貌—— 越层读信既没必要也会乱。

30 秒实验

  1. 用 Wireshark 抓一个包,数出三个头依次的字节数。
  2. 找一条包的 TCP 头里的窗口字段值。
  3. 想想为什么 MAC 头在最外面。

常见误区

  1. 以为头部只加一次——每层各加各的。
  2. 以为控制信息只在包头——套接字里还有一本静态账。
自测三问(点开对答案) 1. 控制信息存在哪两处? —— 套接字(静态)和包头(随包)。 2. 三个头分别是谁加的? —— TCP 层、IP 层、网卡驱动。 3. 收包时怎么处理头部? —— 一层只剥自己那层。

相关笔记