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

翻译官叫解析器(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 秒实验

  1. 在 Python 里跑 socket.getaddrinfo('example.com', 80),看返回的 IP。
  2. 断网再跑同一段代码,观察它卡在哪个环节。
  3. 查一下自己系统的 /etc/hosts(Windows 的 hosts 文件),
  4. 理解解析器查询前的本地优先。

常见误区

  1. 以为解析器是浏览器的部件——它属于操作系统,谁都可用。
  2. 以为 Socket 库是网络协议——它是给应用程序用的功能入口。
自测三问(点开对答案) 1. 解析器住在哪个库里? —— 操作系统的 Socket 库。 2. 应用程序查 IP 的入口函数叫什么? —— gethostbyname(现代为 getaddrinfo)。 3. 库的意义是什么? —— 常用功能打包好,应用程序不必重造。

相关笔记