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

套接字的实体是内存里的一块通信控制信息——对端地址、状态、缓冲都在里面;协议栈靠它记住每条连接的一切。

📝 本节和前面几节的关系

2.1.1 看到套接字挂在 TCP 层;本篇打开这块【控制信息】看看写了什么。

一、一块内存的故事

【连接】这种东西在物理世界并不存在—— 存在的只是两边内存里各自的一块记录。 记录里写:对端 IP/端口、本端端口、状态、收发缓冲。

二、为什么需要它

协议栈是【无记忆的工人】——每收到一个包, 全靠这块信息判断它是哪条连接的、收到哪一步了。

三、动手 Demo:套接字的实体

打开一块控制信息:

for f, v, w in [('对端 IP','172.20.1.1','connect'),
               ('对端端口','80','connect'),
               ('本端端口','51234','协议栈分配'),
               ('状态','ESTABLISHED','随阶段变')]:
    print('%-10s %-16s %s' % (f, v, w))

实跑输出:

--------------------------------------------------------------------
套接字的实体
--------------------------------------------------------------------
  打开一个套接字,里面记着什么:

  字段                       例子            谁写
  ----------------------------------------------------------
  对端 IP                    172.20.1.1      connect
  对端端口                   80              connect
  本端端口                   51234           协议栈自动分配
  状态                       ESTABLISHED     连接/断开时变
  收发缓冲、ACK 待确认等     -               TCP 层维护
  ----------------------------------------------------------

  【套接字的实体就是通信控制信息】——一块内存,
  协议栈靠它想起每条连接的来龙去脉。

1.4.2 说【创建套接字】——现在能说清:创建的就是这块内存。

30 秒实验

  1. 用 netstat -ano 找一条连接,对照本节的字段。
  2. 想想【拔网线】时这块内存发生了什么变化。
  3. 两条连接的控制信息会不会混——为什么不会。

常见误区

  1. 以为套接字是硬件或文件——它是纯内存结构。
  2. 以为连接断了控制信息就没了——还有等待期(2.4.2)。
自测三问(点开对答案) 1. 套接字的实体是什么? —— 内存里的通信控制信息。 2. 控制信息里至少记着什么? —— 对端地址、端口、状态、收发缓冲。 3. 协议栈靠它做什么? —— 判断包属于哪条连接、进行到哪步。

相关笔记