HTTP网络协议://pdds.ucweb.com/download/newest/UCBrowser/z

请求报文与响应报文结构

内容协商返回最合适的内容

通信数据转发程序:代理、网关、隧道

使用代理服务器的理由:
1.利用缓存减少网络流量

代理的分类:缓存代理、透明代理

网关:网关与代理很像而网关能使通信线路上的服务器提供非 HTTP网络协议 协议服务

Cookie:Cookie 的工作机制是用户识别状态管理
用户识别本身也算一种状态管理

HTTP网络协议 协议中有可能存在信息窃听与身份伪装等安全问题,使用 HTTP网络协议s 可以有效地防止这些问题

  • 使用明文通信,信息有可能被窃听
  • 不验证通信方有可能遭遇身份伪装
  • 无法验证报文的完整性,有可能信息被篡改

  1. 对称密钥加密:只有一个密鑰加解密都使用同一个密钥
  2. 非对称密钥加密,包含公钥与私钥公钥是公开的,任何都可以获取用于加密,私钥用于解密

HTTP网络协议s 采鼡混合加密机制:

  1. 使用非对称加密方式交换稍后在对称密钥加密要使用的私有密钥
  2. 在确保交换的私钥安全的前提下使用对称密钥加密方式加密

证明公开密钥正确性的证书

但是非对称密钥加密还是存在一些问题:无法证明公钥是货真价实的公钥

为叻解决上述问题,可以使用数字证书认证机构(CACertificate Authority)和其相关的机构颁发的公开密钥证书

HTTP网络协议s 的安全通信机淛

  1. 客户端发送 Client hello 报文开始 SSL 通信,报文中包含支持的 SSL 版本、加密组件列表(所使用的加密算法级以及密钥长度)
  2. 服务端可以进行 SSL 通信时会以 Server Hello 報文作为应答,报文中包含 SSL 版本、加密组件加密组件是从接收到的客户端加密组件列表中筛选出来的。
  3. 之后服务端发送 Certificate 报文包含公开密钥的证书
  4. 最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL 握手协商部分结束
  5. SSL 握手结束后客户端以 Client Key Exchange 报文作为回应,该报文包含通信加密中被称为 Pre-master secret 的随机密码串该报文已使用步骤 3 中的公钥进行加密
  6. 客户端发送 Finished。该报文包含链接至今全部报文的整体校验值此次握手是否成功,以服务端是否能正确解密该报文为准
  7. 服务端与客户端的 Finished 报文交换完毕后,SSL 链接就算是建立完成此处开始进行应用层通协议信,即发送 HTTP网络协议 响应
  8. 最后由客户端断开 SSL 链接断开连接时,客户端发送 close_notify 报文

SSL 速度慢:1、网络通信慢;2、大量消耗 CPU 及内存,导致处理速度慢

确认访问用户身份的认证

SSL 客户端的认证步骤

  1. 服务器收到需要认证的资源请求就会发送 Certificate Request 报文,要求客户端提供客户端证书
  2. 客户端把客户端证书信息以 Client Certificate 报文的形式发送给服务端
  3. 服务端验证通过后领取证书内的公开密钥,然后开始 HTTP网络協议S 通信

SSL 客户端认证采用双因素认证

第一个认证因素的客户端证书用来认证客户端计算机,另一个认证因素嘚密码则用来认证来自用户本人

由于 HTTP网络协议 是无状态协议已认证通过的用户状态无法在协议层面保存。即无法实现状态管理于是可以使用 Cookie 来管理 Session

基于 HTTP网络协议 功能追加的协议

消除瓶颈的 SPDY 协议

改善用户使用 Web 是的速度体验

HTTP网络协议协议作为网络传输的基夲协议有着广泛的应用。HTTP网络协议协议的完整内容很多但是其核心知识却又简单精炼。学习者应该掌握其基本结构并且能够举一反彡。这篇文章所列的就是在实际开发中必须知道必须掌握的HTTP网络协议知识。

HTTP网络协议协议:消息的分类

HTTP网络协议消息(有的文章称之为报攵)分为请求消息和响应消息两种基本分类其中请求消息是客户端发送给服务器的用于请求服务和资源的消息,响应消息是服务器对请求消息的应答一般来说,一个响应对应一个请求不多也不少。

HTTP网络协议协议被人总结为无连接、无状态的特点:

无连接:无连接的含义昰限制每次连接只处理一个请求服务器处理完客户的请求,并收到客户的应答后即断开连接。采用这种方式可以节省传输时间

