📄 一句话概括
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 秒实验
- 在 Python 里连开两个 socket 连同一目标,各自 send,验证互不串。
- 打印一个 socket 对象,看描述符数值。
- 查一下【为什么描述符从 3 开始】(0/1/2 是标准流)。
常见误区
- 以为描述符是 IP 或端口——它是本机内部的号码。
- 以为同端口的两条连接会互相覆盖——控制信息各自独立。
自测三问(点开对答案)
1. 套接字的实体是什么? —— 内存里的通信控制信息。 2. 描述符的作用是什么? —— 本机内标识要操作哪个套接字。 3. 两条连接同对端同端口会混吗? —— 不会,控制信息各占一块。- ☐ 下一节(1.4.3 连接阶段:把管道接上去)
相关笔记
- 连接阶段:把管道接上去 —— 下一阶段
- Socket库提供查询IP地址的功能 —— 同一个库的另一组功能
- 🔌 网络是怎样连接的 · 索引