📄 一句话概括
翻译官叫解析器(resolver),住在操作系统的 Socket 库里;应用程序调一行 gethostbyname,剩下的活全归它。
📝 本节和前面几节的关系
1.2.2 留下了【谁来翻译】的问题;本篇给答案——翻译官在系统里现成地住着,直接叫它。
一、库是什么
库=打包好的通用功能集,放在操作系统里, 任何应用程序都能调用——写网络程序不必从零造轮子。 Socket 库是其中管通信的那一组。
二、解析器在哪里
解析器是 Socket 库里负责 DNS 查询的那段程序; 对应用程序暴露的入口就是 gethostbyname(现代系统叫 getaddrinfo)。
三、调用的形状
应用程序传【域名】进去,拿【IP】出来—— 一行代码,一次等待,后面 1.2.4/1.2.5 讲它内部跑的腿。
四、动手 Demo:调用 Socket 库查 IP
调用序列像去前台问登记簿:
steps = ['应用程序: gethostbyname(www.lab.glb.com)',
' | 进入 Socket 库(解析器)',
' | 组查询消息 -> 委托协议栈发 UDP',
' | DNS 服务器回话',
'应用程序: 拿到 172.20.1.1,继续干活']
for s in steps: print(s)
实跑输出:
--------------------------------------------------------------------
调用 Socket 库查 IP
--------------------------------------------------------------------
应用程序查 IP 的完整调用序列,像去前台问登记簿:
应用程序: <IP地址, 服务器名> gethostbyname
|
v 进入 Socket 库(解析器住在这里)
解析器: 组查询消息 -> 委托协议栈发给 DNS 服务器
|
v DNS 服务器回话
解析器: 取出 IP -> 返回
|
v
应用程序: 拿到 172.20.1.1,继续干活
应用程序只写一行 gethostbyname,剩下的全是解析器的活——
这就是【库】的意义:常用的功能打包好,谁来都能用。
现代 Python 里对应 socket.getaddrinfo('www.lab.glb.com', 80)—— 名字换了,位置与职责没变。
30 秒实验
- 在 Python 里跑 socket.getaddrinfo('example.com', 80),看返回的 IP。
- 断网再跑同一段代码,观察它卡在哪个环节。
- 查一下自己系统的 /etc/hosts(Windows 的 hosts 文件),
- 理解解析器查询前的本地优先。
常见误区
- 以为解析器是浏览器的部件——它属于操作系统,谁都可用。
- 以为 Socket 库是网络协议——它是给应用程序用的功能入口。
自测三问(点开对答案)
1. 解析器住在哪个库里? —— 操作系统的 Socket 库。 2. 应用程序查 IP 的入口函数叫什么? —— gethostbyname(现代为 getaddrinfo)。 3. 库的意义是什么? —— 常用功能打包好,应用程序不必重造。- ☐ 下一节(1.2.4 通过解析器向DNS服务器发出查询)
相关笔记
- 使用DNS自动获取IP地址(资源记录、DNS解析模块、递归查询) —— 12 课视角的同一件事
- 通过解析器向DNS服务器发出查询 —— 跑腿细节
- 🔌 网络是怎样连接的 · 索引