URI解析
一般过程
当你在浏览器中输入信息时,浏览器就已经开始进行工作了。首先它会监听我们输入的信息并尝试匹配出你想要访问的网址或关键词,以 chrome 为例,它会猜我们想要什么,给出下面的建议项:
- 使用默认搜索引擎搜索关键字
- 书签,历史记录和最近下载中存储的其他链接
- 使用默认搜索引擎的相关关键字搜索选项
当我们在地址栏输入xxxx.com后回车,命令浏览器搜索信息。浏览器就会对输入的信息进行以下判断:
- 输入的是不是一个合法的URI
-
如果不是,就将输入的内容作为搜索的条件,生成一个HTTP数据包
-
如果是,判断输入是否完整。浏览器可能会对域猜测,也就是说尝试通过在输入的内容中添加前缀、后缀或两者来 “补全” URL。比如输入 xxx.com 则可能会在前面添加 www。等有了一个URI之后,就解析URI。
- 待URI解析完毕之后,就可以的到服务器域名等,然后就可以根据这些消息生成一个HTTP数据包了
- 浏览器先从URI中取出协议,比如http协议,然后根据不同的协议进行不同的解析。
- 然后从URI中提取出主机名(host)信息。它可能是一个 IP 地址(比如192.168.0.1),也可以可能是一个域名地址(www.xxx.com)。如果是域名地址就需要访问DNS服务器获取到对应的IP地址,如果是IP地址就不需要进行这一步了
- 待URI解析完毕之后,就可以的到服务器域名等,然后就可以根据这些消息生成一个HTTP数据包了
-
现在已经生成了一个HTTP数据包了。
补充信息
浏览器还会进行一些额外的操作,比如安全检查、访问限制(之前国产浏览器限制 996.icu)等。
实际上,浏览器会先查看缓存来决定下一步是什么操作:
DNS查询:将域名翻译成IP地址
在互联网上有多达到上亿的设备,而这些设备之间互相联通网络,每一台主机都需要一个唯一的标识符(就像是我们每个人都有一张身份证),而这个标识符就是IP地址,由于IP地址是数字,不利于人来使用,人们为了方便记忆,发明了点分十进制,但是还是不方便,又发明了域名,日常生活中使用的是域名。为了将域名和IP地址对应起来,又发明了DNS服务器。
DNS 是互联网上重要的基础应用程序,它作为一个分布式数据库,储存着域名与 IP 地址的映射关系。通过DSN服务器可以查询到域名对应的IP
当然,我们并不是直接就去访问DNS服务器,而是先去缓存中查询:
- 浏览器缓存:浏览器会先检查是否在缓存中,没有则调用系统库函数进行查询。
- 操作系统缓存:操作系统也有自己的 DNS缓存,但在这之前,会向检查域名是否存在本地的 Hosts 文件里,没有则向 DNS 服务器发送查询请求。
- 路由器缓存
- ISP DNS 缓存:ISP DNS 就是在客户端电脑上设置的首选 DNS 服务器,它们在大多数情况下都会有缓存。
- 根域名服务器查询:在前面所有步骤没有缓存的情况下,本地 DNS 服务器会将请求转发到互联网上的根域
到目前为止,数据包有了,目的IP有了,接下来要做的就是将数据包发出去了
TCP/UDP传输层:传输数据包到目的IP
通过DNS获取到目的IP之后,就可以将HTTP的传输工作交给操作系统中的协议栈了。
应用程序(浏览器)通过调用socket库,来委托协议栈工作。协议栈的上半部分有两块,
- TCP和UDP协议,负责接收应用层的委托执行数据收发工作。
- IP协议负责将数据块发送到目的IP。IP协议中还包括
-
ICMP:用于追踪数据的发送过程,告知网络包传送过程中产生的数据以及各种控制信息 -
ARP:根据IP地址查询相应的以太网MAC地址
IP下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡负责完成实际的收发操作(收发网线中的信号)
-
HTTP是基于TCP协议传输的,因此我们先来学习下TCP协议
TCP-- 可靠的数据传输
https://zhuanlan.zhihu.com/p/95904514