首先我们需明确通信系统互联参考模型:
OSI/RM模型与TCP/IP模型:
OSI/RM模型是一种事实上被TCP/IP模型淘汰的模型,在当今世界上没有大规模使用。当发生HTTP请求时,发送方发送的数据是由最顶层向下层进行封包,接收方是由最下层向最顶层进行拆包。
下面说明一下各个层级的作用:
物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是将1、0转化为强弱电流来进行输出,到达目的后在转化为1、0,也就是数字信号与模拟信号的转换)。这一层的数据叫做比特(bit)。
数据链路层:主要将从物理层接收到的数据进行MAC地址的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的封装成帧、流量控制、数据的检错、重发等。
网络层:主要是将从数据链路层接收到的数据进行IP地址的封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫做数据包。网络层还可以实现拥塞控制、网际互连等功能。
传输层:定义传输数据的协议和端口号,如TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP恰好相反,用于传输可靠性不高,数据量小的数据)。主要是将从网络层接收到数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。传输层是第一个端到端,即主机到主机的层次。传输层还要处理端到端的差错控制和流量控制问题。
会话层:通过传输层建立数据传输的通路。主要在系统之间发起会话或者接受会话请求。
表示层:主要是对接收的数据进行解释、加密或解密、压缩与解压缩等,也就是把计算机识别的东西转换成人能够识别的东西。
应用层:操作系统或网络应用程序提供访问网络服务的接口,直接向用户提供接口。
在http请求过程中,首先进行url的解析,其中,http代表传输协议,www代表的是万维网服务器,baidi.com代表的是域名,80代表的是端口号(80端口默认不显示,浏览器默认http请求端口为80),select/index.html便是访问资源的逻辑路径,最后则是参数。
下面对http和https进行说明:http协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,http协议不适合一些敏感信息的传输。为了解决http协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议https。为了数据传输的安全,https在http的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
https的请求过程为:
域名方便记忆,但机器间互相只认IP地址,域名与IP地址之间是多对一的关系,一个ip地址不一定只对应一个域名,且一个域名只可以对应一个ip地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的。
dns域名解析的大致过程如下:
下面说明一下域名的递归解析:
假设我们需要查询app.baidu.com的ip地址,递归查询的流程为:首先在根域名服务器中查询,如果查询得到,则返回;如果查询不到,则到com顶级域名服务器查询,如果com顶及域名服务器查询得到,则返回;如果com顶级域名服务器查询不到,则到baidu.com二级域名服务器查询,如果查询到,则返回;如果baidu.com二级域名服务器查询不到,则到app.baidu.com权威域名服务器查询。通俗的讲,域名的递归解析为先父再子进行查询。
浏览器通过DNS解析得到的IP地址与服务器建立TCP连接,这里说明一下三次握手:
tcp连接完成后,http请求开始,请求有多种方式,常见的有get,post等。http请求包含请求头和请求体两部分,请求头中包含我们希望对请求文件的操作的信息,请求体中包含传递给后台的参数。服务器收到http请求后,便开始进行处理(涉及问题如跨域:跨协议、跨端口、跨域名中的一个)。服务器处理完毕后,生成响应数据包,响应也包含两部分,响应头和响应体,响应体就是我们所请求的文件。经过网络传输,文件被下载到本地浏览器,浏览器开始加载。
这里列举一下http的相应代码(部分常用):
200(成功)服务器已成功处理了请求。通常,这表示服务器提供了正确的响应。
301(请求重定向)请求的地址已永久定向到新地址。
400(请求错误)服务器不理解请求的语法,通常是参数错误造成的。
403(禁止)服务器拒绝请求。
404(未找到)服务器找不到请求的地址。
408(请求超时)服务器等候请求时发生超时。
500(服务器内部错误)服务器遇到错误,无法完成请求,一般是代码有bug。
浏览器渲染html代码,如果遇到类似于或