对url加载过程中底层通信过程的分析。访问某网址时,即使通过本地缓存即可完成域名解析,但与对应IP地址建立TCP连接的前提是:本机可与服务器进行数据报的交互,因此对该过程进行一定的了解。
0. TCP/IP五层模型
TCP/IP层 | 主要协议及功能 |
---|---|
应用层 | HTTP, SMTP |
传输层 | 提供端对端的接口TCP/UDP |
网络层 | 为数据包选择路由IP/OSPF |
数据链路层 | 帧传输PPP/ARP |
物理层 | 二进制形式在物理媒介传输数据IEEE802 |
本地完成底层通信过程,至少包含以下阶段:
* 本机连接入网
* 目标url域名解析
* 请求数据封装
* 请求传输
* 建立连接
* 传输数据
1 本机连接入网
本机与外网地址可交互的前提
1) 获取IP
2) 内网与外网可交互:NAT技术内外网地址映射
1.1 获取IP
- 本机所分配的地址是私有IP(私有 IP 地址是指内部网络或主机的IP 地址,公有IP 地址是指在因特网上全球唯一的IP 地址)
- 动态IP配置的场景DHCP,DHCP服务器正常配置
a. 客户机通过UDP端口发送DHCPDISCOVER广播包,请求租用IP地址;广播包中的源IP地址为0.0.0.0,目标IP地址为255.255.255.255;包中还包含客户机的MAC地址和计算机名
b. DHCP服务器通过UDP端口68给客户机回应一个DHCPOFFER广播包,提供一个IP地址
c. 客户机发送DHCPREQUEST消息包,表明接受提供的ip地址
d. DHCP服务器DHCPACK消息包,确认并将该租用消息广播
e. 客户机配置自己的TCP/IP
1.2 内网与外网交互
- 源端口和目标端口。一个进程希望与另一个进程建立TCP连接时,首先把自己绑定到一个本机尚未被占用的TCP端口上,即源端口;并指明数据包到达远程主机后送至哪一个端口,即目标端口
NAT维护key(NAT分配的端口号)与value(内网客户机地址转化)的映射记录
NAT技术违背了IP唯一标识的设计,且使网络变得脆弱,期待IPv6
实现PC至服务器的连接要用的协议
2 目标url域名解析
a. 查询浏览器缓存
b. 操作系统域名解析(可以修改配置文件,为域名指定IP)
c. DNS域名服务器(网络配置中设置)
d. local DNS仍未命中时,会查询root DNS; root DNS会返回所查询域的主域名服务器(以.com, .cn区分)
e. local DNS请求 主域名服务器 ;获得此域名对应的DNS(域名申请时所在的提供商的DNS)
f. local DNS请求 此域名对应的DNS,获得对应IP及TTL
g. local DNS 及 本地 缓存该域名和IP的映射关系
3 请求数据封装
当请求外网某地址时,本机首先建立与目标IP的连接,TCP/UDP(此处以TCP为例),在此过程中发送连接请求;请求建立后,与目标IP交互的GET/POST请求等;上述请求虽然所处阶段不同,对对应的header, data不同,但是底层通信过程中的数据封装过程是基本一致的:物理层(bit)- 数据链路层(frame)- 网络层(packet)- 传输层(segment)。接下来对数据在网络请求中的经历进行简要概述(具体过程了解得不是很多):
- 应用层:将需发送的数据内容放到缓冲区,形成应用层的报文data
- 传输层:传输层打包,报文加上包头(包含端口号等),组成tcp数据传输单位segment
- 网络层:封装网络层包头(含源IP地址,目标IP地址),组成packet;网络层需要通过路由寻址协议和arp协议,找到下一跳的ip地址和mac地址
- 链路层:将mac地址及链路层控制信息加到数据包,形成frame(该层可控制传输速度,确保数据完整)
- 物理层:将数据以bit为单位从主机传输到下一个目的地
4 请求传输
网络通信,在服务端自身性能影响之外,也都会受到网络延迟和带宽的影响
4.1 主干网之间的速度延时和带宽延时
- 速度延时:光纤的传输速度存在上限,距离较远时,寻址和排队等的延迟之外,传输自身也存在延迟(距离较远时,在几十ms)
- 带宽延时:主干网的带宽有上限,传输数据均汇入主干网时,存在拥堵
- 解决方案:1)通过CDN使传输距离变短;2)减少串行的来回请求;
4.2 CDN content distribute network
实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。
- CDN回源:当有用户访问某一个URL的时候,如果被解析到的那个CDN节点没有缓存响应的内容,或者是缓存已经到期,就会回源站去获取。如果没有人访问,那么CDN节点不会主动去源站拿的。
- 回源域名:一般直接用ip回源,为了避免更改配置,会采用回源方式进行回源
5 建立连接
TCP连接(三次握手),控制数据包发送序列的产生,实现流控和数据完整
* client第一次发送时的seq值如何保存,并与server返回的ack值校验 ?
发送一个数据段后,会开启一个计数器,只有当收到确认后才会发送下一个,如果超过计数时间仍未收到确认则进行重发;在接收端如果收到错误数据,则将其丢弃,这将导致发送端超时重发
6 传输数据
开启美好的上网之旅,另一篇期待后续