相信去过大厂面试的时候大都会问及七层协议、四层协议、浏览器浏览一个网页是怎么实现的or发生了什么之类的话题,其实都是问OSI七层协议参考模型或者TCP/IP四层协议的相关知识,本文只是对其协议概念进行概述,让大家有个基本的了解,希望大家通过本文能对网络节点间什么怎么实现的有个基本的认知。
下图是OSI七层协议、TCP/IP五层协议、TCP/IP四层协议图:
OSI七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通信,其主要作用是帮助不同类型的主机实现数据传输。
物理层
物理层是OSI参考模型的最底层,它的作用是实现相邻计算机节点之间比特流的透明传送,屏蔽了具体传输介质和物理设备的差异。透明传送表示经实际实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像看不见一样。
我们都知道机器只能识别二进制,即0和1,它使用高低电平表示,而物理层传送的是比特流(即二进制流,比特是是二进制中的位),所以能承载比特流的常见设备有:网卡、网线、集线器、中继器、调制调解器等。
数据链路层
数据链路层是OSI参考模型的第二层,它负责建立和管理节点的链路。该层的主要功能是:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。在计算机网络中由于各种干扰(如磁场、温度等)的存在,物理链路是不可靠的,因此这一层的主要功能是在物理层提供的比特流的基础上,通过差错控制、流量控制,使有差错的物理线路变为无差错的数据链路(即提供可靠的物理介质的数据的方法)。数据链路层的具体工作是接收来自物理层的位流形式的数据,并封装层帧,传送到上一层;同样,也将来自上一层的数据帧,拆装为位流形式的数据转发到物理层;并且,还负责处理接收端发回的确认帧的信息,以便提供可靠的数据传输。
常见的网桥、交换机等属于数据链路层。
网络层
网络层是OSI参考模型的第三层,也是最复杂的一层。他在下两层的基础上向资源子网络提供服务。其主要任务是:通过路由选择算法,为报文或分组通过通信子网选择最佳路径。具体的说,数据链路层的数据在这一层被转换为数据包,然后通过路由选择、分组组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。一般的,数据链路层解决同一网络节点之间的通信,而网络层主要解决不同网络间的通信。
常见的路由器属于网络层
传输层
传输层是OSI参考模型的第四层,该层是通信子网络和资源子网的接口和桥梁,起到承上启下的作用。该层的主要任务是:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。传输层的作用是向高层屏蔽下层数据通信细节,即向用户透明地传输报文。该层常见的的协议有TCP和UDP协议。传输层提供会话层和网络层之间的传输服务,它从会话层获取数据,在必要时将数据进行分割,然后传输层将数据传输到网络层,并确保数据能正确无误的传送到网络层,因此传输层负责提供两节点之间数据的可靠传送。
会话层
会话层是OSI参考模型的第五层,它是用户应用程序和网络之间的接口,主要任务是:向两个实体的表示层提供建立和使用连接的方法。将不同实体之间的表示层的连接称为会话。因此会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理。用户可以按照半双工、单工、和全双工的方式建立会话。当建立会话时,用户必须提供他们想要连接的远程地址,而这些地址与MAC地址或网络层的逻辑地址不通过,它们是为用户专门设计的,更便于用户记忆。会话层可以理解为定义如何开始、控制、结束一个会话。
表示层
表示层是OSI参考模型的第六层,它对来自应用层的命令和数据进行解释,对各种语法赋予相应的含义,并按照一定的格式传送给会话层。其主要功能是处理用户信息的表示问题(如编码、数据格式转换、加密解密等)。表示层可以理解为定义数据的格式和加密方式。
应用层
应用层是OSI参考模型的第七层,它是计算机用户以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。它在其他六层工作的基础上,负责完成网络中应用程序与网络操作系统之间的联系,建立与结束使用者之间的联系,并完成网络用户提出的各种网络服务及应用所需的监督、管理和服务等各种协议,此外该层还负责协调各个应用程序之间的工作。应用层可以理解为需要进行网络通信的应用程序。
TCP/IP 五层协议将OSI参考模型中的应用层、表示层、会话层归为应用层;TCP/IP 四层协议将OSI参考模型中的应用层、表示层、会话层归为应用层,将物理层和数据链路层归为网络接口层
从TCP/IP四层协议来分析下浏览器浏览一个网页时发生了什么:
上图展示了基于TCP/IP四层协议的数据传输的流程:
请求流程:应用层(即浏览器将请求封装为HTTP网络请求数据)——》传送到传输层(按TCP协议加上TCP头部并封装为TCP数据报文)——》传送到网络层(按IP协议添加IP头部并封装为IP数据报文)——》传送到链路层(将数据转为链路层的数据帧,再转为比特流,通过物理介质进行传输)——》经过N层次的路由转发——》传输到达服务端(即接收到)的链路层(将比特流转为链路层的数据帧)——》传输到服务器的网络层(将链路层的数据解析为IP层数据报文)——》传输到服务器的传输层(将网络层的数据解析为TCP数据报文)——》传输到服务器的应用层(处理HTTP数据)
响应流程与请求流程相似,只是服务器变成了发送端,而浏览器变成接收端而已。
这是基于模型的数据层传输流程,其实现需要以下6大步骤:
1、域名解析
浏览器请求一个网页是,会发起HTTP请求,首先需要知道像哪天服务器发起请求,我们知道HTTP协议中有域名的信息,而网络通信并不能通过域名直接建立连接,所以首先进行域名解析(DNS:提供域名和IP地址的解析服务)将域名解析成IP地址,以便实现下一步的建立TCP连接
2、建立TCP连接
使用1中解析出的IP地址,建立TCP连接,建立TCP连接时,首先需要进行3次握手确保传输的可靠性,下图是TCP3次握手的流程图:
第一次握手:客户端向服务端发送含有SYN标识的数据包,表示含SYN数据包发给服务端了
第二次握手:服务端收到客户端发来的SYN之后,向客户端发送含SYN和ACK标识的数据包,表示服务端确认收到了客户端的数据
第三次握手:客户端收到服务端发过来的ACK确认数据包之后,向服务端发送含ACK的数据包,表示知道服务端收到数据包了,当前的连接是可靠的,可以开始传输数据了
3、发送HTTP请求
步骤2建立TCP连接之后,就可以开始将用户请求的HTTP数据包按传输层-》网络层-》链路层的数据包装将数据传输给服务端了
HTTP请求报文格式大概如下:
GET PATH HTTP/1.1\r\n -》请求方法 路径 HTTP版本
USER-AGENT: xxx\r\n -》HTTP请求头
CONTENT-LENGTH: xxx\r\n -》HTTP请求头
....\r\n-》HTTP请求头
\r\n
\r\n
....\r\n-》HTTP请求内容
4、服务器响应HTTP请求
服务器的Nginx/Apache等服务器软件接收客户端发来HTTP请求,经过解析之后进入响应站点入口,解析到相应的处理器进行请求处理,再将响应内容以HTTP发送给客户端。
HTTP响应报文格式大概如下:
HTTP/1.1 200 ok -》HTTP版本 状态码 状态描述信息
CONTENT-LENGTH: xxx\r\n -》HTTP请求头
....\r\n-》HTTP请求头
\r\n
\r\n
....\r\n-》HTTP请求内容
下列是状态的大概描述信息:
100-199: 信息性状态码;接收的请求正在处理
200-299:成功状态码;请求正常处理完毕
300-399:重定向状态码;需要进行附加操作以完成请求
400-499:客户端错误状态码;服务端无法处理的请求
500-599:服务端错误状态码;服务端处理请求出错
5、浏览器渲染
接收到服务端返回的响应内容,解析HTTP内容,按DOM进行渲染:构建DOM树-》构建Render(渲染)树-》布局Render(渲染)树-》绘制Render(渲染)树