1
xenme 2018-12-03 16:03:32 +08:00 1
所有的协议,只要你知道怎么解析,都能看得到。
浏览器最终要显示,肯定能看到,必然要支持协议。 另外,二进制可能是指的传输过程。 |
2
flowfire 2018-12-03 16:11:29 +08:00 via iPhone 1
在应用层分别是是二进制和文本,进了传输层都是二进制
|
3
est 2018-12-03 16:13:29 +08:00 1
http 1.x 是文本协议的意思就是说你多一个空格,换行是 \r\n 都可以可以兼容的。不信你去试
(不过不同的 web 服务器兼容性不一样,特别是大陆那台全国级的 web 服务器) |
4
phx13ye OP @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 ``` |
5
SoloCompany 2018-12-04 00:15:37 +08:00 via iPad
排除 tls
主要是指 header 部分的传输 二进制编码可以更高效率的压缩 比如 content-type 占 12 字节,enum key 就只占一到两个字节 |
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 这个命令呢? |
7
est 2018-12-04 09:25:49 +08:00
curl --http2
|
8
phx13ye OP @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 ``` |
10
lieh222 2018-12-04 13:54:58 +08:00
手动实现简单的 http1.1 http2 服务端之后你就懂了,http2 可能较难,量力而行
|