网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程

前言:作为一个程序员,刚刚接触前端知识的时候,就特别好奇,http是怎么通过一个url将报文从客户端传送到服务端?

提问:

http的一个请求经历了一个什么样的过程?

HTTP 协议

简单介绍的HTTP

HTTP(英文:Hyper Text Transfer Protocol,中文:超文本传输协议)是用于从万维网
(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

HTTP 使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。        

小知识

用户代理程序:简而言之就是一个Http请求的发起端的应用程序,最常见的就是浏览器,网络爬虫这类工具。

源服务器:就是http请求到的目标服务器,这个服务器会返回数据,如html和文件之类的一些资源。

在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。

我们使用 http 来访问 Web 上某个资源,比如 html/文本、word、avi 电影、其他资源。

以上内容简单了解下就好,无非是一些比较专业的一些名词。
 

基础知识之URI和URL

URI: 统一资源标识符,表示网络上存在一个资源。举个例子,在中国身份证是每个人的唯一标识,他表示一个人确认的存在。

URL:统一资源定位符,他也是个URI,不过他既是一个标识也是一个定位,他属于一个网络资源的一个定位,可以通过URL获取到该资源。

举个例子,还是上面的,我告诉你一个身份证号,但是我并不知到那个人,怎么去找这个人,URL就相当于不仅仅告诉你身份证号,还有家庭住址,通过住址我们就能实时找到这个人了。

总结:URI只是网络资源的编号,他只会表示一个资源的客观存在,而URL则是一个网络资源的定位,通过这个定位,我们可以获取到这个资源。每个URL 都是URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称(URN),见文知意,就是一个资源名称,可以理解为URI的一个名称。

一个完整URL的介绍

图示:

网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程

 介绍:

  1. 协议部分:该 URL 的协议部分为“http:”,这代表当前网页使用的是 HTTP 协议。在"HTTP"后面的“//”为分隔符;
  2. 域名部分:该 URL 的域名部分为“www.TofuCai.com”。在URL 中,也可以使用IP 地址作为域名使用;
  3. 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个 URL 必须的部分,如果省略端口部分,将采用默认端口;
  4. 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分虚拟目录也不是一个 URL 必须的部分。本例中的虚拟目录是“/first/”;
  5. 文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.html”。文件名部分也不是一个 URL 必须的部分,如果省略该部分,则使用默认的文件名;
  6. 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“userId=5&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符;
  7. 锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个 URL 必须的部分;

一次完整 http 请求的过程

1、首先进行 DNS 域名解析(NO1)

图示:

网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程

  • 首先会搜索浏览器自身的 DNS 缓存(缓存时间比较短,大概只有 1 分钟,且只能容纳 1000 条缓存);
  • 如果浏览器自身的缓存里面没有找到,那么浏览器会搜索系统自身的 DNS 缓存;
  • 如果还没有找到,那么尝试从 hosts 文件里面去找;
  • 在前面三个过程都没获取到的情况下,就去域名服务器去查找;

2、三次握手建立 TCP 连接(NO2)

图示:

网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程

 HTTP 通讯前,客户端需要和服务端建立网络连接连接,HTTP 连接实现由TCP 来完成的。HTTP 是比 TCP 更高层次的应用层协议,根据规则,只有低层协议建立之后,才能进行高层协议的连接,因此,首先要建立 TCP 连接,一般 TCP 连接的端口号是80;


3、客户端发起 HTTP 请求(NO3)

图示:

网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程

 建立连接后,就可以请求服务端


4、服务器响应 HTTP 请求(NO4)

网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程

服务端进行一定的业务处理后,将数据返回至客户端


5、客户端解析 html 代码,并请求 html 代码中的静态资源

图示:

网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程

浏览器拿到 html 文件后,就开始解析其中的 html 代码,遇到 js/css/image 等静态资源时,就向服务器端去请求下载


6、客户端渲染展示内容

网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程

 客户端将解析后的HTML内容进行渲染展示


7、关闭 TCP 连接

图示:

网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程

一般情况下,一旦服务器向客户端返回了请求数据,它就要关闭 TCP 连接,然后如果客户端或者服务器在其头信息加入了这行代码 Connection:keep-alive ,TCP 连接在发送后将仍然保持打开状态,于是,客户端可以继续通过相同的连接发送请求,也就是说前面的 NO3到 NO6,可以反复进行。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

HTTP 协议报文结构

一言代过

用http协议进行数据交互的叫做http报文(好一句废话)。HTTP 报文本身是由多行(用 CR+LF 作
换行符)数据构成的字符串文本(这个不算废话)。一般报文分为报文头和报文体两部分,一开始的时候用换行符来(CR+LF)进行划分。

请求报文结构


请求报文的首部内容由以下数据组成:
请求行 —— 包含用于请求的方法、请求 URI 和 HTTP 版本。
首部字段 —— 包含表示请求的各种条件和属性的各类首部。(通用首部、请求首部、实体首部以及 RFC 里未定义的首部如 Cookie 等)

网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程

网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程

响应报文结构


状态行 —— 包含表明响应结果的状态码、原因短语和 HTTP 版本。
首部字段 —— 包含表示请求的各种条件和属性的各类首部。(通用首部、响应首部、实体首部以及 RFC 里未定义的首部如 Cookie 等)

网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程

网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程

网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程

上一篇:UnityILRuntime使用UnityWebRequest加载Dll文件


下一篇:梯度反转层