计算机网络学习笔记 ---- HTTP常见面试题

1 HTTP常见面试题

1.1 HTTP 基本概念

HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。

HTTP常见状态码

在这里插入图片描述

1xx 类状态码属于提示信息,是协议处理中的一种中间状态
2xx 类状态码表示服务器成功处理了客户端的请求

·「200 OK」是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。

·「204 No Content」也是常见的成功状态码,但响应头没有 body 数据。

·「206 Partial Content」是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分。

3xx 类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源(重定向)。

·「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。

·「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。

301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。

·「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,即告诉客户端可以继续使用缓存资源,用于缓存控制。

4xx 类状态码表示客户端发送的报文有误,服务器无法处理,即客户端的错误码

·「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。

·「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。

·「404 Not Found」表示请求的资源在服务器上不存在或未找到。

5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码

·「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。

·「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。

·「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。

·「503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”的意思

HTTP 常见字段有哪些?

Host 字段:客户端发送请求时,用来指定服务器的域名。

Content-Length 字段:表明本次回应的数据长度。

HTTP 协议通过设置回车符、换行符作为 HTTP header 的边界,通过 Content-Length 字段作为 HTTP body 的边界,这两个方式都是为了解决“粘包”的问题。

Connection 字段:最常用于客户端要求服务器使用「HTTP 长连接」机制,以便其他请求复用。

长连接特点:只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
HTTP/1.1 版本的默认连接都是长连接,但为了兼容老版本的 HTTP,需要指定 Connection 首部字段的值为 Keep-Alive。

Content-Type 字段:用于服务器回应时,告诉客户端数据格式。

客户端请求的时候,可以使用 Accept 字段声明自己可以接受哪些数据格式。

Content-Encoding 字段:说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式

客户端在请求时,用 Accept-Encoding 字段说明自己可以接受哪些压缩方法。

1.2 Get 与 Post

GET 和 POST 有什么区别?

GET 的语义是从服务器获取指定的资源

GET 请求的参数位置一般是写在 URL 中,URL 规定只能支持 ASCII,所以 GET 请求的参数只允许 ASCII 字符 ,而且浏览器会对 URL 的长度有限制(HTTP协议本身对 URL长度并没有做任何规定)。

POST 的语义是根据请求负荷(报文body)对指定的资源做出处理

POST 请求携带数据的位置一般是写在报文 body 中,body 中的数据可以是任意格式的数据,只要客户端与服务端协商好即可,而且浏览器不会对 body 大小做限制。

GET 和 POST 方法都是安全和幂等的吗?

「安全」:请求方法不会「破坏」服务器上的资源。
「幂等」:多次执行相同的操作,结果都是「相同」的。

GET 的语义是请求获取指定的资源。GET 方法是安全、幂等、可被缓存的。

POST 的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST 不安全,不幂等,(大部分实现)不可缓存。

1.3 HTTP 缓存技术

1.3.1 强制缓存

强缓存指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边。

利用下面这两个 HTTP 响应头部(Response Header)字段实现的,它们都用来表示资源在客户端缓存的有效期:

· Cache-Control, 是一个相对时间;
· Expires,是一个绝对时间;

当HTTP头部同时存在两者时,Cache-Control 的优先级高于 Expires 

使用 Cache-Control 来实现强缓存。具体的实现流程如下:

· 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上 Cache-Control,Cache-Control 中设置了过期时间大小;

· 浏览器再次请求访问服务器中的该资源时,会先通过请求资源的时间与 Cache-Control 中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器;

· 服务器再次收到请求后,会再次更新 Response 头部的 Cache-Control。

1.3.2 协商缓存

协商缓存是指通过服务端告知客户端是否可以使用缓存的方式,即与服务端协商之后,通过协商结果来判断是否使用本地缓存。

协商缓存可以基于两种头部来实现。

第一种(基于时间实现的):请求头部中的 If-Modified-Since 字段与响应头部中的 Last-Modified 字段实现,这两个字段的意思是:

响应头部中的 Last-Modified:标示这个响应资源的最后修改时间;
请求头部中的 If-Modified-Since:
	当资源过期了,发现响应头中具有 Last-Modified 声明,则再次发起请求的时候带上 Last-Modified 的时间,
	服务器收到请求后发现有 If-Modified-Since 则与被请求资源的最后修改时间进行对比(Last-Modified),
	如果最后修改时间较新(大),说明资源又被改过,则返回最新资源,HTTP 200 OK;如果最后修改时间较旧(小),说明资源无新修改,响应 HTTP 304 走缓存。

