生成http请求消息
网址,准确的来说叫做URL:uniform resource locator 统一资源定位符。
有各种各样的URL,我们通常是使用浏览器来访问web服务器的,但其实浏览器也可以访问FTP服务器。
- 生成HTTP消息
- 查询IP
向DNS服务器查询Web服务器的IP地址
浏览器能够解析网站并生成http消息,但它本身并不具备将消息发送到网络中的功能,这一功能需要委托操作系统来实现。
IP地址的基本知识
TCP/IP网络是由小的子网通过路由器连接起来组成的。
实际的IP地址是一串32比特的数字,按照8比特分为一组,分别用十进制表示再用.
隔开,如10.11.12.13。
IP地址由网络号和主机号组成,网络号和主机号的分配关系是靠子网掩码来确定的。比如10.11.12.13/255.255.255.0
中255.255.255.0
就是子网掩码,IP地址和子网掩码是等长且一一比特对应的,用二进制的角度去看,就是子网掩码为1的就是网络号,为0的就是主机号。
子网掩码可以简化的表达,比如用一个十进制数字来表示网络号有多少位,类似10.11.12.13/24
就代表前24位是网络号。
主机号的两种特殊情况:
- 网络地址:主机号部分的比特全为0,代表整个子网
- 广播地址:主机号部分的比特全为1,代表对整个子网进行广播;
这两种IP都不能给某个具体的设备,而是用于特定的网络功能。网络地址用于表示和标识一个子网,不进行通信,广播地址则实际用于通信。
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服务器的基本工作就是接受来自客户端的查询消息,然后根据消息的内容返回响应。
查询消息包含以下三种信息:
- 域名
- Class: IN
- 记录类型:
- A:表示域名对应的IP地址
- MX:表示对应的邮件服务器
- …
域名 | 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服务器中。
当客户端需要查询域名对应的IP时,它会先去最近的DNS服务器中找到根域,然后从根域逐层向下查询,如果当前DNS服务器没有需要的信息,它就会告诉客户端下一层DNS服务器的IP地址,直到客户端找到需要的结果。
通过缓存加快DNS服务器的响应
为了加速查询,DNS服务器中有缓存记录着查询过的域名的结果。
委托协议栈发送消息
通过DNS服务器查询到IP地址后,就可以委托操作系统内部的协议栈向目标地址的服务器发送消息了。
其实可以理解为数据的传输和接收都必须要经过操作系统的底层库来操作,形象的理解就是要形成一条数据流通的管道。
建立管道的流程是:
- 创建套接字
- 将管道连接到服务器端的套接字: connect
- 收发数据: write/read
- 断开管道并删除套接字: close