背诵版
屏蔽掉底层细节,笼统的总结过程:
应用层:
- 浏览器封装 HTTP 请求报文
- DNS 解析域名获得目标服务器地址
传输层:
- 建立连接
- 把应用层传过来的 HTTP 请求报文进行分割,并在各个报文上打上标记序号及端口号转发给网络层
网络层:
- 利用 ARP 协议根据 IP 地址获取作为通信目的地的 MAC 地址后转发给链路层
服务端在链路层收到数据,按序往上层发送,一直到应用层接收到浏览器发送来的 HTTP 请求报文,然后处理该请求并返回 HTTP 响应报文,浏览器接收到响应报文之后解析渲染界面。最后 TCP 断开连接。
1. 解析 URL
URL 各元素的组成如下(当然,下述请求文件的路径名可以省略):
那么首先,浏览器做的第一步就是解析 URL 得到里面的参数,将域名和需要请求的资源分离开来,从而了解需要请求的是哪个服务器,请求的是服务器上什么资源等等。
2. 浏览器封装 HTTP 请求报文
对 URL
进行解析之后,浏览器确定了目标服务器和文件名,接下来就需要根据这些消息封装成一个 HTTP 请求报文发送出去。举个 HTTP 请求报文的例子:
在请求来回传输的过程中,每一层都会加上自己的“头”,接收端在层与层之间传输数据时,每经过一层就会把该层对应的首部信息消去。
3. DNS 域名解析获取 IP 地址
下一步:获取目标服务器的 IP 地址。
由域名转换得到 IP 地址就是 DNS 协议做的事情,如下:
- 找服务器缓存中有没有
- 找系统缓存中有没有(就是system中的hosts)
- 找本地域名服务器
- 本地没找到,去找根域名服务器,根域名服务器指出顶级域名服务器的位置,顶级域名服务器再指出权限域名服务器的位置,然后才找到对应的IP地址。注意这是一个迭代查询,实际上是本地服务器向上级发送查询。
- 将IP地址返回操作系统,并且自己缓存起来
- 操作系统将IP地址返回给浏览器,然后缓存起来。
- 浏览器将IP地址返回给页面,然后缓存起来。
配合下图直观理解:
需要注意的是,DNS 使用的是 UDP 协议,也就是说上面各种请求的转发,都是基于 UDP 这个无连接协议的。
4. 建立 TCP 连接
必然就需要 TCP 通过三次握手为浏览器和服务器之间建立可靠的连接,保证双方都具有可靠的接收和发送能力。
三次握手过程如下图:
5. 浏览器发送请求
HTTP 请求报文或者响应报文在 TCP 连接通道上进行传输的时候,由于这些报文比较大,为了更容易和准确可靠的传输,TCP 会将 HTTP 报文按序号分割成若干报文段并加上 TCP 首部,分别进行传输。接收方在收到这些报文段后,按照序号以原来的顺序重组 HTTP 报文。
6. 负责传输的 IP 协议
实际上,TCP 在三次握手建立连接、四次握手断开连接、以及连接建立过程中的收发数据(TCP 报文段)等各阶段操作时,都是通过 IP 协议进行传输的,IP 协议将这些阶段的数据添加 IP 首部封装成 IP 数据报再进行传输。
IP 数据报的首部存有源 IP 地址和 目标 IP 地址。所谓源 IP 地址 就是发送方的 IP 地址;目标 IP 地址就是通过 DNS 域名解析得到的目标服务器的 IP 地址。
事实上,IP 协议身处的网络层规定的是:数据报要通过怎样的路径(传输路线)才能到达对方计算机,并传送给对方。不理解这句话的详细解释马上就来,继续往下读。
7. 使用 ARP 协议凭借 MAC 地址通信
上面说了,IP 协议的作用是把各种数据包传送给对方,而要保证确实传送到对方那里,则需要满足各类条件,其中必要的两个就是 IP 地址 和 MAC 地址。
既然网络层已经有了唯一标识的 IP 地址,为啥还需要 MAC 地址?
看下面这幅图,在网络上,通信的双方在同一局域网内的情况是很少见的,通常是需要多台计算机和网络设备的中转才能连接到对方。而在进行中转时,就需要利用下一站中转设备的 MAC 地址来搜索下一个中转目标。
-
网络层指定了从哪个主机(「源 IP 地址」)发送到哪个主机(「目的 IP 地址」)。源 IP 地址和目标 IP 地址在传输过程中是不会变化的
-
而数据链路层则是根据 MAC 地址在一个接一个的区间中进行传输的,每个区间内的出发地址即「源 MAC 地址」,每个区间内的目的地址即「目的 MAC 地址」。显然,随着数据的传输,源 MAC 地址和目的 MAC 地址会不断的发生变化
比如上图,网络层告知了 1-2-3 路线,也就是说指明了这几个路由器的 IP 地址。那么数据链路层就会根据这几个 IP 地址对应的 MAC 地址依次找到 1、2、3,并在他们之间传输数据。
那么,将 IP 地址转化为 MAC 地址,从而在数据链路层精确的传输数据的协议就是 ARP 协议
ARP 是借助 ARP 请求与 ARP 响应两种类型的包确定 MAC 地址的。并且每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。
ARP的工作流程(面试时问ARP协议主要说这个就可以了):
- 在局域网内,主机A要向主机B发送IP数据报时,首先会在主机A的ARP缓存表中查找是否有IP地址及其对应的MAC地址,如果有,则将MAC地址写入到MAC帧的首部,并通过局域网将该MAC帧发送到MAC地址所在的主机B。
- 如果主机A的ARP缓存表中没有主机B的IP地址及所对应的MAC地址,主机A会在局域网内广播发送一个ARP请求分组。局域网内的所有主机都会收到这个ARP请求分组。主机B在看到主机A发送的ARP请求分组中有自己的IP地址,会像主机A以单播的方式发送一个带有自己MAC地址的响应分组。
- 主机A收到主机B的ARP响应分组后,会在ARP缓存表中写入主机B的IP地址及其IP地址对应的MAC地址。
- 如果主机A和主机B不在同一个局域网内,即使知道主机B的MAC地址也是不能直接通信的,必须通过路由器转发到主机B的局域网才可以通过主机B的MAC地址找到主机B。并且主机A和主机B已经可以通信的情况下,主机A的ARP缓存表中寸的并不是主机B的IP地址及主机B的MAC地址,而是主机B的IP地址及该通信链路上的下一跳路由器的MAC地址。
- 这就是上图中的源IP地址和目的IP地址一直不变,而MAC地址却随着链路的不同而改变。如果主机A和主机B不在同一个局域网,参考上图中的主机H1和主机H2,这时主机H1需要先广播找到路由器R1的MAC地址,再由R1广播找到路由器R2的MAC地址,最后R2广播找到主机H2的MAC地址,建立起通信链路。
8. 服务器响应请求
浏览器的 HTTP 请求报文通过 TCP 三次握手建立的连接通道被切分成若干报文段分别发送给服务器,服务器在收到这些报文段后,按照序号以原来的顺序重组 HTTP 请求报文。然后处理并返回一个 HTTP 响应。当然,HTTP 响应报文也要经过和 HTTP 请求报文一样的过程。
看下方这个图回顾一下(图片来源《图解 HTTP》):
9. 断开 TCP 连接
浏览器和服务器都不再需要发送数据后,四次挥手断开 TCP 连接,详细可见 关于 TCP 三次握手和四次挥手,满分回答在此 这篇文章。
10. 浏览器显示界面
浏览器接收到服务器返回的数据包,根据浏览器的渲染机制对相应的数据进行渲染