第二种(基于唯一标识实现的):请求头部中的 If-None-Match 字段与响应头部中的 ETag 字段,这两个字段的意思是:

响应头部中 Etag:唯一标识响应资源;
请求头部中的 If-None-Match:
	当资源过期时,浏览器发现响应头里有 Etag,则再次向服务器发起请求时,会将请求头 If-None-Match 值设置为 Etag 的值。
	服务器收到请求后进行比对,如果资源没有变化返回 304,如果资源变化了返回 200。

相对来说第二种可以更加准确地判断文件内容是否被修改,避免由于时间篡改导致的不可靠问题。 Etag 的优先级更高

为什么 ETag 的优先级更高?

ETag 主要能解决 Last-Modified 几个比较难以解决的问题:

1、在没有修改文件内容情况下文件的最后修改时间可能也会改变,这会导致客户端认为这文件被改动了,从而重新请求;

2、可能有些文件是在秒级以内修改的,If-Modified-Since 能检查到的粒度是秒级的,使用 Etag就能够保证这种需求下客户端在 1 秒内能	刷新多次;

3、有些服务器不能精确获取文件的最后修改时间。

=================================================
注意:协商缓存这两个字段都需要配合强制缓存中 Cache-Control 字段来使用,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求。

强制缓存与协商缓存工作流程图:

在这里插入图片描述
当使用 ETag 字段实现的协商缓存的过程:

· 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上 ETag 唯一标识,这个唯一标识的值是根据当前请求的资源生成的;

· 当浏览器再次请求访问服务器中的该资源时,首先会先检查强制缓存是否过期:
	如果没有过期,则直接使用本地缓存;
	如果缓存过期了,会在 Request 头部加上 If-None-Match 字段,该字段的值就是 ETag 唯一标识;
· 服务器再次收到请求后,会根据请求中的 If-None-Match 值与当前请求的资源生成的唯一标识进行比较:
	如果值相等,则返回 304 Not Modified,不会返回资源;
	如果不相等,则返回 200 状态码和返回资源,并在 Response 头部加上新的 ETag 唯一标识;
· 如果浏览器收到 304 的请求响应状态码,则会从本地缓存中加载资源,否则更新资源。

1.4 HTTP 特性

HTTP /1.1 优点:「简单、灵活和易于扩展、应用广泛和跨平台」。

HTTP 基本的报文格式就是 header + body,头部信息也是 key-value 简单文本的形式

HTTPS 就是在 HTTP 与 TCP 层之间增加了 SSL/TLS 安全传输层;

HTTP/1.1 和 HTTP/2.0 传输协议使用的是 TCP 协议,而到了 HTTP/3.0 传输协议改用了 UDP 协议。

HTTP /1.1 缺点:「无状态、明文传输、不安全」。

无状态的好处,因为服务器不会去记忆 HTTP 的状态,所以不需要额外的资源来记录状态信息,这能减轻服务器的负担,能够把更多的 CPU 和内存用来对外提供服务。

无状态的坏处,既然服务器没有记忆能力,它在完成有关联性的操作时会非常麻烦。

对于无状态的问题,解法方案有很多种,其中比较简单的方式用 Cookie 技术。

Cookie 通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。

在客户端第一次请求后,服务器会下发一个装有客户信息的「小贴纸」,后续客户端请求服务器的时候,带上「小贴纸」,服务器就能认得了了。

明文意味着在传输过程中的信息,是可方便阅读的,比如 Wireshark 抓包都可以直接肉眼查看

HTTP 比较严重的缺点就是不安全:

通信使用明文(不加密),内容可能会被窃听。比如,账号信息容易泄漏,那你号没了。

不验证通信方的身份,因此有可能遭遇伪装。比如,访问假的淘宝、拼多多,那你钱没了。

无法证明报文的完整性,所以有可能已遭篡改。比如,网页上植入垃圾广告,视觉污染,眼没了。

HTTP 的安全问题,可以用 HTTPS 的方式解决,也就是通过引入 SSL/TLS 层,使得在安全上达到了极致。

HTTP /1.1 性能

HTTP 协议是基于 TCP/IP,并且使用了「请求 - 应答」的通信模式。

1、长连接

在这里插入图片描述

2、管道网络传输

即可在同一个 TCP 连接里面,客户端可以发起多个请求,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。

