背景
这是一个经典的面试题,很多人在面试过程中都会被问到,这个问题考察的不是什么高深的技术,而是考察面试者对一个请求的整个流程的理解。
有的人说我是一个前端开发者或者后端开发者,为什么需要了解整个流程?其实这个流程应该是每一个优秀的程序员都必须清楚的。当我们面对到用户的吐槽,说我们的网页太慢、打不开等问题,我们该如何入手?不懂得这整个流程的人是不能回答好这个问题的。今天就系统地、详细的讲解一下这里面的流程,希望对大家有所帮助。
一个请求到底经历了什么
我们在浏览器地址栏输入www.baidu.com,然后enter一下,会发生什么?
- (1)DNS解析。浏览器会访问自身的DNS缓存信息,通过域名来查找对应的ip,如果没找到,就去操作系统的DNS缓存中查找,如果还是没有找到就是去host文件中查找了,最后是去DNS服务器获取服务器端的ip地址。
- (2)封装成HTTP请求。浏览器将请求信息打包成http请求,通过socket将HTTP请求信息给了传输层(这里是使用的TCP协议),浏览器这层叫做应用层(使用的协议其实是HTTPS,这里将它简化,使用HTTP协议)
- (3)传输层加上TCP头信息传递到网络层。当TCP收到HTTP请求信息会在其外面套上一层TCP头信息,这个TCP头里面有两个比较重要的参数,一个是Destination Port目的地端口,也就是百度服务器监听的端口,这个端口默认是80,除非你在浏览器地址栏输入访问地址的时候在域名后面加上端口信息,例如:www.baidu.com:8080 ,还有一个参数是Source Port 本机端口(这里我们为了方便理解省略了建立连接的过程,也就是三次握手,这个Source Port其实就是在建立连接的时候操作系统为该连接分配的端口,这个端口是16位的,最大到65535),这里Source Port 是35616(操作系统分配的),然后带着这个数据 ,还有本机ip地址,服务端ip地址传给 网络层(使用IP协议)
- (4)IP协议收到TCP数据段后加上IP协议头传递到数据链路层。IP协议头部信息中有两个重要的属性,分别是Source IP 与Destination IP,Source IP是本机IP地址,Destination IP是目的地IP地址,也就是我们要请求的服务器IP地址182.61.200.6,同时会判断这目的IP地址是不是本机,如果是的话这个数据就不会发往下一层,如果不是本机地址(其实就是判断目的IP地址与本机IP地址是不是在一个网段上),就会发往网关地址(在我们电脑启动的时候,会被DHCP协议配置IP地址与默认的网关 192.168.1.1),这时候会通过ARP协议(地址转换协议,能够通过IP获取对应主机的MAC地址)获取192.168.1.1主机MAC地址,然后就将数据报发送到数据链路层,也就是MAC层。
- (5)数据链路层加上MAC头信息,发送到网卡。这个头部信息主要有两个重要参数,分别是源MAC地址与目的MAC地址,这里这个源MAC地址就是你电脑网卡的MAC地址(MAC地址占6字节,MAC地址是网络中每台设备唯一的网络标识),目的MAC地址在这里就是网关的MAC地址,然后将数据帧发送到网卡,然后由网卡生成bit流发送到路由器。
- (6)路由器收到后这些bit流后,路由器的网卡会转成数据帧,交给MAC层,MAC层收到后会取出目的MAC地址然后与当前网卡的MAC对比,如果正确就将抛去MAC头的数据报交给上层处理,也就是交给网络层,这里是IP协议来处理,它会取出这个你这个目的IP地址,然后去它的路由表中去找该IP应该从哪个网口发出去,没有找到的话,就获取下一跳IP地址查ARP表,寻找对应的MAC地址(也就是它上层路由器的IP地址,ARP表中没有的话就发送ARP请求获取对应IP的MAC地址),然后封装IP报文(这个封装,会对源IP地址进行改变,具体怎么改变是由NAT模式决定的),后交给MAC处理,封装成以太网帧,这时候目的MAC地址就是你下一跳的MAC地址。
- (7)在传输的过程中,可能或遇到交换机这种二层设备,当数据流传输到交换机的话,会交给数据链路层处理,在该层会将MAC头部信息中的目的MAC地址拿出来去地址表中查找对应的出口,我们知道,交换机有很多的网口,而它这个地址表就维护着某个MAC地址与某个网口的对应关系,这个表的对应关系一开始的时候没有,当有数据从某个网口进来的时候,它就会记录进去某个MAC地址对应某个网口。如果能够找到对应关系,就会转发出去,如果找不到,那就只能广播出去了,往它所有网口都发一遍。
- (8)比如说咱们经历了若干的网络设备传输,终于到了某个路由器上匹配目的IP段。这时候路由器会根据ARP表获取对应IP的MAC地址,如果没有的话就使用ARP协议进行请求获取,获取之后,封装目的MAC地址为服务器的MAC地址,然后通过对应网口发送出去。
- (9)当服务器网卡收到数据流后,首先会交给交给数据链路层,数据链路层将MAC头取出,目的MAC地址与本机MAC地址进行对比,匹配不上就丢掉,匹配的上就将脱了MAC的数据报交给网络层处理(这里是IP协议),网络层收到数据报之后,将IP头取出,进行IP地址比对,比对的上就交给传输层(TCP协议),传输层根据其中目的端口80,交给80端口的应用,这里比如说是nginx。
- (10)当nginx应用收到http信息后,进行处理,知道它要请求这个index.html页面,然后将index.html放到响应体中,封装http信息,交给传输层处理,传输层就是在其基础上封装TCP头部信息,源端口就是nginx监听的端口,这里也就是80端口,目的端口,就是请求的源端口。接着交给网络层处理,源IP就是本机的IP地址,然后目的IP是之前请求来的时候经过路由器处理的公网IP,接着交给数据链路层,在该层,会封装MAC头部信息,源MAC地址就是本机MAC地址,目的MAC地址就是网关MAC地址,最后交给网卡发送出去,然后就顺着来的路又回去了。