原文:https://medium.com/platform-engineer/evolution-of-http-69cfe6531ba0
译文:
了解http是如何在真实世界工作的
Disclaimer: This article focuses on explaining some underlying implementation details of HTTP, which will be helpful for readers to better understand my blog article — “Web API Design with HTTP and Websockets”
HTTP / 0.9 – 单行协议
- HTTP的初始版本 – 一种简单的客户端服务器,请求响应和远程协议
- 请求性质:单行(方法+请求文档的路径)
- 支持的方法:
GET
仅限 - 响应类型:仅限超文本
- 连接性质:响应后立即终止
- 没有HTTP标头(不能传输其他内容类型文件),没有状态/错误代码,没有URL,没有版本
$> telnet ashenlive.com 80 (Connection 1 Establishment - TCP Three-Way Handshake) Connected to xxx.xxx.xxx.xxx (Request) GET /my-page.html (Response in hypertext) <HTML> A very simple HTML page </HTML> (Connection 1 Closed - TCP Teardown)
流行的Web服务器(Apache,Nginx)仍支持HTTP / 0/9。尝试打开Telnet会话并访问google.com
HTTP / 1.0 – 拥有扩展性
- 浏览器友好的协议
- 提供的头字段包括有关请求和响应的丰富元数据(HTTP版本号,状态代码,内容类型)
- 回应:不限于超文本(
Content-Type
头文件提供传输纯HTML文件以外的文件的能力 – 例如脚本,样式表,媒体) - 支持的方法:
GET
,HEAD
,POST
- 连接性质:响应后立即终止
(Connection 1 Establishment - TCP Three-Way Handshake) Connected to xxx.xxx.xxx.xxx (Request) GET /my-page.html HTTP/1.0 User-Agent: NCSA_Mosaic/2.0 (Windows 3.1) (Response) HTTP/1.0 200 OK Content-Type: text/html Content-Length: 137582 Expires: Thu, 01 Dec 1997 16:00:00 GMT Last-Modified: Wed, 1 May 1996 12:45:26 GMT Server: Apache 0.84 <HTML> A page with an image <IMG SRC="/myimage.gif"> </HTML> (Connection 1 Closed - TCP Teardown) ------------------------------------------ (Connection 2 Establishment - TCP Three-Way Handshake) Connected to xxx.xxx.xxx.xxx (Request) GET /myimage.gif HTTP/1.0 User-Agent: NCSA_Mosaic/2.0 (Windows 3.1) (Response) HTTP/1.0 200 OK Content-Type: text/gif Content-Length: 137582 Expires: Thu, 01 Dec 1997 16:00:00 GMT Last-Modified: Wed, 1 May 1996 12:45:26 GMT Server: Apache 0.84 [image content] (Connection 2 Closed - TCP Teardown)
HTTP / 0.9和HTTP / 1.0中的主要问题-为每个请求建立新连接
HTTP / 0.9和HTTP / 1.0都需要为每个请求打开一个新连接(并在发送响应后立即关闭它)。每次建立新的连接时,TCP三方握手也应该发生。为了获得更好的性能,减少客户端和服务器之间的这些往返行为至关重要。HTTP / 1.1通过持久连接解决了这个问题。
![](https://www.huaijiujia.com/wp-content/uploads/2018/07/1_mxYdkCxS5MPFBDaHeFS8JQ.png)
一个典型的TCP三次握手(查看TCP状态机如何改变其状态)来自 lwn.net
HTTP / 1.1 – 标准化协议
- 这是目前常用的HTTP版本。
- 引入了关键性能优化和功能增强 – 持久和流水线连接,分块传输,压缩/解压缩,内容协商,虚拟主机(具有多个域的单个IP地址的服务器),通过添加缓存支持更快的响应和更大的带宽节省。
- 支持的方法:
GET
,HEAD
,POST
,PUT
,DELETE
,TRACE
,OPTIONS
- 连接性:保持连接
(Connection 1 Establishment - TCP Three-Way Handshake) Connected to xxx.xxx.xxx.xxx (Request 1) GET /en-US/docs/Glossary/Simple_header HTTP/1.1 Host: developer.mozilla.org User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header (Response 1) HTTP/1.1 200 OK Connection: Keep-Alive Content-Encoding: gzip Content-Type: text/html; charset=utf-8 Date: Wed, 20 Jul 2016 10:55:30 GMT Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a" Keep-Alive: timeout=5, max=1000 Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT Server: Apache Transfer-Encoding: chunked Vary: Cookie, Accept-Encoding [content] (Request 2) GET /static/img/header-background.png HTTP/1.1 Host: developer.cdn.mozilla.net User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0 Accept: */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Referer: https://developer.mozilla.org/en-US/docs/Glossary/Simple_header (Response 2) HTTP/1.1 200 OK Age: 9578461 Cache-Control: public, max-age=315360000 Connection: keep-alive Content-Length: 3077 Content-Type: image/png Date: Thu, 31 Mar 2016 13:34:46 GMT Last-Modified: Wed, 21 Oct 2015 18:27:50 GMT Server: Apache [image content of 3077 bytes] (Connection 1 Closed - TCP Teardown)
Keep-Alive和Upgrade 头字段
Keep-Alive 报头
Keep-Alive
报头在HTTP/ 1.1之前就已经使用(需要显示指明),到了HTTP / 1.1时Keep-Alive成为
默认行为。Keep-Alive
头可用于定义主机之间长期通信的策略(即允许连接保持活动状态直到发生事件)。为现代Web通信协议中的持久性,可重用连接,流水线和更多增强功能奠定了基础。- 客户端,服务器或任何中介都可以为
Keep-Alive
添加额外信息。此外,主机可以添加timeout
并max
以设置一个超时或每个连接限制最大请求数参数。
HTTP/1.1 200 OK Connection: Keep-Alive Content-Encoding: gzip Content-Type: text/html; charset=utf-8 Date: Thu, 11 Aug 2016 15:23:13 GMT Keep-Alive: timeout=5, max=1000 Last-Modified: Mon, 25 Jul 2016 04:32:39 GMT Server: Apache [body]
- 凭借
Keep-Alive
行为,HTTP流水线,多连接复用以及更多的改进才能实现。
Upgrade 头字段
- 使用
Upgrade
HTTP / 1.1中引入的头文件,可以使用常用协议(如HTTP / 1.1)启动连接,然后请求连接切换到增强协议类型(如HTTP / 2.0或WebSockets)。 - 在升级的协议连接中,
max
不存在参数(最大请求计数)。升级后的协议可以为timeout
参数提供新的策略(如果没有明确定义,它使用底层协议中的默认超时值)。
第6章 HTTP头部
End-to-end
端到端头部
此类头部字段会转发给 请求/响应 的最终接收目标。
必须保存在由缓存生成的响应头部。
必须被转发。Hop-by-hop
逐跳首部
此类头部字段只对单次转发有效。会因为转发给缓存/代理服务器而失效。
HTTP 1.1 版本之后,如果要使用Hop-by-hop头部字段则需要提供Connection字段。
除了一下8个字段为逐跳字段,其余均为端到端字段。- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authenrization
- Trailer
- TE
- Tranfer-Encoding
- Upgrade
来自 https://blog.csdn.net/u010369338/article/details/69397307
HTTPS
- 超文本传输协议安全(HTTPS)是HTTP的安全版本。它使用SSL / TLS进行安全加密通信。
- SSL(安全套接字层)最初由Netscape在20世纪90年代中期开发,是对HTTP的加密协议增强,它定义了客户端和服务器应如何安全地相互通信。TLS(传输层安全)是SSL的后继者。
- 通过为客户端和服务器之间的通信提供双向加密,HTTPS连接可以保护数据传输免受中间人攻击和常见安全威胁的侵害。
来自msdn.microsoft.com上 SSL握手的图解表示 - TCP连接> SSL / TLS客户端Hello> SSL / TLS服务器Hello> SSL / TLS证书> SSL / TLS客户端密钥交换> SSL / TLS新会话票证> HTTPS加密数据交换
HTTPS中的主要问题 – SSL / TLS握手
- 虽然HTTPS的设计是安全的,但SSL / TLS握手过程在建立HTTPS连接之前会消耗大量时间。它通常需要1-2秒,并且会大大降低网站的启动性能。
HTTP / 2.0和未来
如今,主要的Web服务器和浏览器都在使用上述所有功能。但是像HTTP / 2.0,服务器端事件(SSE)和Websockets等现代增强功能改变了传统HTTP的工作方式。在我的下一篇关于使用HTTP和Websockets的Web API设计的文章中,我们将讨论如何在实际项目中选择它们。