HTTP协议看这一篇就够了


关联文章:

一、HashMap看这一篇就够了
二、synchronized看这一篇就够了

1、HTTP

1.1 什么是 HTTP

  1. HTTP协议 全称为超文本传输协议(Hypertext transfer protocol)。是一种详细规定了客户端与服务端之间互相通信的规则,通过因特网传送万维网文档的数据传送协议
  2. HTTP协议是TCP/IP模型中的应用层协议之一,由请求和响应构成,是一个标准的客户端服务器模型。HTTP也是一个无状态的协议
  3. HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,就成了我们常说的HTTPS,HTTP默认的端口号为80,HTTPS的端口号为443
    在这里插入图片描述

1.2 HTTP 的特点

  1. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快
  2. 灵活:HTTP允许传输任意类型的数据对象 json xml text等
  3. HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后断开连接。HTTP 1.1后默认持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个请求,节省建立新连接所需的时间和网络带宽
  4. 无状态:HTTP协议是无状态协议

1.3 TCP/IP 通信传输流

利用 TCP/IP 协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则从链路层往上走
在这里插入图片描述
链路层详解:

在这里插入图片描述

2、http工作过程

  1. 建立 TCP 连接
    在HTTP工作开始之前,客户端首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的,TCP协议与 IP 协议共同构建 Internet,即 TCP/IP 协议族,因此 Internet 又被称作是 TCP/IP 网络。HTTP 是比 TCP 更高层的应用层协议,根据规则,只有低层协议建立之后,才能进行高层协议的连接,因此,首先要建立 TCP 连接
  2. 客户端向服务器发送请求命令
    一旦建立了TCP连接,客户端就会向服务器发送请求命令;
    例如:GET/sample/hello.jsp HTTP/1.1
  3. 客户端发送请求头信息
    客户端发送请求命令后,还要以头信息的形式向服务器发送一些信息,之后再次发送了一空白行来通知服务器,已经结束了头信息的发送
  4. 服务器应答
    响应的第一部分是协议的版本号和响应状态码
    例如: HTTP/1.1 200 OK
  5. 服务器返回响应头信息
  6. 服务器向客户端发送数据
    服务器向客户端发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以 Content-Type 响应头信息所描述的格式发送用户所请求的实际数据
  7. 服务器关闭 TCP 连接
    一般情况下,服务器向客户端返回请求数据后就要关闭 TCP 连接,但是如果客户端或者服务器在其头信息加入了 Connection:keep-alive ,TCP 连接在发送后将仍然保持打开状态,客户端可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽

3、网络体系结构分层

在这里插入图片描述
计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议(protocol)。

TCP/IP 是互联网相关的各类协议族的总称,比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协议。

TCP/IP模型是互联网的基础,它是一系列网络协议的总称。这些协议可以划分为四层,分别为链路层、网络层、传输层和应用层。

  1. 链路层:负责封装和解封装IP报文,发送和接受ARP/RARP报文等。
  2. 网络层:负责路由以及把分组报文发送给目标网络或主机。
  3. 传输层:负责对报文进行分组和重组,并以TCP或UDP协议格式封装报文。
  4. 应用层:负责向用户提供应用程序,比如HTTP、FTP、Telnet、DNS、SMTP等。

在网络体系结构中网络通信的建立必须是在通信双方的对等层进行,不能交错。 在整个数据传输过程中,数据在发送端时经过各层时都要附加上相应层的协议头和协议尾(仅数据链路层需要封装协议尾)部分,也就是要对数据进行协议封装,以标识对应层所用的通信协议。接下去介绍TCP/IP 中有两个具有代表性的传输层协议----TCP 和 UDP。

4、HTTP 协议发展历史

在这里插入图片描述

4.1 HTTP/0.9

HTTP 是基于 TCP/IP 协议的应用层协议。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。
特点:

  1. 只有一个GET命令
  2. 服务器只能回应HTML格式的字符串,不能回应别的格式
  3. 服务器响应完毕,就会关闭TCP连接

4.2 HTTP/1.0

  1. 增加了很多命令 POST HEAD等
  2. 增加了http code码 和 header
  3. 增加多字符集支持、多部分发送、权限、缓存等

4.3 HTTP/1.1

  1. 持久连接 即TCP连接默认不关闭,可以被多个请求复用
  2. 管道机制(pipeline)
  3. 分块传输编码
  4. 新增动词方法:PUT、PATCH、HEAD、 OPTIONS、DELETE

缺点:虽然1.1版允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为"队头堵塞"(Head-of-line blocking)。该问题是后面http版本主要解决的问题。

4.4 SPDY

2009年,谷歌公开了自行研发的 SPDY 协议,主要解决 HTTP/1.1 效率不高的问题。当作 HTTP/2 的基础版,主要特性都在 HTTP/2 之中得到继承。

