全栈工程师修炼指南
熊燚(四火)
Oracle 首席软件工程师
32206 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 46 讲
全栈回顾 (1讲)
加餐 (1讲)
全栈工程师修炼指南
15
15
1.0x
00:00/00:00
登录|注册

01 | 网络互联的昨天、今天和明天:HTTP 协议的演化

阅读关于 HTTP/2 的介绍
参考 RFC 文档
推荐阅读系统性介绍 HTTP 的教程
承载协议从 TCP 转移到基于 UDP 的 QUIC
支持多路复用和服务端的 push 机制
引入了 HTTP 头的压缩
设计了 ALPN 机制
支持 content negotiation
支持更全面的方法和返回码
引入了长连接
例子:使用 netcat 发送请求
支持多字符集和多行请求
引入了返回码和头部
例子:GET /target.html
非常简单,不支持请求正文和头部
定义了协议最核心的内容
扩展阅读
使用 tcpdump 抓取 loopback 的包
利用 Python 启动一个 HTTP 服务
使用 tcpdump 进行网络抓包
分析了长连接和分块传输的重要性
强调通过动手操作来理解内容
HTTP/3
HTTP/2
HTTP/1.1
HTTP/1.0
HTTP/0.9
选修课堂:抓一段 HTTP 的包
总结思考
HTTP 协议的演化

该思维导图由 AI 生成,仅供参考

你好,我是四火。
HTTP 协议是互联网基础中的基础,和很多技术谈具体应用场景不同的是,几乎所有的互联网服务都是它的应用,没有它,互联网的“互联”将无从谈起,因此我们把它作为正式学习的开篇。
说到其原理和协议本身,我相信大多数人都能说出个大概来,比如,有哪些常见的方法,常见 HTTP 头,返回码的含义等等。但你是否想过,这个古老而富有生命力的互联网“基石”是怎样发展演化过来的呢?从它身上,我们能否管中窥豹,一叶知秋,找到互联网成长和演进的影子?
今天,我想带你从实践的角度,亲身感受下这个过程,相信除了 HTTP 本身,你还可以发现网络协议发展过程中的一些通用和具有共性的东西。

HTTP/0.9

和很多其它协议一样,1991 年,HTTP 在最开始的 0.9 版就定义了协议最核心的内容,虽说从功能上看只是具备了如今内容的一个小小的子集。比如,确定了客户端、服务端的这种基本结构,使用域名 /IP 加端口号来确定目标地址的方式,还有换行回车作为基本的分隔符。
它非常简单,不支持请求正文,不支持除了 GET 以外的其它方法,不支持头部,甚至没有版本号的显式指定,而且整个请求只有一行,因而也被称为“The One-line Protocol”。比如:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

