HTTP/1.x

HTTP/1.x 协议是一个文本协议,可读性非常好,但是并不高效

解析

  • 解析一个完整的 HTTP 请求,首先要正确读出 HTTP header。HTTP header 各个 fields 使用 \r\n 分隔,然后跟 body 之间使用 \r\n\r\n 分隔。解析完 header 之后,才能从 header 里面的 content-length 拿到 body 的 size , 从而读取 body
  • 这套流程其实并不高效,因为我们要读取多次,才能将一个完整的 HTTP 请求给解析出来,虽然在代码上有很多的优化方法:
    • 一次将一大块数据读取到 buffer 里面,避免多次 IO 开销
    • 读取的时候直接匹配 \r\n 的方式流式解析
  • 主要问题在于, HTTP/1.x 协议是一个文本协议,是给人看的,对机器并不友好,二进制才是更好的选择

Request/Response

  • HTTP/1.x 另一个问题就在于它的交互模式,一个连接每次只能一问一答,也就是client 发送了 request 之后,必须等到 response,才能继续发送下一次请求。
  • 这套机制是非常简单,但会造成网络连接利用率不高。如果需要同时进行大量的交互,client 需要跟 server 建立多条连接,但连接的建立也是有开销的,所以为了性能,通常这些连接都是长连接一直保活的,虽然对于 server 来说同时处理百万连接也没啥太大的挑战,但终归效率不高。

Push

  • HTTP/1.x 并没有推送机制。所以通常两种做法:
    • Long polling 方式,也就是直接给 server 挂一个连接,等待一段时间(譬如 1 分钟),如果 server 有返回或者超时,则再次重新 poll。
    • Web-socket,通过 upgrade 机制显式的将这条 HTTP 连接变成裸的 TCP,进行双向交互
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,908评论 18 139
  • 组织:中国互动出版网(http://www.china-pub.com/) RFC文档中文翻译计划(http://...
    Palomar阅读 1,599评论 0 6
  • 使用 HTTP 服务器或客户端功能必须调用require('http')。 Node 里的 HTTP 接口支持协议...
    保川阅读 1,398评论 0 1
  • xdh精英班20160909课后作业: Node.js HTTP 介绍 本文根据xdh精英班20160909课后作...
    birdflying阅读 901评论 0 4
  • 01 今天接到旧同事的一个电话,她可以说是我十几年前的一个闺蜜,后因为她的远嫁,相聚的机会就越来越少,也因为后来的...
    彩色人生七阅读 225评论 0 1