4.5 HTTP/2

2015年,HTTP/2 发布,不叫 HTTP/2.0的原因是因为标准委员会不打算再发布子版本了,下一个新版本将是 HTTP/3。(之所以http/2仅用3年时间就发展到http/3是因为http/2有一个非常严重的问题,因为http/2是基于TCP协议,当发生丢包现象时,整个 TCP 都要开始等待重传,那么就会阻塞该TCP连接中的所有请求,其表现反倒不如 HTTP/1 了。)

  1. 所有数据以二进制传输。
    二进制协议的一个好处是,可以定义额外的帧。HTTP/2 定义了近十种帧,为将来的高级应用打好了基础。如果使用文本实现这种功能,解析数据将会变得非常麻烦,二进制解析则方便得多。
  2. 多工
    HTTP/2 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了"队头堵塞"。
  3. 头部信息压缩
  4. 服务器推送
    HTTP/2 允许服务器未经请求,主动向客户端发送资源,这叫做服务器推送

4.6 HTTP/3

  1. 引入QUIC,提供类似http/2的流管理
  2. 连接迁移
  3. 解决队头阻塞
  4. 拥塞控制
  5. 流量控制
  6. 0RTT快速建连

5、HTTP 层级结构图

在这里插入图片描述
http/2与http/3的结构差异:
在这里插入图片描述
由上图可见:http/2是基于TCP协议之上,而http/3是基于UDP协议且作用于QUIC协议之上

6、TCP与UDP对比

在这里插入图片描述

7、TCP与UDP建连对比图

在这里插入图片描述

8、附属知识分享

8.1 TCP首部结构图

在这里插入图片描述

8.2 IP首部

在这里插入图片描述

8.3 HTTP协议之分段传输与分块编码

8.3.1 数据的分段传输

服务器端收到Connection值为keep-alive的数据包时,会先将它存储在一个缓冲区中,当收到Connection 值为 close 的数据包时,即表明这次数据传输完成。

Content-Length 消息头字段表示数据的长度。数据的长度很重要,因为服务器端需要知道哪里是应答消息的结束,以及后续应答消息的开始。然而,使用分段传输,数据分解成一系列数据块,并以一个或多个块发送,这样可以发送数据而不需要预先知道发送内容的总大小。

服务器端收到 Connection值为close的请求消息后,就会把之前的Content-Length加起来,即是我们请求的数据的总大小了。
通常数据块的大小是一致的,但也不总是这种情况。

8.3.2 数据的分块编码

只适用于 POST 提交方式。
请求头中加入字段: Transfer-Encoding: chunked。
每个分块包含十六进制的长度值和数据,空格也算一个长度值,长度值独占一行,最后需要用0独占一行表示编码结束。并在0后空两行表示数据包结束。

8.4 分块传输方式的好处

服务器发送数据到接受者前不需要知道数据的字节长度,所以可以动态产生响应内容而不用先将所有数据进行缓存;由于当消息体结束的时候有明确的信号标识(0),因此后面对同一HTTP服务器的请求可以复用本次连接。

允许服务器在消息体后面发送额外的响应头字段,这个非常重要当一个字段的值要等到响应内容全部产生后才能确定的情况下,如响应内容的数字签名,如果不使用分块传输服务器为了计算响应内容的算数字签名则必须先缓存所有内容直到内容产生完成。(如果不采用Chunked分块传输则在消息体后面发送的响应头不能被接受者正确获取)。

数据传输体积更小 可以和gzip共同使用只是作用于不同阶段 第一阶段响应内容字节流采用gzip进行压缩编码,压缩完成后产生的字节流采用chunked的方式进行传输编码 。

8.5 pipeline 管道化

管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求。这样就进一步改进了HTTP协议的效率。

例来说,客户端需要请求两个资源。以前的做法是,在同一个TCP连接里面,先发送A请求,然后等待服务器做出回应,收到后再发出B请求。管道机制则是允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序,先回应A请求,完成后再回应B请求。

8.6 TCP拥塞控制

TCP 拥塞控制由 4 个核心算法组成:慢启动、拥塞避免、快速重传和快速恢复。

  • 慢启动:发送方向接收方发送 1 个单位的数据,收到对方确认后会发送 2 个单位的数据,然后依次是 4 个、8 个……呈指数级增长,这个过程就是在不断试探网络的拥塞程度,超出阈值则会导致网络拥塞
  • 拥塞避免:指数增长不可能是无限的,到达某个限制(慢启动阈值)之后,指数增长变为线性增长
  • 快速重传:发送方每一次发送时都会设置一个超时计时器,超时后即认为丢失,需要重发
  • 快速恢复:在上面快速重传的基础上,发送方重新发送数据时,也会启动一个超时定时器,如果收到确认消息则进入拥塞避免阶段,如果仍然超时,则回到慢启动阶段
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值