HTTP 协议的演化历程是互联网发展的缩影,从 HTTP/0.9、HTTP/1.0 到 HTTP/1.1,每个版本都带来了重大的改进和特性。HTTP/0.9 简单且不支持请求正文、头部和版本号的显式指定;HTTP/1.0 引入了返回码、header、多字符集等特性,成为第一个具备广泛实际应用价值的协议版本;HTTP/1.1 在 1.0 版本的基础上加入了大量帮助传输效率提升的特性,如长连接、分块传输编码等。通过实践操作,读者可以亲身感受这一演化过程,了解 HTTP 协议的发展历程和特性。文章还介绍了 HTTP/2 和 HTTP/3 的重要改进,以及分块传输的工作原理和长连接的优势。通过本文的总结,读者可以快速了解 HTTP 协议的演化历程和各个版本的特性,以及如何通过实践操作来深入理解和应用这些特性,为进一步学习和应用网络协议打下基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《全栈工程师修炼指南》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(23)

  • 最新
  • 精选
  • William
    置顶
    【📒笔记-HTTP发展史】 + HTTP/0.9 确立了C/S架构,域名、IP、端口。换行回车作为基本分隔符。 + HTTP/1.0 返回码、header、多字符集、多行请求支持 + HTTP/1.1 长连接keep-alive。分块传输chunked。方法、返回码更全面,缓存控制策略,content negotiation。 + HTTP/2.0 头部压缩。多路复用(仍然存在线头阻塞)。二进制传输支持。服务端推送。ALPN。 + HTTP/3.0 0RTT建连(UDP)、多路复用(无线头阻塞)。 【思考题】 1.分块传输的应用场景:分部加载请求,缩短用户首屏等待时间,提高用户体验。是一种比ajax更好的方案,能少量的请求数。 2.语义明确无歧义。 【抓包思考题】 HTTP请求和响应报文之外,很多是TCP握手报文,用于建立和断开端到端的TCP可靠连接。TCP是HTTP和HTTPS的低层协议,保证数据可靠性、完整性、有序性等。

    作者回复: 笔记部分: 优秀,说得太棒了。做一点小小的说明:文中说的客户端和服务端的概念完全是从网络和协议的角度来进行的,和我们平时提到的选择 C/S 还是 B/S 的“应用模式”有所区别。HTTP 本身和选用 C/S(Client/Server)还是 B/S(Browser/Server)并没有必然关系。也就是说,无论你使用客户端还是浏览器,都可以使用 HTTP 方式和服务端交流。 思考题部分: 1. 分块传输和 Ajax 并没有直接联系,也就是说,分块传输可以使用、也可以不使用 Ajax 来完成。Ajax 的要点是使用异步 JavaScript 的方式来请求和处理网页上的数据。因此,这个问题,你可以再想想。:) (顺便预告一下,我们在 03 篇就会介绍其中的一个使用场景) 2. 正确。当然,还有其他的原则,比如数据传输的效率,可靠性,协议本身的向后兼容性,等等等等。 抓包的问题:正确,其它的基本都是 TCP 层的报文(当然,不只有连接建立握手的报文)。

    2019-09-11
    3
    24
  • 四喜
    因为有墙的原因,所以需要海外节点才能telnet到google的80端口。 建议使用https://labs.play-with-docker.com ,可以一份中之内拉起一个海外linux实例。

    作者回复: 嗯,了解。很好的建议。

    2019-09-14
    2
    13
  • jxs1211
    1.1长连接keep-alive和2.0的多路复用有什么区别? 通过请求自己的后端服务,抓包发现是每次交互都要使用一个tcp连接,如果要使用http1.1的长连接功能,是后端的实现吧,请问具体应该如何实现,让后端支持长连接?

    作者回复: 好问题。 这两个是不一样的,keep-alive 是不关闭 TCP 连接,也就是长连接,但是在不使用管道机制的情况下,交互是单工的,即客户端必须要等前一个请求的响应返回之后,新的请求才能发过去。而在使用管道机制的情况下,请求发送可以非阻塞,但是响应返回必须依然严格按照请求的顺序。 而多路复用则是基于流的,那么在传输的时候,无论请求还是响应,只要逻辑上允许就可以传输,如果两个请求没有依赖关系可以不必等待前一个返回而直接发送,虽说用的是同一条连接。 长连接需要客户端和服务端都要支持,同时 HTTP/1.1 的 keep-alive 要打开,对于这个 TCP 连接的维护,大多数 web 服务器都支持。

    2019-09-21
    9
  • CC
    思考题1: 分块传输两个特性: 1. 分块传输可以保持 HTTP 的持续链接(即 Keep-Alive)。 2. 分块传输可以让客户端在 body 信息发送完后,继续发送额外的 header 信息。 基于这两个特性,暂时想到下面两个类似的应用场景: - 优先传输网页上最重要的内容(比如首屏内容,首屏 CSS),其他延后传输。 - 页面上内容的长度未知的场景,比如瀑布流布局。 - 可以在内容传输后,加上 Expires header,来告知内容是否已经过期。 思考题2: 暂时想到下面这些设计原则: - 向前兼容 - 简单易用 - 可扩展 抓包: 第一次使用 Wireshark 分析抓包,感觉很有趣。 filter 的都是 TCP,而且发现大部分 TCP 都是成对出现,dest 和 src 相互交换。不知道这是不是就是文中提到的「握手」? 使用 python3 的朋友,如果发现文中的代码不好用,是因为 SimpleHTTPServer 在 3 中合并入了 http library,可以使用 http.server 替代,代码如下: python -m http.server 8080 谢谢扩展阅读,学到之前很多不知道的知识。

    作者回复: 感谢你的回答,同时也感谢指出 Python3 下的方法。 关于你的问题,开始的部分是 TCP 的 handshake,后面还有数据传输,以及 teardown。

    2019-09-17
    6
  • seamoontime
    老师例子能不能用百度,bing之类的,谷歌国内不可用啊

    作者回复: 专栏几乎所有的例子都可以使用别的 HTTPS 网站来完成。这一篇里面除了 HTTP/0.9 那个小部分不能以外,其它全部都可以使用百度或者 Bing 完成。:)

    2019-09-12
    5
  • pyhhou
    思考题: 1. 当需要传输一个大文件,不能一次传完,可以使用分块传输,这里的分块传输和 UDP 中的分块传输类似吗? 2. 罗列了下,大概有几点: 1)不存在歧义,计算机最难做的事就是做选择 2)尽可能地简单 3)保证以后容易扩展 4)尽可能模块化 5)对于发送操作一定要严格,对于接收操作要有一定的容忍度 选修课堂思考题: 除了 HTTP 报文外,剩下的都是 TCP 报文,因为 TCP 是 HTTP 的下一层,其需要建立连接,并接收或者发送数据到 HTTP,有了 TCP 报文才能够更为详细地反应网络中数据的传递

    作者回复: 1. 对,“一次传不完”是其中一个应用场景。它和 TCP 或 UDP 的 packet 的概念有些像,但是他们是在不同的层次,一个是在应用层,一个是在传输层。 2. 嗯,这些都是很好的方面。 选修课堂问题:正确

    2019-09-11
    4
  • Jasonfan
    四火老师,有个小疑问,长连接保持多久,什么时候结束长链接,进行下一次三次握手

    作者回复: 这个协议里面并未规定具体时间:在没有数据传输的时候,保持一定的时间,之后服务端和客户端都可以主动结束长连接。

    2019-09-20
    2
  • infrared628
    我可以access google,但是使用telnet www.google.com 80后cmd中啥也没有,按ctrl+c退出后cmd中看到出现以下错误: HTTP/1.0 400 Bad Request Content-Length: 54 Content-Type: text/html; charset=UTF-8 Date: Thu, 12 Sep 2019 18:28:18 GMT <html><title>Error 400 (Bad Request)!!1</title></html> 这是google不支持telnet了吗?然后我试了下telnet www.example.com 80,同样cmd中啥也没有,按ctrl+c退出后出现以下信息说unimplemented: HTTP/1.0 501 Not Implemented Content-Type: text/html Content-Length: 357 Connection: close Date: Thu, 12 Sep 2019 18:30:31 GMT Server: ECSF (bsa/EB24) <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>501 - Not Implemented</title> </head> <body> <h1>501 - Not Implemented</h1> </body> </html> Connection to host lost. 然后装了netcat,在安装目录下写好课件里面的request.txt,然后运行nc后在Cmd line后面输入 www.google.com 80 < ~request.txt或者www.example.com 80 < ~request.txt,运行后说 invalid port < ~request.txt,请问老师为什么port会是invalid? 上面这些错误是我运行有误还是windows的问题?

    作者回复: 关于 Google 那个,不清楚你的网络环境是否有特别的限制,否则应该是能够使用 telnet 的。你可以试试别的服务,看看telnet是否能访问。另外,telnet 只是建立了 tcp 连接,你需要发送消息才能得到响应。比如,在我的Mac上如下:telnet www.google.com 80 Trying 2607:f8b0:400a:809::2004... Connected to www.google.com. Escape character is '^]'. GET / ... netcat 的话,那个例子不是使用交互模式,而是直接运行:netcat www.google.com 80 < 文件路径

    2019-09-13
    2
  • xcoder
    完了,这课不好学啊,好多不懂,看着一头雾水,缺少必要的知识去联系起来,工具还得自己去查查学起来,还要阅读英文文章。。。。。

    作者回复: 你好 xcoder,别害怕,每个人不同领域的知识储备都不同。你要是能具体谈谈那些不懂,我可以想想办法帮你

    2019-09-11
    2
  • 唯心主义蠢货🍁
    1. 分块传输针对大文件传输过程,比如下载某个视频或者音频的过程 2. 设计一个协议的话,如果像http基于tcp,tcp保证了数据可以完整到达接收端,http只需要约定内容,分为请求和响应过程。 为了传输速度快,需要协议尽可能简洁 为了保证信息无误差,需要强制性规定 为了保证消息传输内容不同,需要满足可拓展性

    作者回复: 协议设计的需要考虑的角度有很多,你说的都正确,也可以看看别人的补充。

    2020-11-01
    1
收起评论
显示
设置
留言
23
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部