流程概述:
浏览器解析URL生成HTTP请求→解析域名(DNS)→HTTP请求委托TCP协议→TCP委托IP→加上MAC头→客户端网卡(转成电信号)→进入网线,CDN、负载均衡→服务器防火墙→服务器网卡→IP协议→TCP协议→HTTP协议…(后面大同小异)
流程细节:
浏览器先解析URL,解析完成后获得web服务器消息及其资源文件名,根据这些消息生成HTTP请求消息,但我们都知道HTTP协议位于应用层,不具备将消息发送到网络中的功能,因此这一功能需要委托操作系统来实现。在进行这一操作的时候,还需要查询网址中服务器域名对应的IP地址。在委托操作系统发送消息时,必须要提供的不是通信对象的域名,而是它的IP地址。因此,在生成HTTP消息之后,下一个步骤就是根据域名查询IP地址。
具体来说,
浏览器搜索自己的DNS缓存,若没有,则搜索操作系统中的DNS缓存,若没有,则搜索操作系统的hosts文件,若没有,则操作系统将域名发送至 本地域名服务器- -(递归查询方式),本地域名服务器 查询自己的DNS缓存,查找成功则返回结果,否则,(以下是迭代查询方式)
4.1 本地域名服务器 向根域名服务器(其虽然没有每个域名的具体信息,但存储了负责每个域,如com、net、org等的解析的顶级域名服务器的地址)发起请求,此处,根域名服务器返回com域的顶级域名服务器的地址
4.2 本地域名服务器 向com域的顶级域名服务器发起请求,返回baidu.com权限域名服务器(权限域名服务器,用来保存该区中的所有主机域名到IP地址的映射)地址
4.3 本地域名服务器 向baidu.com权限域名服务器发起请求,得到www.baidu.com的IP地址
本地域名服务器 将得到的IP地址返回给操作系统,同时自己也将IP地址缓存起来
操作系统将 IP 地址返回给浏览器,同时自己也将IP地址缓存起来
至此,浏览器已经得到了域名对应的IP地址
• 递归查询与循环查询的理解:本地域名服务器作为递归的栈底,有可能会递归的调用其他域名服务器置于栈顶,因此为递归查询,在本地域名服务器外存在多个层级的域名服务器,它们之后可能一个可能多个存在对应域名的IP地址,需要循环的方式遍历获取IP地址
委托TCP协议传输HTTP请求,这里涉及到三次握手四次挥手的内容,TCP协议位于传输层,会根据HTTP请求消息的数据大小判断是否进行拆包操作,在网络中有最大传输单元(MTU)的概念,MTU为1500字节,IP头部一般为20字节,TCP头部一般为20字节,所以HTTP请求消息要求小于等于1460字节,如果大于这个字节,那么TCP会进行拆包,分成多个TCP包进行数据传输,传输层中除了TCP协议还有UDP协议,两者最大的区别在于是否面向连接,是否可靠。
TCP协议委托IP协议传递网络包,这个位置,IP协议也具有拆包能力,但为了确保TCP的传输效率,使用TCP的情况下不使用IP的拆包功能;
假设使用以太网技术,则需要给IP协议加上MAC头部,MAC头部由ARP协议动态获取;
接着IP包将在网卡中被转换成电信号,进入网线。
到了数据链路层以及物理层,涉及到了集线器、交换机、接入网等更多的网络概念。
在客户端网卡到服务器网卡中间,可以进行CDN静态文件分发,负载均衡,技术,降低服务器负荷、服务器响应速度。
电信号传到服务器这边,自底向上的,首先可以使用防火墙来过滤掉一些对服务器有安全隐患的包,接着在服务器网卡位置,将电信号转为IP包,如果目标MAC不是本机网卡的MAC,则该IP包会被丢弃,接着进入传输层,由TCP对包进行处理,如果TCP包被拆分成多个,则有粘包操作,且TCP会做差错检验,验证无误后,TCP包传入应用层,变成HTTP包,服务器接收该HTTP请求并处理,返回响应,这里将会进行的操作与本问题开头基本一致,但由于服务器已经知道目标IP地址,因此可直接委托TCP协议响应。
浏览器接收到响应后,自底向上将网络包传至浏览器,浏览器解析HTTP响应,渲染画面,整个过程完成。