「网络」一次网络请求的完整生命周期
客户端发起请求
从客户端发起请求的时候,网络数据流是从上而下的:
访问网站,浏览器地址栏输入网址,这只是网站域名,浏览器并不知道要去哪里访问资源,这个时候用到DNS协议
对域名进行解析,在域名注册商那里绑定了域名对应的IP地址,IP地址就相当于互联网世界的门牌号。
知道了目标IP后,浏览器打包本次请求,根据传输数据是否机密与否分为HTTP
和HTTPS
请求,分别使用HTTP协议
和HTTPS协议
。
DNS、HTTP、HTTPS所在的层是应用层,经过应用层封装,浏览器将应用层的包交给下一层完成,这个过程通过Socket编程来实现。
下一层是传输层,传输层有两种协议,一种是无连接的UDP协议
,和面向连接的TCP协议
,UPD无需建立连接即可通信,不可靠,可能丢包,TCP需要三次握手建立连接,能保证数据包到达目的地,但是性能不如UPD。
对于HTTP/HTTPS来说都是基于TCP的可靠连接,TCP协议有两个端口,一个浏览器监听的端口(监听服务器),另一个服务器监听的端口(HTTP请求通常为80,HTTPS为443)。操作系统会根据端口将包转发给不同的进程:
传输层封装完成,浏览器将包交给网络层,网络层的协议是IP协议
,在这一层,会给数据包加上IP头,其中包含源IP地址(浏览器所在机器),目标IP(服务器所在机器)等信息:
操作系统知道目标机器IP地址后,就开始更具他寻找目标机器,如果是局域网内的机器,可以直接通过IP地址判断出来,如果是局域网外的机器需要通过网关出外面的世界查找。
操作系统启动的时候,会通过DHCP协议配置IP地址,以及默认网关的IP地址 :192.168.1.1.操作系统同会通过ARP协议通过IP地址获取网关的MAC地址,并将本地网关和计算机的MAC地址添加到MAC头中:
这样操作系统就将IP包交给了下一层——链路层,再经由网卡发送出去。(客户端机器与网关之间还有物理层的线路连接。)
使用网卡(NIC)的情况下,MAC地址会烧到ROM中,任何一张网卡的MAC地址都是全球唯一的。
网关收到包以后,会根据自己的知识判断下一步怎么走,网关往往是一个路由器,到某个目标IP怎么走,有一个路由表。网络请求包往往需要经过多个网关的跳转,才能到达目标机器。
假设网络包经过多个网关之后,最终到达了目标服务所在的网关,通过ARP协议,目标服务器根据目标IP地址返回一个MAC地址,表示目标服务器在此,然后网络包通过这个MAC地址找到目标服务器所在局域网的目标机器。
服务端接收请求
服务端接收请求的时候,与客户端发送请求相反,网络流是自下而上的。
目标服务器发现与网络请求包的MAC地址对上了,取下MAC头,将包传递给上一层网络层,发现IP也对上了,就取下IP头,然后交给传输层,在传输层里,对于收到的每一个包,都要回复包收到了,这个回复不是此次请求的响应,仅是回复包收到了。
如果过了一段时间还是没有收到服务器的回复,客户端会重新发送这个包,直到回复为止。这个重发也不是重新发送上边那个客户端请求,而是传输层将同一个请求反复重试,对于用户来说,只有一次请求。
回到目标服务器,当网络包到达传输层后,TCP头中有一个服务器监听端口号,通过这个端口号可以识别将数据包交给哪个应用处理。
当后台处理完成后,就会返回一个响应包,告知用户请求成功,并返回响应内容。