服务器必须按照接收请求的顺序发送对这些管道化请求的响应。HTTP/1.1 管道解决了请求的队头阻塞,但是没有解决响应的队头阻塞。

==============================================
注意:实际上 HTTP/1.1 管道化技术不是默认开启,而且浏览器基本都没有支持

3、队头阻塞

在这里插入图片描述

1.5 HTTPS 与 HTTP

HTTP 与 HTTPS 的区别

· HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。

· HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。

· 两者的默认端口不一样,HTTP 默认端口号是 80,HTTPS 默认端口号是 443。

· HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。

1.5.1 HTTPS解决了HTTP哪些问题?

HTTP 由于是明文传输,所以安全上存在以下三个风险:

· 窃听风险,比如通信链路上可以获取通信内容,用户号容易没。
· 篡改风险,比如强制植入垃圾广告,视觉污染,用户眼容易瞎。
· 冒充风险,比如冒充淘宝网站,用户钱容易没。

在这里插入图片描述
HTTPS通过加入SSL/TLS协议,可解决上述问题:

· 信息加密:交互信息无法被窃取,但你的号会因为「自身忘记」账号而没。
· 校验机制:无法篡改通信内容,篡改了就不能正常显示,但百度「竞价排名」依然可以搜索垃圾广告。
· 身份证书:证明淘宝是真的淘宝网,但你的钱还是会因为「剁手」而没。

HTTPS 是如何解决上面的三个风险的?

· 混合加密的方式实现信息的机密性,解决了窃听的风险。

· 摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性,解决了篡改的风险。

· 将服务器公钥放入到数字证书中,解决了冒充的风险。

1、混合加密

HTTPS 采用的是对称加密非对称加密结合的「混合加密」方式:

· 在通信建立前采用非对称加密的方式交换「会话秘钥」,后续就不再使用非对称加密。

· 在通信过程中全部使用对称加密的「会话秘钥」的方式加密明文数据。

采用「混合加密」的方式的原因:

· 对称加密只使用一个密钥,运算速度快,密钥必须保密,无法做到安全的密钥交换。

· 非对称加密使用两个密钥:公钥和私钥,公钥可以任意分发而私钥保密,解决了密钥交换问题但速度慢。

2、摘要算法 + 数字签名

为了保证传输的内容不被篡改,我们需要对内容计算出一个「指纹」,然后同内容一起传输给对方。对方收到后,先是对内容也计算出一个「指纹」,然后跟发送方发送的「指纹」做一个比较,如果「指纹」相同,说明内容没有被篡改,否则就可以判断出内容被篡改了。

在计算机里会用摘要算法(哈希函数)来计算出内容的哈希值,也就是内容的「指纹」,这个哈希值是唯一的,且无法通过哈希值推导出内容。
在这里插入图片描述

通过哈希算法可以确保内容不会被篡改,但是并不能保证「内容 + 哈希值」不会被中间人替换,因为这里缺少对客户端收到的消息是否来源于服务端的证明。

为了避免该情况,计算机里会用非对称加密算法来解决,共有两个密钥:

· 一个是公钥,这个是可以公开给所有人的;
· 一个是私钥,这个必须由本人管理,不可泄露。

该密钥可加解密,流程不同,意味着目的不同:

· 公钥加密,私钥解密。这个目的是为了保证内容传输的安全,因为被公钥加密的内容,其他人是无法解密的,只有持有私钥的人,才能解密出实际的内容;

· 私钥加密,公钥解密。这个目的是为了保证消息不会被冒充,因为私钥是不可泄露的,如果公钥能正常解密出私钥加密的内容,就能证明这个消息是来源于持有私钥身份的人发送的。

常说的数字签名算法,就是通过「私钥加密,公钥解密」的方式,来确认消息的身份(私钥加密内容不是内容本身,而是对内容的哈希值加密)

在这里插入图片描述

3、数字证书

在这里插入图片描述

1.5.2 HTTPS如何建立连接?

SSL/TLS 协议基本流程:

· 客户端向服务器索要并验证服务器的公钥。
· 双方协商生产「会话秘钥」。
· 双方采用「会话秘钥」进行加密通信。

前两步也就是 SSL/TLS 的建立过程,也就是 TLS 握手阶段。

TLS 的「握手阶段」涉及四次通信,使用不同的密钥交换算法,TLS 握手流程也会不一样的,现在常用的密钥交换算法有两种:RSA 算法ECDHE 算法

TLS 协议建立的详细流程:

  1. ClientHello