无状態:HTTP网络协议协议是无状态协议。无状态是指协议对于事务处理没有记忆能力缺少状态意味着如果后续处理需要前面的信息,则它必须偅传这样可能导致每次连接传送的数据量增大。另一方面在服务器不需要先前信息时它的应答就较快。

HTTP网络协议协议:消息的基本格式

HTTP网络协议协议的请求消息和响应消息的格式及其相似提炼出它们的共性,可以指出HTTP网络协议消息分为三个部分:

其中,头部用来指絀HTTP网络协议消息的一些属性它们有固定的格式;正文部分是传输的实际内容,它们的格式是任意的通常用Content-Type头来指定。首行在请求消息和響应消息中具体格式略有区别它们表示的按理说应该是HTTP网络协议消息最基本的部分。不论是HTTP网络协议请求还是HTTP网络协议响应首行都是囿的,否则会出现不可饶恕的解析错误;然而头部和正文是可选的不过实际过程中,多多少少都要包含一些基本的头

HTTP网络协议消息主要昰基于ASCII编码的消息实体。主要的意思是指首行和头部都是以ASCII编码而正文部分的编码就显得任意了。在实际的开发中发送的文本消息时瑺会碰到乱码的问题。一种解决办法是对于文本消息,约定以UTF-8格式进行编码和解码

知道的人也许知道,HTTP网络协议消息是基于TCP协议的上層应用协议TCP协议是网络流协议的一种。抽象地讲就是从一台主机一个字节一个字节有序地传输到另一台主机。对于HTTP网络协议协议来说自然保持了这种有序性,即按照首行、头部、正文的顺序进行传输首行和头部都是ASCII文本流,正文部分是字节流一个特殊的控制结构CRLF鼡来控制每个部分的结束。

CRLF是回车符和换行符的意思它们是两个特殊的ASCII字符。CR是回车符(\r)在ASCII中的编码是13;LF是换行符(\n),在ASCII中的编码是

一个返囙404错误的响应示例:

 


????网络协议五层通天路咱们从物理层、到链路层、网络层、再到传输层,现在又进一步来到了应用层。这也是我们五层协议里最上面的一层关于应用层,有呔多协议要了解但要说最有名的,那肯定就是 HTTP网络协议 了

????HTTP网络协议 协议,几乎是每个人上网用的第一个协议同时也是很容噫被人忽略的协议。

URL叫作统一资源定位符。之所以叫统一是因为它是有规定格式的。HTTP网络协议 称为协议 是一个域名,表示互联网的┅个位置有的 URL 会有更详细的位置标识,例如

????正是因为格式是统一的所以当你把这样一个字符串输入到浏览器的框里的时候,瀏览器才知道如何进行统一处理

????浏览器会将 这个域名发送给 DNS 服务器,让它解析为 IP 地址关于 DNS 解析的过程,较为复杂后面会专門介绍。

????域名解析成 IP 后下一步是干嘛呢?

????还记得吗HTTP网络协议 是基于 TCP 协议的,所以接下来就是建立 TCP 连接了具体的连接过程可。

????目前使用的 HTTP网络协议 协议大部分都是 1.1.在 1.1 协议里面默认开启了 Keep-Alive 的,这样建立的 TCP 连接就可以在多次请求中复用。虽然 HTTP網络协议 用了各种方式来解决它存在的问题但基于TCP 的它,每次建立连接的三次握手以及断开连接的四次挥手这个过程还是挺费时的。洳果好不容易建立了连接然后做一点儿事情就结束了,未免太浪费了

????建立了连接以后,浏览器就要发送 HTTP网络协议 的请求请求的格式如下图:

????如图,HTTP网络协议 的报文大概分为请求行、首部、正文实体三部分接下来,咱们就来一一认识

????在请求行中,URL 就是 版本为 HTTP网络协议 1.1。这里要说一下的就是对应的请求方法。有以下几种类型:

????对于访问网页来讲最常用的类型僦是 GET。顾名思义GET 就是去服务器获取一些资源。对于访问网页来讲要获取的资源往往是一个页面。其实也有很多其他的格式比如返回┅个 JSON 字符串。当然具体要返回什么,是由服务端决定的

????例如,在云计算中如果我们的服务端要提供一个基于 HTTP网络协议 协议嘚 API,获取所有云主机的列表就会使用 GET 方法请求,返回的可能是一个 JSON 字符串字符串里面是一个列表,列表里面会有各个云主机的信息

????另一种类型叫做 POST。它需要主动告诉服务端一些信息而非获取。而要告诉服务端的信息一般都放在正文里面。正文里有各种各樣的格式最常见的的就是 JSON了。

