共计 1452 个字符,预计需要花费 4 分钟才能阅读完成。
域名解析 -> 三次握手 -> 接收HTTP响应 -> 四次挥手
1. DNS 对 URL 域名的解析,获取主机所在的IP地址
- 浏览器从 url 中抽取出主机名(域名),并将主机名传给DNS应用的客户端
- DNS 客户端向 DNS 服务器发送一个包含主机名的请求
- DNS 客户端最终会收到一份回答报文,其中包含有对该主机名的 IP 地址
2. 浏览器接受来自 DNS 的 IP 地址,然后向位于该 IP 地址的80端口的HTTP服务器发起一个TCP连接(三次握手)
- 第一次握手:客户端发送一个带SYN标志的报文到服务器;
- 第二次握手:服务端发送一个响应报文到客户端,这个报文同时带 ACK 和 SYN 标志。表示对刚才客户端SYN的回应,同时又标志ACK到客户端,询问客户端是否准备好进行数据通讯。
- 第三次握手:客户端再次回应一个 ACK 报文进行确认,同时会发送一个HTTP请求到服务端。
3. 建立完 TCP 连接就可以通信了,服务器返回响应
握手完毕,服务器收到客户端的请求,这时服务器会从本地磁盘找出客户端所需的数据,返回一条 HTTP 响应给客户端,并关闭 TCP 连接。(但只有当客户收到数据后才会完全关闭,此时只是服务器单方面无法与客户端传输数据)
4. 客户端收到 HTTP 响应,并关闭TCP连接(四次挥手)
由于 TCP 是全双工的,因此每个方向都必须单独进行关闭。首先关闭的一方执行主动关闭,而另一方执行被动关闭
- 第一次挥手:服务器发送一个 FIN,用来关闭服务器到客户端的数据传输
- 第二次挥手:客户端收到这个 FIN,返回一个 ACK, 确认收到
- 第三次挥手:客户端关闭服务器的连接,发送一个 FIN 到服务器
- 第四次挥手:服务器收到这个 FIN,返回 ACK 报文,确认收到
5. 如果存在代理服务器,那么将由代理服务器来协调客户端与服务器的通信
- 客户端建立一个到web缓存的TCP连接,并向web缓存器发送一条HTTP请求。
- web缓存器进行检查,看看本地是否存储了该对象的副本,如果有,web缓存服务器就向客户端发送一个HTTP响应报文。
- 如果web缓存器中没有该资源,就打开一个到该对象初始服务器的TCP连接。web缓存器则在这个缓存器到服务器的TCP上发送一个HTTP请求,初始服务器返回HTTP相应。
- web缓存器收到响应后,在本地存储一份副本,并向客户端的浏览器用HTTP响应报文发送该副本。
6. 客户端收到 HTTP 响应的发送过来的文件,并解析成页面展示给用户
- 解析 html 构建 DOM 树
- 构建 render 树
- 布局 render 树
- 绘制 render 树
网络传输详细过程
源的应用层 -> 传输层 -> 网路层 -> 链路层 -> 物理层———目的端的物理层 -> 链路层 -> 网路层 -> 传输层 -> 应用层
- 在源主机上,应用层将一串应用数据流传送给传输层
- 传输层将应用层的数据流截成分组,并加上TCP报头形成TCP段,送交网络层
- 在网络层给TCP报头加上源,目的主机IP地址和IP报头,生成一个IP数据报,并将IP数据包送交给链路层
- 链路层在其MAC帧的数据部分装上IP数据报,再加上源,目的主机的MAC地址和帧头,并根据其目的MAC地址发送目的主机或IP路由器
- 在目的主机,链路层将MAC帧的帧头去掉,并将IP数据发送至网络层。
- 网络层检查IP报头,如果报头和计算结果不一样,则丢弃IP数据包,则向源主机要求重发消息。若检验和计算结果一致,则去掉报头,将TCP段发送至传输层。
- 传输层检查顺序号,判断是否是正确的TCP分组,然后检查TCP报头数据。若正确,则去掉TCP报头,向源主机发送数据分组。否则,向源主机要求重发消息。
- 目的主机收到来自源主机的字节流。
正文完