我们都知道在浏览器的网址栏位输入www.baidu.com,点下回车后,会呈现出百度的首页。那么深层次的探究一下,这期间是如何做到资源的正确请求的,还发生了什么事情呢?
网络模型
在回答问题之前,我们先回顾一下网络模型。我们平时常见的网络模型有以下两种:
1. OSI(Open System Interconnection)的七层模型
2. TCP/IP的四层模型:
其中关于应用层,传输层,传输层的工作原理,网络层的详解,我在之前博客已经依次讲解过,感兴趣的可以通过链接点击了解。现在我们就以四层模型为例,正式进入话题。
发生过程
通过四层模型的图解,我们应该知道,输入网址点击回车后会大概发生以下几个过程:
- 应用层采用http协议,将请求的网址等信息装载入HTTP的请求报文(向下封装过程),包含了请求首行(方法+url)+请求头(+空行)+请求主体,然后由应用层将数据传送给传输层。同时应用层使用DNS协议进行解析域名,得到目标IP地址。接下来就通过DNS查找目标IP获取内容,如果本地存有这个的IP,则直接使用;如果没有,则会向上级DNS服务器请求帮助,直至获得目标IP的内容。
- 传输层接收到应用层传递下来的数据,在该数据前面加上TCP协议报头,并标记端口为80(服务器默认端口),将该数据段传给网络层。同时发起和目标端口建立安全通信的请求。
- 网络层接收到传输层传递下来的数据,在该数据前面加上IP协议报头(自己IP和目标IP),这时的数据段称为数据报,将该数据报传给数据链路层。同时进行IP路由找到接收对应的机器(IP协议查找目标网络+ARP协议查找目标主机MAC地址)。当通信的双方不在同一个局域网时,需要多次中转才能到达最终的目标。
- 数据链路层先在IP数据报前面加上自己机器的MAC地址和目标MAC地址,此时的数据称为帧,然后通过物理网卡把这个数据帧以比特流的方式发送到目标服务器机器上。这时才开始真正的传输请求信息,传输完成以后请求结束。
- 服务器收到用网卡接收到的比特流数据后,读取比特流中的帧,从下到上层层将数据解包分离(每层都根据报头中的“上层协议”字段,确认该数据报的有效载荷),直到告诉应用层发送方请求的是http数据。
- 在服务器上查找客户端请求的资源,将数据装载入HTTP响应报文并原路返回,响应报文中包括一个重要的信息——状态码,如200,404,500。
- 浏览器接收到报文内容查看状态码。200的话就根据响应报文内容解析并渲染页面,其他状态码的话展示相应错误。
- 不再传输数据后,释放TCP连接,此次请求完成。
DNS域名解析
DNS域名解析的查找过程主要有以下几个步骤:
1.浏览器缓存- 浏览器会缓存DNS记录一段时间
2.系统缓存- 若在浏览器中没有找到需要的记录,浏览器会做一个系统调用,利用gethostbyname,获得系统的缓存中的记录
3.路由器缓存- 若系统缓存没有,则会将查询请求发送至路由器,它一般会有自己的DNS缓存。
4.ISP DNS缓存- 接下来要check的就是ISP缓存DNS的服务器,在这一般能找到相应的缓存记录。
5.递归搜索- 你的ISP的DNS服务器从根域名服务器开始进行递归搜索
如果还想了解更详细的解析过程,我还写了一篇DNS域名解析过程的博客,欢迎关注查看哈~