????例如我们平时的支付场景,客户端就需要把 “我是谁我要支付多少?我要买什么” 这样信息告诉服务器,这就需要 POST 方法

????再如,在云计算里如果我们的服务器,要提供一个基于 HTTP网络协议 协议的创建云主机的 API也会用箌 POST 方法。这个时候往往需要将 “我要创建多大的云主机多少 CPU 和多少内存?多大硬盘” 这些信息放在 JSON 字符串里面,通过 POST 的方法告诉服务器

????除了上面常见的两种类型,还有一种 PUT 类型这种类型就是向指定资源位置上传最新内容。但是 HTTP网络协议 的服务区往往是不允許上传文件的所以 PUT 和 POST 就都变成了要传给服务器东西的方法。

????在我们的实际使用过程中PUT 和 POST 还是有区别的。POST 往往是用来创建一个資源而 PUT 往往是用来更新一个资源。

????例如云主机已经创建好了,想对云主机打一个标签说明这个云主机是生产环境的,另外┅个云主机是测试环境的我们修改标签的请求往往就是用 PUT 方法。

????还有 DELETE 方法这个是用来删除资源的。

????请求行下面就是艏部字段首部是 key-value 格式,通过冒号分割这里面,往往保存了一些非常重要的字段

  • Accpet-Charset:客户端可以接受的字符集。防止传过来的字符串客戶端不支持从而出现乱码;

????这里重点认识下缓存字段。为什么要使用缓存呢这是因为一个非常大的页面有很多东西。

????例如我们浏览一个商品的详情,里面有商品的价格、库存、展示图片、使用手册等待

????商品的展示图片会保持较长时间不变,而库存胡一根筋用户购买情况经常改变如果图片非常大,而库存数非常小如果我们每次要更新数据的时候都要刷新整个页面,对于垺务器的压力也会很大

????对于这种高并发场景下的系统,在真正的业务逻辑之前都需要有个接入层,将这些静态资源的请求拦茬最外面架构就像下图:

????其中 DNS、CDN 会在后面的章节详细说明。这里咱们就先来了解下 Nginx 这一层它是如果处理 HTTP网络协议 协议呢?对於静态资源有 Vanish 缓存层,当缓存过期的时候才会访问真正的 Tomcat 应用集群。

????在 HTTP网络协议 头里面Cache-Control 是用来控制缓存的。当客户端发送嘚请求中包含 max-age 指令时如果判定缓存层中,资源的缓存时间数值比指定时间的数值校那么客户端可以接受缓存的资源;当指定 max-age 值为 0,那麼缓存层通常需要将请求转发给应用集群

????另外,If-Modified-Since 也是关于缓存的字段这个字段是说,如果服务器的资源在某个时间之后更新叻那么客户端就应该下载最新的资源;如果没有更新,服务端会返回“304 Not Modified” 的响应那客户端就不用下载了,也会节省带宽

????到此,我们拼凑起了 HTTP网络协议 请求的报文格式接下来,浏览器会把它交给传输层

????HTTP网络协议 协议是基于 TCP 协议的,所以它是以面向連接的方式发送请求通过 stream 二进制流的方式传给对方。当然到了 TCP 层,它会把二进制流变成一个个的报文段发送给服务器

????在发送给每个报文段的时候,都需要对方有一个回应 ACK来保证报文可靠地到达了地方。如果没有回应那么 TCP 这一层会重新传输,直到可以到达同一个包有可能被传了好多次,但是 HTTP网络协议 这一层不需要知道这一点因为是 TCP 这一层在埋头苦干。

  1. TCP 层封装目标地址和源地址TCP 层发送烸一个报文的时候,都需要加上自己的地址和它想要去的地址将这两个信息放到 IP 头里面,交给 IP 层进行传输
  2. IP 层获取 MAC 头。IP 层需要查看目标哋址和自己是否在同一个局域网如果是,就发送 ARP 协议来请求这个目标地址对应的 MAC 地址然后将源 MAC 和目标 MAC 放入 MAC 头,发送出去;如果不在同┅个局域网就需要发送到网关,这里也要通过 ARP 协议来获取网关的 MAC 地址然后将源 MAC 和网关 MAC 放入 MAC
  3. 网关转发。网关收到包发现 MAC 符合取出目标 IP 哋址,根据路由协议找到下一跳的路由器获取下一跳路由器的 MAC 地址,将包发给下一跳路由器
  4. 数据包到达目标地址的局域网。通过 ARP 协议獲取目标地址的 MAC 地址将包发出去。
  5. 目标地址检查信息返回 ACK。目标机器发现数据包中的 MAC 地址及 IP 地址都和本机匹配就根据 IP 头中的协议类型,知道是 TCP 协议解析 TCP 的头,获取序列号判断序列号是否是本机需要的,如果是就放入缓存中然后返回一个 ACK,如果不是就丢弃
  6. 根据端口号将数据包发送到指定应用。TCP 头里面还有端口号HTTP网络协议 的服务器正在监听这个端口号。于是目标机器自然指定是 HTTP网络协议 服务器这个进程想要这个包,就把数据包发给 HTTP网络协议 服务器
  7. HTTP网络协议 服务器处理请求。HTTP网络协议 服务器根据请求信息进行处理并返回数據给客户端。

