0%

浏览器请求url完整解析的过程

基本过程

  1. 域名解析
  2. tcp连接
  3. tls握手
  4. 发送http请求
  5. ARP寻找路由器
  6. 以太网传输数据帧
  7. 路由转发
  8. 服务器返回http响应
  9. 浏览器解析http响应体渲染页面
  10. TCP四次挥手断开连接

域名解析

主流网络通信协议是TCP/IP,数据在网络中的传输是通过IP协议在各个路由器之间传输,找到服务端机器的,IP协议只认IP地址,IP地址全是数字,对于人来说不方便记忆,所以搞了域名,全是英文。所以第一步要先解析域名为IP地址。

  1. 先看浏览器缓存有没有对应IP。
  2. 没有则查询操作系统hosts文件里是否有对应IP。
  3. 没有则向本地DNS服务器发起域名解析。
  4. 如果本地DNS服务器有对应IP缓存,则直接返回。
  5. 没有则向根域名服务器请求解析域名,根域名服务器无法解析域名,给出下一级域名服务器地址,本地DNS服务器继续请求,这样一级一级的直到解析出IP地址。

TCP连接

浏览器使用HTTP协议传输数据,HTTP要求传输要可靠,所以HTTP底层是基于TCP协议的。

TCP协议为了可靠性,一开始是要通过三次握手建立连接,验证通信双方的发送数据和接受数据是正常。

采用三次握手而不是两次握手,是为了防止已失效的连接请求报文突然又传送到了服务端,因而产生错误。

三次握手还会交换报文初始序号、滑动窗口大小、最大报文长度等信息,这些都是用来保证传输的可靠性的。

HTTP请求

HTTP请求分为请求行、请求头、请求体。

  • 请求行规定了 请求方法类型、url、http协议版本。
  • 请求头的功能很多,比如说缓存、压缩、支持的编码等,看实际的需求。
  • 请求体是详细的数据部分。

浏览器输入一个url访问,都是get请求。

数据到达传输层,这里使用的是TCP协议,给数据加上TCP报文头,在报文头中填充源端口号、目的端口号、数据字节数编号、接受窗口大小等数据。

其中端口号的目的是为了把数据交给特定的应用程序做处理,端口号是为了区分同一台主机上不同的应用程序。

TCP协议还有报文编号、超时重传、流量控制、拥塞控制等机制,都是为了保证 传输的可靠性,保证数据传输到位。这些机制对于HTTP协议是无感的。

TCP分段

如果HTTP报文过长,超过TCP规定的最大报文长度,就会分为多个TCP报文传输,TCP分段是为了防止IP层对数据进行分片,因为IP层分片后,除了第一个分片有TCP报文头,其他IP分片 没有TCP报文头,这样如果一个IP分片丢失,就要重传所有的IP分片,因为没办法定位哪个分片丢失,不方便做超时重传,降低了传输吞吐量。

IP层对数据进行分片是为了防止IP报文大小超过数据链路层的最大传输单元大小,IP数据过长,到数据链路层就无法传输 。

ARP寻址

TCP报文到IP层后,会加上IP协议报文头,添加源主机IP地址,目的主机IP地址。IP地址是用来定位网络中的主机的。

源主机先检查源主机IP地址和目的主机IP地址是否在同一个网络中。

局域网传输

如果在同一个网络中,接下来就是局域网通信了。局域网通信识别主机是通过MAC地址来识别的 ,而不是IP地址,所以第一步要先获取主机的MAC地址。这就要用到ARP协议,ARP叫地址解析协议,是用来做IP地址到MAC地址的映射。

首先源主机在本地局域网中发送一个ARP广播请求,目的主机收到广播请求后对比IP地址是自己的,就返回一个ARP响应包,把目的主机的MAC地址告诉源主机。ARP协议会缓存IP地址和MAC地址的映射关系,下一次就不用发广播来获取MAC地址了,节省通信时间。接下来源主机就把IP数据包加上数据链路层的帧首部,填充源主机和目的主机的MAC地址,通过以太网等局域网手段跟目的主机通信。

广域网传输

如果不在同一个网络中,要将数据发送到网络中,也要先通过ARP获取到网关路由器的MAC地址,源主机把数据传递给网关路由器,网关路由器把数据帧首部去掉,发送IP数据报。

路由转发

路由器转发数据,要在路由表中查询是否有能与目的IP地址匹配的条目,如果匹配了主机地址,则发送数据给目的主机 ,否则转发给下一个网络的网关路由器。

数据应该转发给哪个路由器,是根据路由算法来决定的,路由算法会计算得出一个传输代价最小的路径。

在大型、易变的网络中,会用到动态路由算法,一般使用链路状态路由算法,因为传播的数据量小,节省CPU、内存和网络带宽。

每个路由器都会将自己与邻居节点之间的链路状态广播出去,发送到整个网络,这样每个路由器都会有网络中所有路由器的状态,形成全网的拓扑视图,然后可以用迪杰斯特拉最短路径算法求出最短路径,就知道路由转发的时候要发给哪个路由器了。当某台路由器链路状态发生变化,采用洪泛法向所有路由器发送状态信息,使其他路由器重新计算最佳路径重新生成路由表。

路由器之间的通信,也是要走局域网通信的那一套流程,即获得下一跳路由器的MAC地址,然后通过以太网传输数据帧。

服务端收到消息后也是同样的反向操作流程。