首先,由客户端向服务器发起加密通信请求,也就是 ClientHello 请求。客户端主要向服务器发送以下信息:

(1)客户端支持的 TLS 协议版本,如 TLS 1.2 版本。

(2)客户端生产的随机数(Client Random),后面用于生成「会话秘钥」条件之一。

(3)客户端支持的密码套件列表,如 RSA 加密算法。
  1. SeverHello

服务器收到客户端请求后,向客户端发出响应,也就是 SeverHello。服务器回应的内容有如下内容:

(1)确认 TLS 协议版本,如果浏览器不支持,则关闭加密通信。

(2)服务器生产的随机数(Server Random),也是后面用于生产「会话秘钥」条件之一。

(3)确认的密码套件列表,如 RSA 加密算法。

(4)服务器的数字证书。

3.客户端回应

客户端收到服务器的回应之后,首先通过浏览器或者操作系统中的 CA 公钥,确认服务器的数字证书的真实性。如果证书没有问题,客户端会从数字证书中取出服务器的公钥,然后使用它加密报文,向服务器发送如下信息:

(1)一个随机数(pre-master key)。该随机数会被服务器公钥加密。

(2)加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。

(3)客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用来供服务端校验。

pre-master key是整个握手阶段的第三个随机数,会发给服务端,所以这个随机数客户端和服务端都是一样的。

  1. 服务器的最后回应

服务器收到客户端的第三个随机数(pre-master key)之后,通过协商的加密算法,计算出本次通信的「会话秘钥」。然后,向客户端发送最后的信息:

(1)加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。

