HTTP/1.x

作者: angeChen | 来源:发表于2017-09-26 10:06 被阅读12次

    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,进行双向交互

    相关文章

      网友评论

          本文标题:HTTP/1.x

          本文链接:https://www.haomeiwen.com/subject/vhajextx.html