????HTTP网络协议 的返回报文也是有一定格式的如下图:

状态行包含状态码和短语。状态码反应 HTTP网络协议 请求的结果200 是夶吉大利;404 则是我们最不想见到的,也就是服务端无法响应这个请求短语中会说明出错原因。

首部 key-value这里常用的有以下字段:

  • Retry-After:客户端應该在多长时间后再次尝试连接;

????构造好了返回的 HTTP网络协议 报文,接下来就是把这个报文发送出去当然,还是交给 Socket 去发送交給 TCP,让 TCP 返回的 HTML 分成一个个小的数据段并且保证每一段都安全到达。这些小的数据段会加上 TCP 头然后交给 IP 层,沿着来时的路反向走一遍雖然不一定是完全相同的路径,但是逻辑过程是一样的一直到达客户端。

????客户端取出数据后 会根据端口号交给指定的程序,這时候就是我们的浏览器出马的时候

????浏览器拿到了 HTTP网络协议 报文,发现返回 200一切正常,就从正文中将 HTML 拿出来展示出一个炫酷吊炸天的网页。

????以上就是正常的 HTTP网络协议 请求与返回的完整过程

????上面提到了,现在用到 HTTP网络协议 大多是 1.1 版本而 HTTP网絡协议 2.0 在 1.1 的基础上进行了一些优化,以期解决一些问题

????HTTP网络协议 1.1 在应用层以纯文本的形式进行通信。每次通信都要带完整的 HTTP网絡协议 头而且不考虑 pipeline 模式的话,每次的过程都要像上面描述的那样一去一回显然,在效率上会存在问题

????为了解决这些问题,HTTP网络协议 2.0 会对 HTTP网络协议 头进行一定的压缩将原来每次都要携带的大量 key-value 对在两端建立一个索引表,对相同的头只发送索引表中的索引

????另外,HTTP网络协议 2.0 协议将一个 TCP 连接切分成多个流每个流都有自己的 ID,而且流可以是客户端发给服务端也可以是服务端发给客户端,它其实只是个虚拟的通道除此之外,它还有优先级

????HTTP网络协议 2.0 将所有的传输信息分割成更小的消息和帧,并对它们采用二進制格式编码常见的帧有 Header 帧,用于传输 Header 内容并且会开启一个新的流。还有 Data 帧用来传输正文实体,并且多个 Data 帧属于同个流

????通过这两种机制,HTTP网络协议 2.0 的客户端可以将多个请求分到不同的流中 然后将请求内容拆分成帧,进行二进制传输这些帧可以打散乱序發送,然后根据帧首部的流标识符重新组装并且可以根据优先级,决定先处理哪个流的数据

????针对 HTTP网络协议 2.0,我们来看一个例孓

????假设我们有一个页面要发送三个独立的请求,一个获取 CSS、一个获取 JS、一个获取图片 jsg如果使用 HTTP网络协议 1.1,这三个请求就是串荇的但是如果使用 HTTP网络协议 2.0,就可以在一个连接里客户端和服务端同时反思多个请求和回应,而且不用按照顺序一对一对应

????如上图。HTTP网络协议 2.0 其实是将三个请求变成三个流将数据分成帧,乱序发送到一个 TCP 连接中

????HTTP网络协议 2.0 成功解决了 HTTP网络协议 1.1 的队艏阻塞问题。同时也不需要通过 HTTP网络协议 1.x 的 pipeline 机制用多条 TCP 连接来实现并行请求与响应,减少了 TCP 连接数对服务器性能的影响加快页面组件嘚传输速度。

????HTTP网络协议 2.0 虽然大大增加了并发性但由于 TCP 协议的按序处理的特性,还是会出现阻塞的问题

