diff --git a/_posts/network/how-is-the-network-connected/2024-12-20-network-chap1.md b/_posts/network/how-is-the-network-connected/2024-12-20-network-chap1.md index 6421216c290..15607383158 100644 --- a/_posts/network/how-is-the-network-connected/2024-12-20-network-chap1.md +++ b/_posts/network/how-is-the-network-connected/2024-12-20-network-chap1.md @@ -40,7 +40,58 @@ IP地址由网络号和主机号组成,网络号和主机号的分配关系是 Ip难以记忆,于是使用域名来映射IP,DNS(DNS:domain name system)的机制就是有一个地方来通过域名查询IP。 ### Socket库提供查询IP地址的功能 +我们的计算机上一定有DNS解析器,解析器实际上是一段程序,它包含在操作系统的socket库中。 +socket库可以让其他的应用程序调用操作系统的网络功能。 + +socket库最开始是c语言的,如今其实是一种标准库,其他语言也有实现。 +### 通过解析器向DNS服务器发出查询 +调用解析器,解析器会向DNS服务器发送查询消息,然后DNS服务器会返回响应消息,响应消息中包含了查询到的IP地址。 + +浏览器再将IP地址和HTTP请求消息一起交给操作系统。 +### 解析器的内部原理 +向DNS服务器发送消息时,也需要知道DNS服务器的IP地址,这个IP地址是事先在系统中设置的。 + +## 全世界DNS服务器的大接力 +### DNS服务器的基本工作 +DNS服务器的基本工作就是接受来自客户端的查询消息,然后根据消息的内容返回响应。 + +查询消息包含以下三种信息: +1. 域名 +2. Class: IN +3. 记录类型: + 1. A:表示域名对应的IP地址 + 2. MX:表示对应的邮件服务器 + 3. ... + +| 域名 | Class | 记录类型 | 响应数据 | +|------------------------|-------|----------|-----------------------| +| www.lab.glasscom.com | IN | A | 192.0.2.226 | +| glasscom.com | IN | MX | 10 mail.glasscom.com | +| mail.glasscom.com | IN | A | 192.0.2.227 | + + +### 域名的层次结构 + +世界上不可能只有一台DNS服务器,互联网中有数万台DNS服务器,它们是层级关系的,上一级注册了下一级的IP地址,而最底层的称为根域,分配给根域DNS服务器的IP地址全世界只有13个,这些地址几乎不发生变化,所以这些地址保存在所有的DNS服务器中。 +![](/img/network/ename.png) +当客户端需要查询域名对应的IP时,它会先去最近的DNS服务器中找到根域,然后从根域逐层向下查询,如果当前DNS服务器没有需要的信息,它就会告诉客户端下一层DNS服务器的IP地址,直到客户端找到需要的结果。 + +![alt text](/img/network//dns-1.png) + +## 通过缓存加快DNS服务器的响应 +为了加速查询,DNS服务器中有缓存记录着查询过的域名的结果。 + +## 委托协议栈发送消息 +通过DNS服务器查询到IP地址后,就可以委托操作系统内部的协议栈向目标地址的服务器发送消息了。 + +其实可以理解为数据的传输和接收都必须要经过操作系统的底层库来操作,形象的理解就是要形成一条数据流通的管道。 + +建立管道的流程是: +1. 创建套接字 +2. 将管道连接到服务器端的套接字: connect +3. 收发数据: write/read +4. 断开管道并删除套接字: close