1. HTTP请求
首先先解析URL得到里面的参数,将域名和请求的资源分开,然后再将这些信息封装成一段HTTP请求报文发送出去。
2. DNS域名解析获取IP地址
生成HTTP请求报文后,就需要去获取目标服务器的IP地址了。
DNS域名解析的过程如下:
- 首先先查询浏览器的缓存,如果没有,则去操作系统的缓存(host文件)中查找;
- 如果host文件中没有,浏览器则会发出一个DNS请求到
本地DNS服务器,查询成功则返回结果; - 若本地DNS服务器也没有,则本地域名服务器则向上级域名服务器进行查询:
- 首先本地域名服务器会向
根域名服务器发送请求,根域名服务器不会直接告诉目标IP地址,而会返回顶级域名服务器的地址,让本地域名服务器去向顶级域名服务器发送请求; - 本地域名服务器拿到
顶级域名服务器的地址后,就会向其发出请求,去获取权限域名服务器的地址; - 最后本地域名服务器再去向
权限域名服务器拿到域名对应的IP地址。
- 首先本地域名服务器会向
- 本地域名服务器拿到IP地址后返回给操作系统,并将其缓存起来;
- 操作系统拿到IP地址后返回给浏览器,同样也缓存起来;
- 浏览器拿到IP地址,然后缓存起来。
3. 协议栈
通过DNS解析拿到目标IP地址后,就可以将HTTP的传输工作委托给操作系统的协议栈了。
浏览器通过调用Socket库来委托协议栈工作,协议栈的上半部分有TCP和UDP协议,下半部分是用IP协议控制网络包收发操作。
我们都知道HTTP和HTTPS基本是基于TCP的,所以此时由上层传下来的HTTP数据报会跟源端口目标端口一起封装成TCP报文,接着交由IP协议进行以源IP地址和目标IP地址为首部和TCP报文封装成IP数据报。
4. TCP实现可靠传输
进行三次握手建立连接,保证双方的一个可靠传输。
在这个过程中,都是通过IP协议实现远程定位
IP数据包的首部存有源IP地址和目标IP地址。
5. 使用ARP协议找到MAC地址实现两点传输
但是IP协议只能帮我们进行一个远程的定位,这远远还不够,我们数据的传输其实是在链路上面进行传输的,这也是数据链路层的工作,我们需要通过MAC地址去进行传输,因为IP是互联网世界的唯一逻辑地址,而MAC则是计算机唯一的物理地址,此时我们需要去浏览器本地缓存中寻找对应目标IP地址的下一跳MAC地址,如果没有则会交由ARP去帮我们寻找MAC地址。
在同个网关下,ARP会广播发出ARP请求,ARP请求携带了源IP地址,源MAC地址,目标IP地址,此时在这个网关下的全部主机都将收到这个ARP请求,它们会将ARP请求中的目标IP地址拿出来跟自己的进行对比,如果跟自己的一样,则证明我就是它的下一跳,此时这个主机会先将源IP地址和源MAC地址写进自己的缓存中,再将自己的IP地址和MAC地址封装进ARP响应报文中单播返回给请求者。 在不同网关下,ARP请求会被路由器阻断,路由器会返回自己的MAC地址,然后请求者将数据发送给路由器,交由路由器去帮我们寻找发送数据给目标主机。
在这里经过各个交换机和网关 最终到达服务端。
6. 服务器响应请求
服务端拿到数据帧,进行扒皮,验证MAC地址,IP地址,TCP序列号,最后通过TCP首部的端口号,找到监听此端口的应用程序,将数据发送给该应用程序。最后服务器响应请求。
总结
最后用一个图来回顾一下:(来源《图解HTTP》)