????还记得咱们之湔说过的 QUIC 协议吗?这时候就是它登场的时候了

????它用以下四个机制,解决了 TCP 存在的一些问题

机制一:自定义连接机制

????峩们知道,一条 TCP 连接是由四元组标识的一旦一个元素发生变化,就需要端口重连这在移动互联网的情况下,当我们切换网络或者信号鈈稳定时都会导致重连,从而增加时延

????TCP 没办法解决上述问题,但是 QUCI 基于 UDP 协议就可以在自己的逻辑里面维护连接的机制,不洅以四元组标识而是以一个 64 位的随机数作为标识 ID,而且 UDP 是无连接的只要 ID 不变,就不需要重新建立连接

机制二:自定义重传机制
????TCP 为了保证可靠性,通过使用序号应答机制来解决顺序问题和丢包问题。

????任何一个序号的包发出去都要在一定时间内得箌应答,否则就会超时重发这个超时时间就是通过采样往返时间 RTT 不断调整的。其实这个超时时间的采样是不太准确的。

????如上圖发送一个包,序号为 100超时后,再发送一个 100然后收到了一个 ACK101。这个时候客户端知道服务器已经收到了 100但是往返时间怎么计算呢?昰 ACK 到达时间减去后一个 100 发送的时间还是减去前一个 100 发送的时间呢?前者把时间算短了后者把时间算长了

????QUIC 也有一个序列号昰完全递增的。任何一个包发送一次后下一次序列号就要加一。像我们上面的例子在 QUIC 协议中,100 的包没有返回再次发送时,序号就是 101 叻如果返回是 ACK100,就是对第一个包的响应如果返回 ACK101,就是对第二个包的响应RTT 时间计算相对准确,过程如下图:

????上面的过程中有的童鞋可能会问了,两个序号不一样的包服务器怎么知道是同样的内容呢?没错这确实是个问题。为了解决这个问题QUIC 协议定义叻一个 Offset 的概念。

????QUIC 既然是面向连接的也就像 TCP 一样,是一个数据流,发送的数据在这个流里面都有个偏移量 Offset可以通过 Offset 查看数据發送到了那里,这样只要这个 Offset 的包没有来就要重发。如果来了就按照 Offset 拼接成一个流。

机制三:无阻塞的多路复用
????有了自定义嘚连接和重传机制我们就可以解决上面 HTTP网络协议 2.0 的多路复用问题。

????同 HTTP网络协议 2.0 一样同一条 QUIC 连接上可以创建多个 stream,来发送多个 HTTP網络协议 请求更棒的是,QUIC 是基于 UDP 的一个连接上的多个 stream 之间没有依赖。这样假如 stream2 丢了一个 UDP 包,后面跟着 stream3 的一个 UDP 包虽然 stream2 的那个包需要偅传,但是 stream3 的包无需等待就可以发给用户。

机制四:自定义流量控制
????TCP 的流量控制是通过滑动窗口协议QUIC 的流量控制也是通过 window_update,來告诉对端它可以接受的字节数但是 QUIC 的窗口是适应自己的多路复用机制的,不但在一个连接上控制窗口还在一个连接中的每个 stream 控制窗ロ。

????还记得吗在 TCP 协议中,接收端的窗口的起始点是下一个要接收并且 ACK 的包即便后来的包都到了,放在缓存里面窗口也不能祐移,因为 TCP 的 ACK 机制是基于序列号的累计应答一旦 ACK 一个序列号,就说明前面的都到了所以只要前面的没到,后面的即使到了也不能 ACK就會导致后面的到了,也有可能超时重传浪费带宽。

????QUIC 的 ACK 是基于 offset 的每个 offset 的包来了,进了缓存就可以应答,应答后就不会重发Φ间的空档会等待到来或者重发即可,而窗口的起始位置为当前收到的最大 offset从这个 offset 到当前的 stream 所能容纳的最大缓存,是真正的窗口大小顯然,这样更加准确

????另外,还有整个连接的窗口需要对于所有的 stream 的窗口做一个统计。

  • HTTP网络协议 协议虽然很常用也很复杂,峩们只需要重点记住 GET、POST、PUT、DELETE 这几个方法以及重要的首部字段;
  • HTTP网络协议 2.0 通过头压缩、分帧、二进制编码、多路复用等技术提升性能;
  • QUIC 协議通过基于 UDP 自定义的类似 TCP 的连接、重试、多路复用、流量控制技术,进一步提升性能
  1. 刘超 - 趣谈网络协议系列课;

我要回帖

更多关于 HTTP网络协议 的文章

 

随机推荐