🔌 第一章 浏览器生成消息
📄 一句话概括

socket() 在内存里划一块记通信控制信息、返回一个描述符——它是操作系统的门牌;本机多条连接各占一格,互不混淆。

📝 本节和前面几节的关系

1.4.1 看了全景;本篇进第一阶段——【建一个】到底建了什么。

一、套接字的实体

是内存里的一块通信控制信息:对方地址、状态、缓冲等。 应用程序看不见它,只能通过描述符间接操作。

二、描述符与多条连接

浏览器同时开多条连接时,每条各有描述符(3、4、5……); 同一台服务器同一端口也可以同时挂着两条独立管道。

三、动手 Demo:创建套接字,拿到门牌

本机三张管道的门牌表:

rows = [('3','A 主页面','172.20.1.1:80'),
        ('4','B 同服务器图片','172.20.1.1:80'),
        ('5','C DNS 查询','192.168.0.1:53')]
for fd, who, peer in rows:
    print('%s  %-10s -> %s' % (fd, who, peer))

实跑输出:

--------------------------------------------------------------------
创建套接字,拿到门牌
--------------------------------------------------------------------
  本机同时开了好几条连接时,靠描述符分清谁是谁:

  描述符     本端套接字                远端(连到哪)
  ----------------------------------------------------
  3          A(浏览器主页面)         172.20.1.1:80
  4          B(同一服务器的图片)     172.20.1.1:80
  5          C(DNS 查询)             192.168.0.1:53
  ----------------------------------------------------

  注意 A 和 B 连的是同一台服务器同一端口,
  但它们是两条独立的管道——本端的描述符不同,
  协议栈内部还各有一套通信控制信息(套接字的实体)。

  socket() 干的事:划一块内存记控制信息 + 发一个号。

A 和 B【同名同端口】却不混——套接字实体在协议栈里 各有各的控制信息块,描述符只是入口的号。

30 秒实验

  1. 在 Python 里连开两个 socket 连同一目标,各自 send,验证互不串。
  2. 打印一个 socket 对象,看描述符数值。
  3. 查一下【为什么描述符从 3 开始】(0/1/2 是标准流)。

常见误区

  1. 以为描述符是 IP 或端口——它是本机内部的号码。
  2. 以为同端口的两条连接会互相覆盖——控制信息各自独立。
自测三问(点开对答案) 1. 套接字的实体是什么? —— 内存里的通信控制信息。 2. 描述符的作用是什么? —— 本机内标识要操作哪个套接字。 3. 两条连接同对端同端口会混吗? —— 不会,控制信息各占一块。

相关笔记