原文见:语雀(https://www.yuque.com/deepstates/interview/bo2kpn)
● HTTP报文
● HTTP连接管理
○ HTTP的连接性能优化
■ 持久连接
● 队头阻塞
■ 管道化
● 和HTTP相关的web服务器
○ 通信数据转发程序:HTTP代理、隧道
● 版本
HTTP 的特点和缺点?
一、特点:无连接、无状态、灵活、简单快速
● 无连接(http1.0):每一次请求都要连接一次,请求结束就会断掉,不会保持连接
● 无状态:每一次请求都是独立的,请求结束不会记录连接的任何信息,减少了网络开销,这是优点也是缺点
● 灵活:通过http协议中头部的Content-Type标记,可以传输任意数据类型的数据对象(文本、图片、视频等等),非常灵活
● 简单快速:发送请求访问某个资源时,只需传送请求方法和URL就可以了,使用简单,正由于http协议简单,使得http服务器的程序规模小,因而通信速度很快
二、缺点:无状态、明文传输、不安全
● 无状态:请求不会记录任何连接信息,没有记忆,就无法区分多个请求发起者身份是不是同一个客户端的,意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大
● 明文传输:报文(header部分)使用的是明文,直接将信息暴露给了外界,WIFI陷阱就是复用明文传输的特点,诱导你连上热点,然后疯狂抓取你的流量,从而拿到你的敏感信息
● 不安全:明文传输可能被窃听不安全,缺少身份认证也可能遭遇伪装,还有缺少报文完整性验证可能遭到篡改
http的理解?(恒生)
一、定义
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
二、特点(如上文)
三、优缺点(如上文)
HTTP报文 / HTTP消息
HTTP 报文组成部分?
一、http报文:由请求报文和响应报文组成
二、请求报文:由请求行、请求头、空行、请求体四部分组成
三、响应报文:由状态行、响应头、空行、响应体四部分组成
● 请求行:包含http方法,请求地址,http协议以及版本
● 请求头/响应头:就是一些key:value来告诉服务端我要哪些内容,要注意什么类型等
● 空行:用来区分首部与实体,因为请求头都是key:value的格式,当解析遇到空行时,服务端就知道下一个不再是请求头部分,就该当作请求体来解析了
● 主体
○ 请求体:请求的参数
○ 响应体:服务端返回的数据
● 状态行:包含http协议及版本、数字状态码、状态码英文名称
http请求方式
http方法?
HTTP1.0: GET、POST、HEAD
HTTP1.1: PUT、PATCH、DELETE、OPTIONS、TRACE、CONNECT
● get:获取资源
● post:传输资源
● put:更新资源
● delete:删除资源
● head:获得报文首部
● patch:对PUT的补充,对已知资源部分更新
● options:列出请求资源支持的请求方法,用来跨域请求
● trace:追踪请求/响应路径,用于测试或诊断
● connect:将连接改为管道方式用于代理服务器
post和get的区别?
1、get在浏览器回退时是无害的,而post会再次提交请求。(记住)
2、get请求会被浏览器主动缓存,而post不会,除非手动设置。(记住)
3、get产生的url地址可以被收藏,而post不可以。
4、get请求只能进行url编码,而post支持多种编码方式。
5、get请求参数会被完整保留在浏览器历史记录里,而post中的参数不会被保留。(记住)
6、get参数通过url传递,post放在request body 中。(记住)
7、get请求在url中传送的参数是有长度限制的,而post没有限制。
8、对参数的数据类型,get只接受ASCII字符,而post没有限制。
9、get比post更不安全,因为参数直接暴露在url上,所以不能用来传递敏感信息。
get请求传参长度的误区、get和post请求在缓存方面的区别?
一、误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。
二、实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是来源与浏览器或web服务器,浏览器或web服务器限制了url的长度。
三、为了明确这个概念,我们必须再次强调下面几点:
● HTTP 协议 未规定 GET 和POST的长度限制
● GET的最大长度显示是因为 浏览器和 web服务器限制了 URI的长度
● 不同的浏览器和WEB服务器,限制的最大长度不一样
○ 要支持IE,则最大长度为2083byte,若只支持Chrome,则最大长度 8182byte
● 补充补充一个get和post在缓存方面的区别:
○ get请求类似于查找的过程,用户获取数据,可以不用每次都与数据库连接,所以可以使用缓存。
○ post不同,post做的一般是修改和删除的工作,所以必须与数据库交互,所以不能使用缓存。
○ 因此get请求适合于请求缓存。
HTTP头
304原理,相关的header?
一、header
1、Last-Modified:响应头,表示当前资源的最后修改时间。
● If-Modified-Since:请求头,表示缓存的资源最后修改时间。
2、Etag
● If-none-Match
二、原理:
1、客户端首次访问服务器的静态资源index.html,服务器会把index.html响应给客户端,而且还会添加一个名
● Last-Modified的响应头,它说明了当前index.html的最后修改时间
● Etag:它说明了当前index.html的最新资源标识
2、客户端收到响应后,会把index.html缓存在客户端上,而且还会把Last-Modified/Etag缓存起来。
3、客户端第二次请求index.html时,会添加名为If-Modified-Since/If-none-Match的请求头,它的值是上次服务器响应头Last-Modified/Etag
● Last-Modified:服务器获取到客户端保存的最后修改时间,以及当前资源的最后修改时间进行比较
● Etag:资源修改标识
如果相同,说明index.html没有改动过,那么服务器不会发送index.html,而是响应状态码304,即通知客户端资源没有改变,你可以使用自己的缓存。
HTTP缓存
HTTP缓存? / 浏览器他怎么判断一个静态文件,它是走浏览器的缓存还是从服务端去重新请求,就是说你可以简单说一下浏览器的这个缓存机制大概是怎么样的一个流程?(网易、大华)
参考
说一下缓存代理
一、缓存代理就是让代理服务器接管一部分的服务端的http缓存,客户端缓存过期之后就近到代理服务器的缓存中获取,代理缓存过期了才请求源服务器,这样流量大的时候能明显降低源服务器的压力
二、注意响应头字段
● Cache-Control:
○ 值有public时,表示可以被所有终端缓存,包括代理服务器、CDN。
○ 值有private时,只能被终端浏览器缓存,CDN、代理等中继服务器都不可以缓存。
Expires
Expires存在的问题
● 服务端和浏览器的时间可能不同,导致缓存过期时间出现偏差
● 客户端可以通过修改系统时间来继续使用缓存或提前使缓存失效
Last-Modified
last-modified的不足之处
一、last-modified存在的缺陷:
- 精度问题:Last-Modified 的时间精度为秒,如果在 1 秒内发生修改,那么缓存判断会失效
- 准度问题:如果一个文件被修改后又被还原,内容没有发生变化,却仍然需要重新请求
- 服务器问题:某些服务器不能精确的得到文件的最后修改时间
Etag
Etag的不足之处
一、ETag的出现并不是last-modified的代替品,而是一种补充方案,它还是存在弊端的。
- 计算成本。对于大文件而言,读取完整的文件内容生成哈希值开销较大;只读取文件部分内容,又容易判断出错。
- 计算误差。不同服务端可能会采用不同的哈希值计算方式。所以同一个资源在两台服务端产生的 Etag 可能是不相同的。对于使用服务器集群来处理请求的网站来说,使用 Etag 的缓存命中率会有所降低。
HTTP状态码
一、状态码
1xx:指示信息-表示请求已接收,继续处理。
2xx:成功-表示请求已被成功接收。
3xx:重定向-要完成请求必须进行更进一步的操作。
4xx:客户端错误-请求有语法错误或请求无法实现。
5xx:服务器错误-服务器未能实现合法的请求。
有哪些常见状态码?
200 OK:客户端请求成功
206 Partial Content:客户发送了一个带有Range头的GET请求,服务器完成了它。 // video, audio
301 Moved Permanently:所请求的页面都已经转移至新的url
302 Found:所请求的页面已经临时转移至新的url
304 Not Modified:客户端有缓冲的文档并发出了一个条件性的请求,服务器告诉客户,原来缓冲的文档还可以继续使用。
400 Bad Request:客户端请求有语法错误,不能被服务器所理解
401 Unauthorized: 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden:对被请求页面的访问被禁止
404 Not Found:请求资源不存在
500 Internal Server Error:服务器发生不可预期的错误
502:网关错误
503 Server Unavailable:请求未完成,服务器临时过载或宕机,一段时间后可能恢复正常。
简单版
[
100 Continue 继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息
200 OK 正常返回信息
201 Created 请求成功并且服务器创建了新的资源
202 Accepted 服务器已接受请求,但尚未处理
301 Moved Permanently 请求的网页已永久移动到新位置。
302 Found 临时性重定向。
303 See Other 临时性重定向,且总是使用 GET 请求新的 URI。
304 Not Modified 自从上次请求后,请求的网页未修改过。
400 Bad Request 服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。
401 Unauthorized 请求未授权。
403 Forbidden 禁止访问。
404 Not Found 找不到如何与 URI 相匹配的资源。
500 Internal Server Error 最常见的服务器端错误。
503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)。
]
完整版
1**(信息类):表示接收到请求并且继续处理
100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTTP协议版本
2**(响应成功):表示动作被成功接收、理解和接受
200——表明该请求被成功地完成,所请求的资源发送回客户端
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的GET请求
3**(重定向类):为了完成指定的动作,必须接受进一步处理
300——请求的资源可在多处得到
301——本网页被永久性转移到另一个URL
302——请求的网页被转移到一个新的地址,但客户访问仍继续通过原始URL地址,重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。
303——建议客户访问其他URL或访问方式
304——自从上次请求后,请求的网页未修改过,服务器返回此响应时,不会返回网页内容,代表上次的文档已经被缓存了,还可以继续使用
305——请求的资源必须从服务器指定的地址得到
306——前一版本HTTP中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除
4**(客户端错误类):请求包含错误语法或不能正确执行
400——客户端请求有语法错误,不能被服务器所理解
401——请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
HTTP 401.1 - 未授权:登录失败
HTTP 401.2 - 未授权:服务器配置问题导致登录失败
HTTP 401.3 - ACL 禁止访问资源
HTTP 401.4 - 未授权:授权被筛选器拒绝
HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败
402——保留有效ChargeTo头响应
403——禁止访问,服务器收到请求,但是拒绝提供服务
HTTP 403.1 禁止访问:禁止可执行访问
HTTP 403.2 - 禁止访问:禁止读访问
HTTP 403.3 - 禁止访问:禁止写访问
HTTP 403.4 - 禁止访问:要求 SSL
HTTP 403.5 - 禁止访问:要求 SSL 128
HTTP 403.6 - 禁止访问:IP 地址被拒绝
HTTP 403.7 - 禁止访问:要求客户证书
HTTP 403.8 - 禁止访问:禁止站点访问
HTTP 403.9 - 禁止访问:连接的用户过多
HTTP 403.10 - 禁止访问:配置无效
HTTP 403.11 - 禁止访问:密码更改
HTTP 403.12 - 禁止访问:映射器拒绝访问
HTTP 403.13 - 禁止访问:客户证书已被吊销
HTTP 403.15 - 禁止访问:客户访问许可过多
HTTP 403.16 - 禁止访问:客户证书不可信或者无效
HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效
404——一个404错误表明可连接服务器,但服务器无法取得所请求的网页,请求资源不存在。eg:输入了错误的URL
405——用户在Request-Line字段定义的方法不允许
406——根据用户发送的Accept拖,请求资源不可访问
407——类似401,用户必须首先在代理服务器上得到授权
408——客户端没有在用户指定的时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源且无进一步的参考地址
411——服务器拒绝用户定义的Content-Length属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器允许的大小
414——请求的资源URL长于服务器允许的长度
415——请求资源不支持请求项目格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长。
5**(服务端错误类):服务器不能正确执行一个正确的请求
HTTP 500 - 服务器遇到错误,无法完成请求
HTTP 500.100 - 内部服务器错误 - ASP 错误
HTTP 500-11 服务器关闭
HTTP 500-12 应用程序重新启动
HTTP 500-13 - 服务器太忙
HTTP 500-14 - 应用程序无效
HTTP 500-15 - 不允许请求 global.asa
Error 501 - 未实现
HTTP 502 - 网关错误
HTTP 503:由于超载或停机维护,服务器目前无法使用,一段时间后可能恢复正常
HTTP连接管理
HTTP的连接性能优化
持久连接
什么是持久连接?
● http1.0 协议采用“请求-应答”模式,当使用普通模式,即非keep-alive模式时,每个请求/应答,客户端和服务器都要新建一个连接,完成之后立即断开连接(http协议为无连接的协议)
● http1.1版本支持长连接,即请求头添加Connection: Keep-Alive当使用keep-alive模式(又称持久连接、连接重用)时,keep-alive功能使客户端到服务器端的连接持久有效,当出现对服务器的后继请求时,keep-alive功能避免了建立后者重新建立连接。
持久连接优缺点?
一、优点
● 减少CPU及内存的使用,因为不需要经常建立和关闭连接
● 支持管道化的请求及响应模式
● 减少网络堵塞,因为减少了TCP请求
● 减少了后续请求的响应时间,因为不需要等待建立TCP、握手、挥手、关闭TCP的过程
● 发生错误时,也可在不关闭连接的情况下进行错误提示
二、缺点
● 一个长连接建立后,如果一直保持连接,会浪费服务器资源,而且长连接时间的长短,直接影响到服务器的并发数
● 还有就是可能造成队头堵塞,造成信息延迟
如何避免长连接资源浪费?
● 客户端请求头声明:Connection: close,本次通信后就关闭连接
● 服务端配置:如Nginx,设置keepalive_timeout设置长连接超时时间,keepalive_requests设置长连接请求次数上限
● 系统内核参数设置:
○ net.ipv4.tcp_keepalive_time = 60,连接闲置60秒后,服务端尝试向客户端发送侦测包,判断TCP连接状态,
○ net.ipv4.tcp_keepalive_intvl = 10,如果没有收到ack反馈就在10秒后再次尝试发送侦测包,直到收到ack反馈,
○ net.ipv4.tcp_keepalive_probes = 5,一共会尝试5次,要是都没有收到就关闭这个TCP连接了
队头阻塞
如何解决 HTTP 的队头阻塞问题
一、http1.0协议采用的是请求-应答模式,报文必须是一发一收,就形成了一个先进先出的串行队列,没有轻重缓急的优先级,只有入队的先后顺序,排在最前面的请求最先处理,就导致如果队首的请求耗时过长,后面的请求就只能处于阻塞状态,这就是著名的队头阻塞问题。解决如下:
1、并发连接
因为一个域名允许分配多个长连接,就相当于增加了任务队列,不至于一个队列里的任务阻塞了其他全部任务。以前在RFC2616中规定过客户端最多只能并发2个连接,但是现实是很多浏览器不按套路出牌,就是遵守这个标准,所以在RFC7230把这个规定取消掉了,现在的浏览器标准中一个域名并发连接可以有68个,记住是68个,不是6个(Chrome6个/Firefox8个)
2、域名分片
一个域名最多可以并发6~8个,那咱就多来几个域名
比如a.baidu.com,b.baidu.com,c.baidu.com,多准备几个二级域名,当我们访问baidu.com时,可以让不同的资源从不同的二域名中获取,而它们都指向同一台服务器,这样能够并发更多的长连接了
二、而在HTTP2.0下,可以一瞬间加载出来很多资源,因为支持多路复用,可以在一个TCP连接中发送多个请求
管线化/ 管道化
什么是管线化?
一、http1.1 在使用持久连接的情况下,某个连接上消息的传递类似于
请求1-> 响应1 -> 请求2 -> 响应2 -> 请求3 -> 响应3
管理化连接的消息变成了类似这样
请求1 -> 请求2 -> 请求3 -> 响应1 -> 响应2 -> 响应3
二、管线化是在同一个TCP连接里发一个请求后不必等其回来就可以继续发请求出去,这可以减少整体的响应时间,但是服务器还是会按照请求的顺序响应请求,所以如果有许多请求,而前面的请求响应很慢,就产生一个著名的问题队头堵塞
管线化的特点? / 管线化注意点?
● 管线化机制通过持久连接完成,在http1.1版本才支持
● 管线化不会影响响应到来的顺序,响应返回的顺序就是请求的顺序
● 只有GET请求和HEAD请求才可以进行管线化,而POST有所限制
● 客户端、服务端
○ 要求客户端和服务端都支持管线化,但并不要求服务端也对响应进行管线化处理,只是要求对于管线化的请求不失败即可
○ 初次创建连接时不应启动管线化机制,因为服务器不一定支持http1.1版本的协议
● 由于上面提到的服务端问题,开户管线化很可能并不会带来大幅度的性能提升,而且很多服务端和代理程序对管线化的支持并不好,因为浏览器(Chrome/Firefox)默认并未开启管线化支持
和HTTP相关的Web服务器
通信数据转发程序
HTTP代理
说一下 HTTP 代理
代理是一种具有转发功能的应用程序,它存在于客户端和服务器端之间,相当于一个“中间人”。它将客户端发送过来的请求并转发给服务器端,同时也会将服务器端返回的响应转发给客户端。
代理服务器,到底有什么好处呢?
● 突破访问限制:如访问一些单位或集团内部资源,或用国外代理服务器(翻墙),就可以上国外网站看片等
● 充当防火墙:上网者可以通过这种方式隐藏自己的IP,免受攻击。还可以对数据过滤,对非法IP限流等
● 负载均衡:客户端请求先到代理服务器,而代理服务器后面有多少源服务器,IP是多少,客户端是不知道的。因此,代理服务器收到请求后,通过特定的算法(随机算法、轮询、一致性hash、LUR(最近最少使用) 算法)把请求分发给不同的源服务器,让各个源服务器负载尽量均衡
● 缓存代理:将内容缓存到代理服务器
代理最常见的请求头
● Via
是一个能用首部,由代理服务器添加,适用于正向和反向代理,在请求和响应首部均可出现,这个消息首部可以用来追踪消息转发情况,防止循环请求,还可以识别在请求或响应传递链中消息发送者对于协议的支持能力,详情请看MDN
Via: 1.1 vegur
Via: HTTP/1.1 GWA
Via: 1.0 fred, 1.1 p.example.net
● X-Forwarded-For
记录客户端请求的来源IP,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加进去
X-Forwarded-For: client,proxy1,proxy2
注意:与服务器直连的代理服务器的IP不会被追加进去,该代理可能过TCP连接的Remote Address字段获取到与服务器直连的代理服务器IP
● X-Real-IP
一般记录真实发出请求的客户端的IP,还有X-Forwarded-Host和X-Forwarded-Protol分别记录真实发出请求的客户端的域名和协议名
代理中客户端IP伪造问题以及如何预防?
一、X-Forwarded-For是可以伪造的,比如一些通过X-Forwarded-For获取到客户端IP来限制刷票的系统就可以通过伪造该请求头达到刷票的目的,如果客户端请求显示指定了
X-Forwarded-For:192.168.1.108
那么服务端收到的这个请求头,第一个IP就是伪造的
二、预防
- 在对外Nginx服务器上配置
location / {
proxy_set_header X-Forwarded-For $remote_addr
}
这样第一个IP就是从TCP连接客户端的IP,不会读取伪造的 - 从右到左遍历X-Forwarded-For的IP,排除已知代理服务器IP和内网IP,获取到第一个符合条件的IP就可以了
正向代理和反向代理
一、正向代理
工作在客户端的代理为正向代理。使用正向代理的时候,需要在客户端配置需要使用的代理服务器,正向代理对服务端透明。比如抓包工具Fiddler、Charles以及访问一些外网网站的代理工具都是正向代理
正向代理通常用于
● 缓存
● 屏蔽某些不健康的网站
● 通过代理访问原本无法访问的网站
● 上网认证,对用户访问进行授权
二、反向代理
工作在服务端的代理称为反向代理。使用反向代理的时候,不需要在客户端进行设置,反向代理对客户端透明。如Nginx就是反向代理
反向代理通常用于:负载均衡、服务端缓存、流量隔离、日志、金丝雀发布
代理中的长连接
逐段传输头
一、在各个代理和服务器、客户端节点之间是一段一段的TCP连接,客户端通过代理访问目标服务器也叫逐段传输,用于逐段传输的请求头叫逐段传输头。
二、逐段传输头会在每一段传输的中间代理中处理掉,不会传给下一个代理
三、标准的逐段传输头有:Keep-Alive、Transfer-Encoding、TE、Connection、Trailer、Upgrade、Proxy-Authorization、Proxy-Authenticate。
● Connection头决定当前事务完成后是否关闭连接,如果该值为keep-alive,则连接是持久连接不会关闭,使得对同一服务器的请求可以继续在该连接上完成
隧道
什么是隧道?
隧道是在相隔甚远的客户端和服务端两者之间进行中转,并保持双方通信连接的应用程序。
客户端通过CONNECT方法请求隧道创建一个可以到任意目标服务器和端口号的TCP连接,创建成功之后隧道只做请求和响应数据的转发,中间它不会做任何处理
为什么需要隧道呢?
我们都知道https服务是需要网站有证书的,而代理服务器显然没有,所以浏览器和代理之间无法创建TLS,所以就有了隧道代理,它把浏览器的数据原样透传,这样就实现了通过中间代理和服务端进行TLS握手,然后进行加密传输
版本
参考:
http你知道多少个版本,他们有什么区别?
一、HTTP1.0
- 只有三种请求头GET、HEAD、POST
- 每个域名同时最多建立4个连接,如果连接数>=4,其他请求,只能等待
- 每个连接,完成一个HTTP请求、响应后,就会被服务器断开
- 不支持断点续传
- 缓存策略单一,只有本地缓存
二、http1.1 - 新增Put,Delete等方法
2.在HTTP1.0中主要使用header里的Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Cache-Control,Last-Modified/If-Modified-Since,Eag/If-None-Match等更多可供选择的缓存头来控制缓存策略。
3.支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
4.Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
5.长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟
三、http2.0
1.二进制分帧
2.首部压缩
3.多路复用
4.请求优先级
5.服务器推送
四、http3.0
● 等待时延的减少
● 优化拥塞控制
● 优化多路复用
现在默认使用的是哪个版本?
20220909-aSuncat:http 1.1
http1.1
http1.1时如何复用tcp连接?(网易)
HTTP/1.1 中 Connection 默认是 keep-alive 的,即连接可以复用,不用每次都重新建立和断开 TCP 连接。如果想主动断开连接,只需要将 Connection 属性设置为 close 即可。
http 3.0
http 3.0 vs http 2.0
等待时延的减少
优化拥塞控制
优化多路复用