(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用来供客户端校验。

至此,整个 TLS 的握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的 HTTP 协议,只不过用「会话秘钥」加密内容。

客户端校验数字证书的流程是怎样的?

在这里插入图片描述
简单点说,客户端会通过与服务器端同样的Hash值算法获取数字证书的Hash值H1,与使用CA公钥解密得到的由CA私钥加密的数字证书的Hash值H2,两者相同则认为证书可信赖。

证书信任链的问题

一般向CA申请的证书不是根证书签发,而是由中间证书签发。

整个证书信任链验证流程如下图所示:

在这里插入图片描述

为了确保根证书的绝对安全性,将根证书隔离地越严格越好,不然根证书如果失守了,那么整个信任链都会有问题。

1.5.3 HTTPS 的应用数据是如何保证完整性的?

TLS 在实现上分为握手协议记录协议两层:

· TLS 握手协议就是我们前面说的 TLS 四次握手的过程,负责协商加密算法和生成对称密钥,后续用此密钥来保护应用程序数据(即 HTTP 数据);
· TLS 记录协议负责保护应用程序数据并验证其完整性和来源,所以对 HTTP 数据加密是使用记录协议;

TLS 记录协议主要负责消息(HTTP 数据)的压缩,加密及数据的认证,过程如下图:

在这里插入图片描述
具体过程如下:

· 首先,消息被分割成多个较短的片段,然后分别对每个片段进行压缩。

· 接下来,经过压缩的片段会被加上消息认证码(MAC 值,这个是通过哈希算法生成的),这是为了保证完整性,并进行数据的认证。通过附加消息认证码的 MAC 值,可以识别出篡改。与此同时,为了防止重放攻击,在计算消息认证码时,还加上了片段的编码。

· 再接下来,经过压缩的片段再加上消息认证码会一起通过对称密码进行加密。

· 最后,上述经过加密的数据再加上由数据类型、版本号、压缩后的长度组成的报头就是最终的报文数据。

记录协议完成后,最终的报文数据将传递到传输控制协议 (TCP) 层进行传输。

1.5.4 HTTPS一定安全可靠吗?

HTTPS 协议本身到目前为止还是没有任何漏洞的,即使你成功进行中间人攻击,本质上是利用了客户端的漏洞(用户点击继续访问或者被恶意导入伪造的根证书),并不是 HTTPS 不够安全。

为什么抓包工具能截取 HTTPS 数据?

对于 HTTPS 连接来说,中间人要满足以下两点,才能实现真正的明文代理:

· 中间人,作为客户端与真实服务端建立连接这一步不会有问题,因为服务端不会校验客户端的身份;
· 中间人,作为服务端与真实客户端建立连接,这里会有客户端信任服务端的问题,也就是服务端必须有对应域名的私钥;

中间人要拿到私钥只能通过如下方式:

去网站服务端拿到私钥;
去CA处拿域名签发私钥;
自己签发证书,切要被浏览器信任;

抓包工具只能通过第三种方式

在这里插入图片描述

如何避免被抓包?

首先要保证自己电脑的安全,不要被病毒乘虚而入,而且也不要点击任何证书非法的网站。

此外还可以通过HTTPS双向认证。
在这里插入图片描述

1.6 HTTP/1.1、HTTP/2、HTTP/3 演变

1.6.1 HTTP/1.1

HTTP/1.1 相比 HTTP/1.0 性能上的改进:

· 使用长连接
· 支持管道网络传输

但 HTTP/1.1 还是有性能瓶颈:

· 请求 / 响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩 Body 的部分;
· 发送冗长的首部。每次互相发送相同的首部造成的浪费较多;
· 服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队头阻塞;
· 没有请求优先级控制;
· 请求只能从客户端开始,服务器只能被动响应。

1.6.2 HTTP/2

HTTP/2 协议是基于 HTTPS 的。
在这里插入图片描述

那 HTTP/2 相比 HTTP/1.1 性能上的改进:

· 头部压缩
· 二进制格式
· 并发传输
· 服务器主动推送资源

1、头部压缩

HPACK 算法::在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,只发送索引号。

HTTP/2 会压缩头(Header)如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分。

2、二进制格式

全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧(Headers Frame)和数据帧(Data Frame)。

在收到报文后,无需再转换二进制,而是直接解析,这增加了数据传输的效率。

3、并发传输

引入Stream概念,多个 Stream 复用在一条 TCP 连接。

在这里插入图片描述
针对不同的 HTTP 请求用独一无二的 Stream ID 来区分,接收端可以通过 Stream ID 有序组装成 HTTP 消息,不同 Stream 的帧是可以乱序发送的,因此可以并发不同的 Stream ,也就是 HTTP/2 可以并行交错地发送请求和响应。

4、服务器推送

服务端可以主动向客户端发送消息。客户端和服务器双方都可以建立 Stream, Stream ID 也是有区别的,客户端建立的 Stream 必须是奇数号,而服务器建立的 Stream 必须是偶数号。

HTTP /2 缺陷

仍存在队头阻塞问题(不在HTTP层面,在TCP层面)

HTTP/2 是基于 TCP 协议来传输数据的,TCP 是字节流协议,TCP 层必须保证收到的字节数据是完整且连续的,这样内核才会将缓冲区里的数据返回给 HTTP 应用,那么当「前 1 个字节数据」没有到达时,后收到的字节数据只能存放在内核缓冲区里,只有等到这 1 个字节数据到达时,HTTP/2 应用层才能从内核中拿到数据,这就是 HTTP/2 队头阻塞问题。

1.6.3 HTTP/3

HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP
在这里插入图片描述
基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输。QUIC 有以下 3 个特点:

· 无队头阻塞
· 更快的连接建立
· 连接迁移

1、无队头阻塞

当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响,因此不存在队头阻塞问题。

这与 HTTP/2 不同,HTTP/2 只要某个流中的数据包丢失了,其他流也会因此受影响。

2、更快的连接建立

HTTP/1与HTTP/2,TCP与TLS是分层的,分别属于内核实现的传输层、openssl实现的表示层。

HTTP/3需要QUIC协议握手,但过程只需1RTT,目的是为确认双方的【连接ID】,连接迁移就是基于连接ID实现的。其中,QUIC内部包含TLS,它在自己的帧会携带 TLS 里的“记录”,且QUIC 使用的是 TLS/1.3。

在这里插入图片描述

3、连接迁移

基于 TCP 传输协议的 HTTP 协议,由于是通过四元组(源 IP、源端口、目的 IP、目的端口)确定一条 TCP 连接。

当移动设备的网络从 4G 切换到 WIFI 时,意味着 IP 地址变化了,那么就必须要断开连接,然后重新建立连接。从用户角度看,会感觉到网络突然卡顿一下。

而 QUIC 协议没有用四元组的方式来“绑定”连接,而是通过连接 ID 来标记通信的两个端点,客户端和服务器可以各自选择一组 ID 来标记自己,因此即使移动设备的网络变化后,导致 IP 地址变化了,只要仍保有上下文信息(比如连接 ID、TLS 密钥等),就可以“无缝”地复用原连接,消除重连的成本,没有丝毫卡顿感,达到了连接迁移的功能。

** QUIC 是一个在 UDP 之上的伪 TCP + TLS + HTTP/2 的多路复用的协议。**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Swing_zzZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值