Java web编程之基础理论详解(计算机网络基础,HTTP请求的完成过程)

1.计算机网络基础知识

首先我们需明确通信系统互联参考模型:

OSI/RM模型与TCP/IP模型:

                

OSI/RM模型是一种事实上被TCP/IP模型淘汰的模型,在当今世界上没有大规模使用。当发生HTTP请求时,发送方发送的数据是由最顶层向下层进行封包,接收方是由最下层向最顶层进行拆包。

下面说明一下各个层级的作用:

 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是将1、0转化为强弱电流来进行输出,到达目的后在转化为1、0,也就是数字信号与模拟信号的转换)。这一层的数据叫做比特(bit)。

数据链路层:主要将从物理层接收到的数据进行MAC地址的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的封装成帧、流量控制、数据的检错、重发等。

网络层:主要是将从数据链路层接收到的数据进行IP地址的封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫做数据包。网络层还可以实现拥塞控制、网际互连等功能。

传输层:定义传输数据的协议和端口号,如TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP恰好相反,用于传输可靠性不高,数据量小的数据)。主要是将从网络层接收到数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。传输层是第一个端到端,即主机到主机的层次。传输层还要处理端到端的差错控制和流量控制问题。

会话层:通过传输层建立数据传输的通路。主要在系统之间发起会话或者接受会话请求。

表示层:主要是对接收的数据进行解释、加密或解密、压缩与解压缩等,也就是把计算机识别的东西转换成人能够识别的东西。

应用层:操作系统或网络应用程序提供访问网络服务的接口,直接向用户提供接口。

2.HTTP请求过程

1)解析URL

  在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的请求过程为:

  1. 客户端的浏览器向服务器传送客户端SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。
  2. 服务器向客户端传送SSL协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。
  3. 客户端利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行此证书的CA机构是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开。
  4. 用户端随机产生一个用于后面通讯的“对称密码”,然后用服务器的公钥(服务器的公钥从服务器传来的证书中获得)对其加密,然后将加密后的“预主密码”传给服务器。
  5. 如果服务器要求客户的身份认证(在握手过程中为可选),用户可以建立一个随机数然后对其进行数据签名,将这个含有签名的随机数和客户自己的证书以及加密过的“预主密码”一起传给服务器。
  6. 如果服务器要求客户的身份认证,服务器必须检验客户证书和签名随机数的合法性。
  7. 服务器和客户端用相同的主密码即“通话密码”,一个对称密钥用于SSL 协议的安全数据通信的加解密通信。
  8. 客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤7中的主密码为对称密钥,同时通知服务器客户端的握手过程结束。
  9. 服务器向客户端发出信息,指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。
  10. SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。

2)DNS解析

   域名方便记忆,但机器间互相只认IP地址,域名与IP地址之间是多对一的关系,一个ip地址不一定只对应一个域名,且一个域名只可以对应一个ip地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的。

     dns域名解析的大致过程如下:

  1. 浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就结束。
  2. 如果用户浏览器缓存中没有数据,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果。
  3. 如果操作系统缓存中没有这个缓存,则进行路由缓存查找:在路由器中查找域名缓存。
  4. 如果路由缓存没有这个缓存,则在ISP的DNS服务器进行查找:ISP是互联网服务提供商(Internet Service Provider,如移动、联通机房)的简称,ISP有专门的DNS服务器应对DNS查询请求。 
  5. 如果ISP的DNS服务器还找不到的话,它就会向根服务器发出请求,进行递归查询。

    下面说明一下域名的递归解析:

    

   假设我们需要查询app.baidu.com的ip地址,递归查询的流程为:首先在根域名服务器中查询,如果查询得到,则返回;如果查询不到,则到com顶级域名服务器查询,如果com顶及域名服务器查询得到,则返回;如果com顶级域名服务器查询不到,则到baidu.com二级域名服务器查询,如果查询到,则返回;如果baidu.com二级域名服务器查询不到,则到app.baidu.com权威域名服务器查询。通俗的讲,域名的递归解析为先父再子进行查询。

3)浏览器与服务器建立TCP连接

   浏览器通过DNS解析得到的IP地址与服务器建立TCP连接,这里说明一下三次握手:

                                                 

  1. 第一次握手:客户端向服务器端发送请求(SYN=k) 等待服务器确认;
  2. 第二次握手:服务器收到请求并确认,回复一个指令(SYN=j,ACK=k+1);
  3. 第三次握手:客户端收到服务器的回复指令并返回确认(ACK=j+1)。

4)请求和传输数据

  tcp连接完成后,http请求开始,请求有多种方式,常见的有get,post等。http请求包含请求头和请求体两部分,请求头中包含我们希望对请求文件的操作的信息,请求体中包含传递给后台的参数。服务器收到http请求后,便开始进行处理(涉及问题如跨域:跨协议、跨端口、跨域名中的一个)。服务器处理完毕后,生成响应数据包,响应也包含两部分,响应头和响应体,响应体就是我们所请求的文件。经过网络传输,文件被下载到本地浏览器,浏览器开始加载。

     这里列举一下http的相应代码(部分常用):

     200(成功)服务器已成功处理了请求。通常,这表示服务器提供了正确的响应。

     301(请求重定向)请求的地址已永久定向到新地址。

     400(请求错误)服务器不理解请求的语法,通常是参数错误造成的。

     403(禁止)服务器拒绝请求。

     404(未找到)服务器找不到请求的地址。

     408(请求超时)服务器等候请求时发生超时。

     500(服务器内部错误)服务器遇到错误,无法完成请求,一般是代码有bug。

5)html页面渲染

 浏览器渲染html代码,如果遇到类似于<link>或<script>等资源标签,会再次进行http请求。注意:由于http1.1协议增加了Connection: keep-alive声明,故tcp连接不会关闭,可以复用。

6)释放连接

  数据完成传输后,通信的双方可以释放。下面说明一下四次握手:

                                   

  1. TCP客户端发送一个FIN,用来关闭客户到服务器的数据传输。
  2. 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。
  3. 服务器关闭客户端的连接,发送一个FIN给客户端。
  4. 客户端发回ACK确认,并将确认序号设置为收到序号加1。

 为什么建立连接需要三次握手而关闭连接需要四次握手呢?

 因为关闭连接的时候,服务器可能还在发送数据。关闭连接的时候,服务器需要做好关闭连接的准备(例如数据中断传输与保存),这些准备完毕后,通知客户端关闭连接,因此需要四次握手。

猜你喜欢

转载自blog.csdn.net/m0_38075425/article/details/81667279