V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
httpbin - 协议调试工具
httpstatuses - 协议状态码查询
httpie - cURL-like tool for humans
Fiddler
phx13ye
V2EX  ›  HTTP

http2 是二进制协议、 http1.x 是文本协议,怎么理解啊?

  •  
  •   phx13ye · 2018-12-03 15:56:07 +08:00 · 4585 次点击
    这是一个创建于 2189 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请求响应在网络上传输不是都是二进制吗?
    用上 http2 的网站,dev tools 还是看得到具体请求头和响应,是浏览器做的编解码吗?
    10 条回复    2018-12-04 13:54:58 +08:00
    xenme
        1
    xenme  
       2018-12-03 16:03:32 +08:00   ❤️ 1
    所有的协议,只要你知道怎么解析,都能看得到。
    浏览器最终要显示,肯定能看到,必然要支持协议。

    另外,二进制可能是指的传输过程。
    flowfire
        2
    flowfire  
       2018-12-03 16:11:29 +08:00 via iPhone   ❤️ 1
    在应用层分别是是二进制和文本,进了传输层都是二进制
    est
        3
    est  
       2018-12-03 16:13:29 +08:00   ❤️ 1
    http 1.x 是文本协议的意思就是说你多一个空格,换行是 \r\n 都可以可以兼容的。不信你去试

    (不过不同的 web 服务器兼容性不一样,特别是大陆那台全国级的 web 服务器)
    phx13ye
        4
    phx13ye  
    OP
       2018-12-03 18:55:43 +08:00
    @flowfire
    @xenme
    @est
    可以理解为,在解码的时候,http1.x 协议要先把二进制字节变成文本,再对文本进行一次解析才可以分析出报文,而 http2.0 不需要吗?

    我按 1.x 的方式用 curl 请求 cloudflare 这种 http2 的网站,是 curl 帮我把 2.0 的帧封装并解析的吗?
    ```
    └─[$] <> curl -i -X POST -H "Content-Type: application/json" -d "{\"foo\":\"bar\"}" https://www.cloudflare.com


    HTTP/2 403
    date: Mon, 03 Dec 2018 10:53:59 GMT
    content-type: text/html; charset=UTF-8
    ```
    SoloCompany
        5
    SoloCompany  
       2018-12-04 00:15:37 +08:00 via iPad
    排除 tls
    主要是指 header 部分的传输
    二进制编码可以更高效率的压缩
    比如 content-type 占 12 字节,enum key 就只占一到两个字节
    est
        6
    est  
       2018-12-04 09:25:05 +08:00
    @phx13ye 我估计是 cf 返回乱填了一个 HTTP/2

    你试试 CURLOPT_HTTP_VERSION=CURL_HTTP_VERSION_2_0 curl -i -X POST -H "Content-Type: application/json" -d "{\"foo\":\"bar\"}" https://www.cloudflare.com 这个命令呢?
    est
        7
    est  
       2018-12-04 09:25:49 +08:00
    curl --http2
    phx13ye
        8
    phx13ye  
    OP
       2018-12-04 10:25:32 +08:00
    @est 我的环境没有这两个变量$CURLOPT_HTTP_VERSION $CURL_HTTP_VERSION_2_0
    用 http1.1
    ```
    └─[$] <> curl --http1.1 -i -X POST -H "Content-Type: application/json" -d "{\"foo\":\"bar\"}" cf 的网址( v2 说我带外链)
    HTTP/1.1 403 Forbidden
    Date: Tue, 04 Dec 2018 02:23:25 GMT
    ```
    用 http2
    ```
    └─[$] <> curl --http2 -i -X POST -H "Content-Type: application/json" -d "{\"foo\":\"bar\"}" cf 的网址( v2 说我带外链)
    HTTP/2 403
    date: Tue, 04 Dec 2018 02:23:17 GMT
    ```
    est
        9
    est  
       2018-12-04 10:43:56 +08:00
    @phx13ye 这个看起来就是 curl 自动把二进制的还原成可读的文本了。你试试抓包。
    lieh222
        10
    lieh222  
       2018-12-04 13:54:58 +08:00
    手动实现简单的 http1.1 http2 服务端之后你就懂了,http2 可能较难,量力而行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2640 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:04 · PVG 15:04 · LAX 23:04 · JFK 02:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.