{"id":5790,"date":"2022-05-18T23:39:02","date_gmt":"2022-05-18T15:39:02","guid":{"rendered":"https:\/\/damogame.cn:15443\/wordpress\/?p=5790"},"modified":"2022-05-18T23:39:02","modified_gmt":"2022-05-18T15:39:02","slug":"http2-%e8%af%a6%e8%a7%a3","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/5790","title":{"rendered":"HTTP2 \u8be6\u89e3"},"content":{"rendered":"<div class=\"article-header-box\">\n<div class=\"article-header\">\n<div class=\"article-title-box\">\n<p id=\"articleContentId\" class=\"title-article\"><a href=\"https:\/\/blog.csdn.net\/z69183787\/article\/details\/106643647\/\">\u539f\u6587\u5730\u5740<\/a><\/p>\n<\/div>\n<div class=\"article-info-box\">\n<div class=\"article-bar-top\"><img decoding=\"async\" class=\"article-type-img\" src=\"https:\/\/csdnimg.cn\/release\/blogv2\/dist\/pc\/img\/reprint.png\" alt=\"\" \/><\/div>\n<\/div>\n<\/div>\n<\/div>\n<article class=\"baidu_pl\">\n<div id=\"article_content\" class=\"article_content clearfix\">\n<div id=\"content_views\" class=\"htmledit_views\">\n<p>\u7ef4\u57fa\u767e\u79d1\u5173\u4e8e HTTP\/2 \u7684\u4ecb\u7ecd\uff0c\u53ef\u4ee5\u770b\u4e0b\u5b9a\u4e49\u548c\u53d1\u5c55\u5386\u53f2:<\/p>\n<p><a href=\"https:\/\/zh.wikipedia.org\/wiki\/HTTP\/2\" target=\"_blank\" rel=\"noopener\">Wiki<\/a><\/p>\n<p>RFC 7540 \u5b9a\u4e49\u4e86 HTTP\/2 \u7684\u534f\u8bae\u89c4\u8303\u548c\u7ec6\u8282\uff0c\u672c\u6587\u7684\u7ec6\u8282\u4e3b\u8981\u6765\u81ea\u6b64\u6587\u6863\uff0c\u5efa\u8bae\u5148\u770b\u4e00\u904d\u672c\u6587\uff0c\u518d\u56de\u8fc7\u5934\u6765\u7167\u7740\u534f\u8bae\u5927\u81f4\u8fc7\u4e00\u904d RFC\uff0c\u5982\u679c\u60f3\u6df1\u5165\u67d0\u4e9b\u7ec6\u8282\u518d\u4ed4\u7ec6\u7ffb\u770b RFC<\/p>\n<p><a href=\"https:\/\/httpwg.org\/specs\/rfc7540.html\" target=\"_blank\" rel=\"noopener\">RFC7540<\/a><\/p>\n<h2><a name=\"t0\"><\/a>Why use it ?<\/h2>\n<h3><a name=\"t1\"><\/a>HTTP\/1.1 \u5b58\u5728\u7684\u95ee\u9898:<\/h3>\n<p>1\u3001<strong>TCP \u8fde\u63a5\u6570\u9650\u5236<\/strong><\/p>\n<p>\u5bf9\u4e8e\u540c\u4e00\u4e2a\u57df\u540d\uff0c\u6d4f\u89c8\u5668\u6700\u591a\u53ea\u80fd\u540c\u65f6\u521b\u5efa 6~8 \u4e2a TCP \u8fde\u63a5 (\u4e0d\u540c\u6d4f\u89c8\u5668\u4e0d\u4e00\u6837)\u3002\u4e3a\u4e86\u89e3\u51b3\u6570\u91cf\u9650\u5236\uff0c\u51fa\u73b0\u4e86\u00a0<code>\u57df\u540d\u5206\u7247<\/code>\u00a0\u6280\u672f\uff0c\u5176\u5b9e\u5c31\u662f\u8d44\u6e90\u5206\u57df\uff0c\u5c06\u8d44\u6e90\u653e\u5728\u4e0d\u540c\u57df\u540d\u4e0b (\u6bd4\u5982\u4e8c\u7ea7\u5b50\u57df\u540d\u4e0b)\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u9488\u5bf9\u4e0d\u540c\u57df\u540d\u521b\u5efa\u8fde\u63a5\u5e76\u8bf7\u6c42\uff0c\u4ee5\u4e00\u79cd\u8ba8\u5de7\u7684\u65b9\u5f0f\u7a81\u7834\u9650\u5236\uff0c\u4f46\u662f\u6ee5\u7528\u6b64\u6280\u672f\u4e5f\u4f1a\u9020\u6210\u5f88\u591a\u95ee\u9898\uff0c\u6bd4\u5982\u6bcf\u4e2a TCP \u8fde\u63a5\u672c\u8eab\u9700\u8981\u7ecf\u8fc7 DNS \u67e5\u8be2\u3001\u4e09\u6b65\u63e1\u624b\u3001\u6162\u542f\u52a8\u7b49\uff0c\u8fd8\u5360\u7528\u989d\u5916\u7684 CPU \u548c\u5185\u5b58\uff0c\u5bf9\u4e8e\u670d\u52a1\u5668\u6765\u8bf4\u8fc7\u591a\u8fde\u63a5\u4e5f\u5bb9\u6613\u9020\u6210\u7f51\u7edc\u62e5\u6324\u3001\u4ea4\u901a\u963b\u585e\u7b49\uff0c\u5bf9\u4e8e\u79fb\u52a8\u7aef\u6765\u8bf4\u95ee\u9898\u66f4\u660e\u663e\uff0c\u53ef\u4ee5\u53c2\u8003\u8fd9\u7bc7\u6587\u7ae0:\u00a0<a href=\"http:\/\/dev.mobify.com\/blog\/domain-sharding-bad-news-mobile-performance\/\" target=\"_blank\" rel=\"noopener\">Why Domain Sharding is Bad News for Mobile Performance and Users<\/a><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTkwN2ZlMWMxOGI5ZTY0ZWMucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTExNS9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTBmYmZiYzM3YTllODIwNGQucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTExMS9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>\u5728\u56fe\u4e2d\u53ef\u4ee5\u770b\u5230\u65b0\u5efa\u4e86\u516d\u4e2a TCP \u8fde\u63a5\uff0c\u6bcf\u6b21\u65b0\u5efa\u8fde\u63a5 DNS \u89e3\u6790\u9700\u8981\u65f6\u95f4(\u51e0 ms \u5230\u51e0\u767e ms \u4e0d\u7b49)\u3001TCP \u6162\u542f\u52a8\u4e5f\u9700\u8981\u65f6\u95f4\u3001TLS \u63e1\u624b\u53c8\u8981\u65f6\u95f4\uff0c\u800c\u4e14\u540e\u7eed\u8bf7\u6c42\u90fd\u8981\u7b49\u5f85<a class=\"hl hl-1\" href=\"https:\/\/so.csdn.net\/so\/search?q=%E9%98%9F%E5%88%97&amp;spm=1001.2101.3001.7020\" target=\"_blank\" rel=\"noopener\" data-report-click=\"{&quot;spm&quot;:&quot;1001.2101.3001.7020&quot;,&quot;dest&quot;:&quot;https:\/\/so.csdn.net\/so\/search?q=%E9%98%9F%E5%88%97&amp;spm=1001.2101.3001.7020&quot;}\" data-tit=\"\u961f\u5217\" data-pretit=\"\u961f\u5217\">\u961f\u5217<\/a>\u8c03\u5ea6<\/p>\n<p>2\u3001<strong><a href=\"https:\/\/zh.wikipedia.org\/wiki\/%E9%98%9F%E5%A4%B4%E9%98%BB%E5%A1%9E\" target=\"_blank\" rel=\"noopener\">\u7ebf\u5934\u963b\u585e (Head Of Line Blocking)<\/a>\u00a0\u95ee\u9898<\/strong><\/p>\n<p>\u6bcf\u4e2a TCP \u8fde\u63a5\u540c\u65f6\u53ea\u80fd\u5904\u7406\u4e00\u4e2a\u8bf7\u6c42 &#8211; \u54cd\u5e94\uff0c\u6d4f\u89c8\u5668\u6309 FIFO \u539f\u5219\u5904\u7406\u8bf7\u6c42\uff0c\u5982\u679c\u4e0a\u4e00\u4e2a\u54cd\u5e94\u6ca1\u8fd4\u56de\uff0c\u540e\u7eed\u8bf7\u6c42 &#8211; \u54cd\u5e94\u90fd\u4f1a\u53d7\u963b\u3002\u4e3a\u4e86\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u51fa\u73b0\u4e86\u00a0<a href=\"https:\/\/zh.wikipedia.org\/wiki\/HTTP%E7%AE%A1%E7%B7%9A%E5%8C%96\" target=\"_blank\" rel=\"noopener\">\u7ba1\u7ebf\u5316 &#8211; pipelining<\/a>\u00a0\u6280\u672f\uff0c\u4f46\u662f\u7ba1\u7ebf\u5316\u5b58\u5728\u8bf8\u591a\u95ee\u9898\uff0c\u6bd4\u5982\u7b2c\u4e00\u4e2a\u54cd\u5e94\u6162\u8fd8\u662f\u4f1a\u963b\u585e\u540e\u7eed\u54cd\u5e94\u3001\u670d\u52a1\u5668\u4e3a\u4e86\u6309\u5e8f\u8fd4\u56de\u76f8\u5e94\u9700\u8981\u7f13\u5b58\u591a\u4e2a\u54cd\u5e94\u5360\u7528\u66f4\u591a\u8d44\u6e90\u3001\u6d4f\u89c8\u5668\u4e2d\u9014\u65ad\u8fde\u91cd\u8bd5\u670d\u52a1\u5668\u53ef\u80fd\u5f97\u91cd\u65b0\u5904\u7406\u591a\u4e2a\u8bf7\u6c42\u3001\u8fd8\u6709\u5fc5\u987b\u5ba2\u6237\u7aef &#8211; \u4ee3\u7406 &#8211; \u670d\u52a1\u5668\u90fd\u652f\u6301\u7ba1\u7ebf\u5316<\/p>\n<p>3\u3001Header \u5185\u5bb9\u591a\uff0c\u800c\u4e14\u6bcf\u6b21\u8bf7\u6c42 Header \u4e0d\u4f1a\u53d8\u5316\u592a\u591a\uff0c\u6ca1\u6709\u76f8\u5e94\u7684\u538b\u7f29\u4f20\u8f93\u4f18\u5316\u65b9\u6848<\/p>\n<p>4\u3001\u4e3a\u4e86\u5c3d\u53ef\u80fd\u51cf\u5c11\u8bf7\u6c42\u6570\uff0c\u9700\u8981\u505a\u5408\u5e76\u6587\u4ef6\u3001\u96ea\u78a7\u56fe\u3001\u8d44\u6e90\u5185\u8054\u7b49\u4f18\u5316\u5de5\u4f5c\uff0c\u4f46\u662f\u8fd9\u65e0\u7591\u9020\u6210\u4e86\u5355\u4e2a\u8bf7\u6c42\u5185\u5bb9\u53d8\u5927\u5ef6\u8fdf\u53d8\u9ad8\u7684\u95ee\u9898\uff0c\u4e14\u5185\u5d4c\u7684\u8d44\u6e90\u4e0d\u80fd\u6709\u6548\u5730\u4f7f\u7528\u7f13\u5b58\u673a\u5236<\/p>\n<p>5\u3001\u660e\u6587\u4f20\u8f93\u4e0d\u5b89\u5168<\/p>\n<h3><a name=\"t2\"><\/a>HTTP2 \u7684\u4f18\u52bf:<\/h3>\n<p>1\u3001\u4e8c\u8fdb\u5236\u5206\u5e27\u5c42 (Binary Framing Layer)<\/p>\n<p>\u5e27\u662f\u6570\u636e\u4f20\u8f93\u7684\u6700\u5c0f\u5355\u4f4d\uff0c\u4ee5\u4e8c\u8fdb\u5236\u4f20\u8f93\u4ee3\u66ff\u539f\u672c\u7684\u660e\u6587\u4f20\u8f93\uff0c\u539f\u672c\u7684\u62a5\u6587\u6d88\u606f\u88ab\u5212\u5206\u4e3a\u66f4\u5c0f\u7684\u6570\u636e\u5e27:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTY5ZTgzN2U1ZGFjMWM2NTIucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTEwNS9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>h1 \u548c h2 \u7684\u62a5\u6587\u5bf9\u6bd4:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LWI4NGVjMTNmY2IyYTM4N2IucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTIwMC9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTIzMDY2YTk2MTJhYzAzOTcucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTIwMC9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>\u56fe\u4e2d h2 \u7684\u62a5\u6587\u662f\u91cd\u7ec4\u89e3\u6790\u8fc7\u540e\u7684\uff0c\u53ef\u4ee5\u53d1\u73b0\u4e00\u4e9b\u5934\u5b57\u6bb5\u53d1\u751f\u4e86\u53d8\u5316\uff0c\u800c\u4e14\u6240\u6709\u5934\u5b57\u6bb5\u5747\u5c0f\u5199<\/p>\n<blockquote><p><code>strict-transport-security: max-age=63072000; includeSubdomains<\/code>\u00a0\u5b57\u6bb5\u662f\u670d\u52a1\u5668\u5f00\u542f\u00a0<a href=\"https:\/\/zh.wikipedia.org\/wiki\/HTTP%E4%B8%A5%E6%A0%BC%E4%BC%A0%E8%BE%93%E5%AE%89%E5%85%A8\" target=\"_blank\" rel=\"noopener\">HSTS \u7b56\u7565<\/a>\uff0c\u8ba9\u6d4f\u89c8\u5668\u5f3a\u5236\u4f7f\u7528 HTTPS \u8fdb\u884c\u901a\u4fe1\uff0c\u53ef\u4ee5\u51cf\u5c11\u91cd\u5b9a\u5411\u9020\u6210\u7684\u989d\u5916\u8bf7\u6c42\u548c\u4f1a\u8bdd\u52ab\u6301\u7684\u98ce\u9669<\/p><\/blockquote>\n<blockquote><p>\u670d\u52a1\u5668\u5f00\u542f HSTS \u7684\u65b9\u6cd5\u662f: \u4ee5 nginx \u4e3a\u4f8b\uff0c\u5728\u76f8\u5e94\u7ad9\u70b9\u7684 server \u6a21\u5757\u4e2d\u6dfb\u52a0\u00a0<code>add_header Strict-Transport-Security \"max-age=63072000; includeSubdomains\" always;<\/code>\u00a0\u5373\u53ef<\/p><\/blockquote>\n<blockquote><p>\u5728 Chrome \u4e2d\u53ef\u4ee5\u6253\u5f00\u00a0<code>chrome:\/\/net-internals\/#hsts<\/code>\u00a0\u8fdb\u5165\u6d4f\u89c8\u5668\u7684 HSTS \u7ba1\u7406\u754c\u9762\uff0c\u53ef\u4ee5\u589e\u52a0 \/ \u5220\u9664 \/ \u67e5\u8be2 HSTS \u8bb0\u5f55\uff0c\u6bd4\u5982\u4e0b\u56fe:<\/p><\/blockquote>\n<blockquote><p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTg0MmFmOTUyODNjZjEyYjkucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvNjgyL2Zvcm1hdC93ZWJw?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p><\/blockquote>\n<blockquote><p>\u5728 HSTS \u6709\u6548\u671f\u5185\u4e14 TLS \u8bc1\u4e66\u4ecd\u6709\u6548\uff0c\u6d4f\u89c8\u5668\u8bbf\u95ee\u00a0<a href=\"http:\/\/blog.wangriyu.wang\/\" target=\"_blank\" rel=\"noopener\">blog.wangriyu.wang<\/a>\u00a0\u4f1a\u81ea\u52a8\u52a0\u4e0a https:\/\/ \uff0c\u800c\u4e0d\u9700\u8981\u505a\u4e00\u6b21\u67e5\u8be2\u91cd\u5b9a\u5411\u5230 https<\/p><\/blockquote>\n<p>\u5173\u4e8e\u5e27\u8be6\u89c1:\u00a0<a href=\"https:\/\/blog.csdn.net\/z69183787\/article\/details\/106643647\/#%E5%B8%A7-Frame\" target=\"_blank\" rel=\"noopener\">How does it work \uff1f- \u5e27<\/a><\/p>\n<p>2\u3001\u591a\u8def\u590d\u7528 (MultiPlexing)<\/p>\n<p>\u5728\u4e00\u4e2a TCP \u8fde\u63a5\u4e0a\uff0c\u6211\u4eec\u53ef\u4ee5\u5411\u5bf9\u65b9\u4e0d\u65ad\u53d1\u9001\u5e27\uff0c\u6bcf\u5e27\u7684 stream identifier \u7684\u6807\u660e\u8fd9\u4e00\u5e27\u5c5e\u4e8e\u54ea\u4e2a\u6d41\uff0c\u7136\u540e\u5728\u5bf9\u65b9\u63a5\u6536\u65f6\uff0c\u6839\u636e stream identifier \u62fc\u63a5\u6bcf\u4e2a\u6d41\u7684\u6240\u6709\u5e27\u7ec4\u6210\u4e00\u6574\u5757\u6570\u636e\u3002<br \/>\n\u628a HTTP\/1.1 \u6bcf\u4e2a\u8bf7\u6c42\u90fd\u5f53\u4f5c\u4e00\u4e2a\u6d41\uff0c\u90a3\u4e48\u591a\u4e2a\u8bf7\u6c42\u53d8\u6210\u591a\u4e2a\u6d41\uff0c\u8bf7\u6c42\u54cd\u5e94\u6570\u636e\u5206\u6210\u591a\u4e2a\u5e27\uff0c\u4e0d\u540c\u6d41\u4e2d\u7684\u5e27\u4ea4\u9519\u5730\u53d1\u9001\u7ed9\u5bf9\u65b9\uff0c\u8fd9\u5c31\u662f HTTP\/2 \u4e2d\u7684\u591a\u8def\u590d\u7528\u3002<\/p>\n<p>\u6d41\u7684\u6982\u5ff5\u5b9e\u73b0\u4e86\u5355\u8fde\u63a5\u4e0a\u591a\u8bf7\u6c42 &#8211; \u54cd\u5e94\u5e76\u884c\uff0c\u89e3\u51b3\u4e86\u7ebf\u5934\u963b\u585e\u7684\u95ee\u9898\uff0c\u51cf\u5c11\u4e86 TCP \u8fde\u63a5\u6570\u91cf\u548c TCP \u8fde\u63a5\u6162\u542f\u52a8\u9020\u6210\u7684\u95ee\u9898<\/p>\n<p>\u6240\u4ee5 http2 \u5bf9\u4e8e\u540c\u4e00\u57df\u540d\u53ea\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u8fde\u63a5\uff0c\u800c\u4e0d\u662f\u50cf http\/1.1 \u90a3\u6837\u521b\u5efa 6~8 \u4e2a\u8fde\u63a5:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTRhYWZhNWYzZGM1ODlmZDMucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvOTgxL2Zvcm1hdC93ZWJw?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LWM2ZDI2MmRmNWM1OWNlNGYucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvOTgxL2Zvcm1hdC93ZWJw?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>\u5173\u4e8e\u6d41\u8be6\u89c1:\u00a0<a href=\"https:\/\/blog.csdn.net\/z69183787\/article\/details\/106643647\/#%E6%B5%81-Stream\" target=\"_blank\" rel=\"noopener\">How does it work \uff1f- \u6d41<\/a><\/p>\n<p>3\u3001\u670d\u52a1\u7aef\u63a8\u9001 (Server Push)<\/p>\n<p>\u6d4f\u89c8\u5668\u53d1\u9001\u4e00\u4e2a\u8bf7\u6c42\uff0c\u670d\u52a1\u5668\u4e3b\u52a8\u5411\u6d4f\u89c8\u5668\u63a8\u9001\u4e0e\u8fd9\u4e2a\u8bf7\u6c42\u76f8\u5173\u7684\u8d44\u6e90\uff0c\u8fd9\u6837\u6d4f\u89c8\u5668\u5c31\u4e0d\u7528\u53d1\u8d77\u540e\u7eed\u8bf7\u6c42\u3002<\/p>\n<p>Server-Push \u4e3b\u8981\u662f\u9488\u5bf9\u8d44\u6e90\u5185\u8054\u505a\u51fa\u7684\u4f18\u5316\uff0c\u76f8\u8f83\u4e8e http\/1.1 \u8d44\u6e90\u5185\u8054\u7684\u4f18\u52bf:<\/p>\n<ul>\n<li>\u5ba2\u6237\u7aef\u53ef\u4ee5\u7f13\u5b58\u63a8\u9001\u7684\u8d44\u6e90<\/li>\n<li>\u5ba2\u6237\u7aef\u53ef\u4ee5\u62d2\u6536\u63a8\u9001\u8fc7\u6765\u7684\u8d44\u6e90<\/li>\n<li>\u63a8\u9001\u8d44\u6e90\u53ef\u4ee5\u7531\u4e0d\u540c\u9875\u9762\u5171\u4eab<\/li>\n<li>\u670d\u52a1\u5668\u53ef\u4ee5\u6309\u7167\u4f18\u5148\u7ea7\u63a8\u9001\u8d44\u6e90<\/li>\n<\/ul>\n<p>\u5173\u4e8e\u670d\u52a1\u7aef\u63a8\u9001\u8be6\u89c1:\u00a0<a href=\"https:\/\/blog.csdn.net\/z69183787\/article\/details\/106643647\/#Server-Push\" target=\"_blank\" rel=\"noopener\">How does it work \uff1f- Server-Push<\/a><\/p>\n<p>4\u3001Header \u538b\u7f29 (HPACK)<\/p>\n<p>\u4f7f\u7528\u00a0<a href=\"https:\/\/httpwg.org\/specs\/rfc7541.html\" target=\"_blank\" rel=\"noopener\">HPACK<\/a>\u00a0\u7b97\u6cd5\u6765\u538b\u7f29\u9996\u90e8\u5185\u5bb9<\/p>\n<p>\u5173\u4e8e HPACK \u8be6\u89c1:\u00a0<a href=\"https:\/\/blog.csdn.net\/z69183787\/article\/details\/106643647\/#HPACK-%E7%AE%97%E6%B3%95\" target=\"_blank\" rel=\"noopener\">How does it work \uff1f- HPACK<\/a><\/p>\n<p>5\u3001\u5e94\u7528\u5c42\u7684\u91cd\u7f6e\u8fde\u63a5<\/p>\n<p>\u5bf9\u4e8e HTTP\/1 \u6765\u8bf4\uff0c\u662f\u901a\u8fc7\u8bbe\u7f6e tcp segment \u91cc\u7684 reset flag \u6765\u901a\u77e5\u5bf9\u7aef\u5173\u95ed\u8fde\u63a5\u7684\u3002\u8fd9\u79cd\u65b9\u5f0f\u4f1a\u76f4\u63a5\u65ad\u5f00\u8fde\u63a5\uff0c\u4e0b\u6b21\u518d\u53d1\u8bf7\u6c42\u5c31\u5fc5\u987b\u91cd\u65b0\u5efa\u7acb\u8fde\u63a5\u3002HTTP\/2 \u5f15\u5165 RST_STREAM \u7c7b\u578b\u7684 frame\uff0c\u53ef\u4ee5\u5728\u4e0d\u65ad\u5f00\u8fde\u63a5\u7684\u524d\u63d0\u4e0b\u53d6\u6d88\u67d0\u4e2a request \u7684 stream\uff0c\u8868\u73b0\u66f4\u597d\u3002<\/p>\n<p>6\u3001\u8bf7\u6c42\u4f18\u5148\u7ea7\u8bbe\u7f6e<\/p>\n<p>HTTP\/2 \u91cc\u7684\u6bcf\u4e2a stream \u90fd\u53ef\u4ee5\u8bbe\u7f6e\u4f9d\u8d56 (Dependency) \u548c\u6743\u91cd\uff0c\u53ef\u4ee5\u6309\u4f9d\u8d56\u6811\u5206\u914d\u4f18\u5148\u7ea7\uff0c\u89e3\u51b3\u4e86\u5173\u952e\u8bf7\u6c42\u88ab\u963b\u585e\u7684\u95ee\u9898<\/p>\n<p>7\u3001\u6d41\u91cf\u63a7\u5236<\/p>\n<p>\u6bcf\u4e2a http2 \u6d41\u90fd\u62e5\u6709\u81ea\u5df1\u7684\u516c\u793a\u7684\u6d41\u91cf\u7a97\u53e3\uff0c\u5b83\u53ef\u4ee5\u9650\u5236\u53e6\u4e00\u7aef\u53d1\u9001\u6570\u636e\u3002\u5bf9\u4e8e\u6bcf\u4e2a\u6d41\u6765\u8bf4\uff0c\u4e24\u7aef\u90fd\u5fc5\u987b\u544a\u8bc9\u5bf9\u65b9\u81ea\u5df1\u8fd8\u6709\u8db3\u591f\u7684\u7a7a\u95f4\u6765\u5904\u7406\u65b0\u7684\u6570\u636e\uff0c\u800c\u5728\u8be5\u7a97\u53e3\u88ab\u6269\u5927\u524d\uff0c\u53e6\u4e00\u7aef\u53ea\u88ab\u5141\u8bb8\u53d1\u9001\u8fd9\u4e48\u591a\u6570\u636e\u3002<\/p>\n<p>\u5173\u4e8e\u6d41\u91cf\u63a7\u5236\u8be6\u89c1:\u00a0<a href=\"https:\/\/blog.csdn.net\/z69183787\/article\/details\/106643647\/#%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6\" target=\"_blank\" rel=\"noopener\">How does it work \uff1f- \u6d41\u91cf\u63a7\u5236<\/a><\/p>\n<p>8\u3001HTTP\/1 \u7684\u51e0\u79cd\u4f18\u5316\u53ef\u4ee5\u5f03\u7528<\/p>\n<p>\u5408\u5e76\u6587\u4ef6\u3001\u5185\u8054\u8d44\u6e90\u3001\u96ea\u78a7\u56fe\u3001\u57df\u540d\u5206\u7247\u5bf9\u4e8e HTTP\/2 \u6765\u8bf4\u662f\u4e0d\u5fc5\u8981\u7684\uff0c\u4f7f\u7528 h2 \u5c3d\u53ef\u80fd\u5c06\u8d44\u6e90\u7ec6\u7c92\u5316\uff0c\u6587\u4ef6\u5206\u89e3\u5730\u5c3d\u53ef\u80fd\u6563\uff0c\u4e0d\u7528\u62c5\u5fc3\u8bf7\u6c42\u6570\u591a<\/p>\n<h2><a name=\"t3\"><\/a>How does it work ?<\/h2>\n<h3><a name=\"t4\"><\/a>\u5e27 &#8211; Frame<\/h3>\n<p>\u5e27\u7684\u7ed3\u6784<\/p>\n<p>\u6240\u6709\u5e27\u90fd\u662f\u4e00\u4e2a\u56fa\u5b9a\u7684 9 \u5b57\u8282\u5934\u90e8 (payload \u4e4b\u524d) \u8ddf\u4e00\u4e2a\u6307\u5b9a\u957f\u5ea6\u7684\u8d1f\u8f7d (payload):<\/p>\n<pre><code class=\"hljs language-diff\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| Length (24) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| Type (8) | Flags (8) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+-+&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">|R| Stream Identifier (31) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+=+=============================================================+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| Frame Payload (0&#8230;) &#8230;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-diff\"><\/code><\/pre>\n<ul>\n<li><code>Length<\/code>\u00a0\u4ee3\u8868\u6574\u4e2a frame \u7684\u957f\u5ea6\uff0c\u7528\u4e00\u4e2a 24 \u4f4d\u65e0\u7b26\u53f7\u6574\u6570\u8868\u793a\u3002\u9664\u975e\u63a5\u6536\u8005\u5728 SETTINGS_MAX_FRAME_SIZE \u8bbe\u7f6e\u4e86\u66f4\u5927\u7684\u503c (\u5927\u5c0f\u53ef\u4ee5\u662f 2^14(16384) \u5b57\u8282\u5230 2^24-1(16777215) \u5b57\u8282\u4e4b\u95f4\u7684\u4efb\u610f\u503c)\uff0c\u5426\u5219\u6570\u636e\u957f\u5ea6\u4e0d\u5e94\u8d85\u8fc7 2^14(16384) \u5b57\u8282\u3002\u5934\u90e8\u7684 9 \u5b57\u8282\u4e0d\u7b97\u5728\u8fd9\u4e2a\u957f\u5ea6\u91cc<\/li>\n<li><code>Type<\/code>\u00a0\u5b9a\u4e49 frame \u7684\u7c7b\u578b\uff0c\u7528 8 bits \u8868\u793a\u3002\u5e27\u7c7b\u578b\u51b3\u5b9a\u4e86\u5e27\u4e3b\u4f53\u7684\u683c\u5f0f\u548c\u8bed\u4e49\uff0c\u5982\u679c type \u4e3a unknown \u5e94\u8be5\u5ffd\u7565\u6216\u629b\u5f03\u3002<\/li>\n<li><code>Flags<\/code>\u00a0\u662f\u4e3a\u5e27\u7c7b\u578b\u76f8\u5173\u800c\u9884\u7559\u7684\u5e03\u5c14\u6807\u8bc6\u3002\u6807\u8bc6\u5bf9\u4e8e\u4e0d\u540c\u7684\u5e27\u7c7b\u578b\u8d4b\u4e88\u4e86\u4e0d\u540c\u7684\u8bed\u4e49\u3002\u5982\u679c\u8be5\u6807\u8bc6\u5bf9\u4e8e\u67d0\u79cd\u5e27\u7c7b\u578b\u6ca1\u6709\u5b9a\u4e49\u8bed\u4e49\uff0c\u5219\u5b83\u5fc5\u987b\u88ab\u5ffd\u7565\u4e14\u53d1\u9001\u7684\u65f6\u5019\u5e94\u8be5\u8d4b\u503c\u4e3a (0x0)<\/li>\n<li><code>R<\/code>\u00a0\u662f\u4e00\u4e2a\u4fdd\u7559\u7684\u6bd4\u7279\u4f4d\u3002\u8fd9\u4e2a\u6bd4\u7279\u7684\u8bed\u4e49\u6ca1\u6709\u5b9a\u4e49\uff0c\u53d1\u9001\u65f6\u5b83\u5fc5\u987b\u88ab\u8bbe\u7f6e\u4e3a (0x0), \u63a5\u6536\u65f6\u9700\u8981\u5ffd\u7565\u3002<\/li>\n<li><a href=\"https:\/\/httpwg.org\/specs\/rfc7540.html#StreamIdentifiers\" target=\"_blank\" rel=\"noopener\">Stream Identifier<\/a>\u00a0\u7528\u4f5c\u6d41\u63a7\u5236\uff0c\u7528 31 \u4f4d\u65e0\u7b26\u53f7\u6574\u6570\u8868\u793a\u3002\u5ba2\u6237\u7aef\u5efa\u7acb\u7684 sid \u5fc5\u987b\u4e3a\u5947\u6570\uff0c\u670d\u52a1\u7aef\u5efa\u7acb\u7684 sid \u5fc5\u987b\u4e3a\u5076\u6570\uff0c\u503c (0x0) \u4fdd\u7559\u7ed9\u4e0e\u6574\u4e2a\u8fde\u63a5\u76f8\u5173\u8054\u7684\u5e27 (\u8fde\u63a5\u63a7\u5236\u6d88\u606f)\uff0c\u800c\u4e0d\u662f\u5355\u4e2a\u6d41<\/li>\n<li><code>Frame Payload<\/code>\u00a0\u662f\u4e3b\u4f53\u5185\u5bb9\uff0c\u7531\u5e27\u7c7b\u578b\u51b3\u5b9a<\/li>\n<\/ul>\n<p>\u5171\u5206\u4e3a\u5341\u79cd\u7c7b\u578b\u7684\u5e27:<\/p>\n<ul>\n<li><code>HEADERS<\/code>: \u62a5\u5934\u5e27 (type=0x1)\uff0c\u7528\u6765\u6253\u5f00\u4e00\u4e2a\u6d41\u6216\u8005\u643a\u5e26\u4e00\u4e2a\u9996\u90e8\u5757\u7247\u6bb5<\/li>\n<li><code>DATA<\/code>: \u6570\u636e\u5e27 (type=0x0)\uff0c\u88c5\u586b\u4e3b\u4f53\u4fe1\u606f\uff0c\u53ef\u4ee5\u7528\u4e00\u4e2a\u6216\u591a\u4e2a DATA \u5e27\u6765\u8fd4\u56de\u4e00\u4e2a\u8bf7\u6c42\u7684\u54cd\u5e94\u4e3b\u4f53<\/li>\n<li><code>PRIORITY<\/code>: \u4f18\u5148\u7ea7\u5e27 (type=0x2)\uff0c\u6307\u5b9a\u53d1\u9001\u8005\u5efa\u8bae\u7684\u6d41\u4f18\u5148\u7ea7\uff0c\u53ef\u4ee5\u5728\u4efb\u4f55\u6d41\u72b6\u6001\u4e0b\u53d1\u9001 PRIORITY \u5e27\uff0c\u5305\u62ec\u7a7a\u95f2 (idle) \u548c\u5173\u95ed (closed) \u7684\u6d41<\/li>\n<li><code>RST_STREAM<\/code>: \u6d41\u7ec8\u6b62\u5e27 (type=0x3)\uff0c\u7528\u6765\u8bf7\u6c42\u53d6\u6d88\u4e00\u4e2a\u6d41\uff0c\u6216\u8005\u8868\u793a\u53d1\u751f\u4e86\u4e00\u4e2a\u9519\u8bef\uff0cpayload \u5e26\u6709\u4e00\u4e2a 32 \u4f4d\u65e0\u7b26\u53f7\u6574\u6570\u7684\u9519\u8bef\u7801 (<a href=\"https:\/\/httpwg.org\/specs\/rfc7540.html#ErrorCodes\" target=\"_blank\" rel=\"noopener\">Error Codes<\/a>)\uff0c\u4e0d\u80fd\u5728\u5904\u4e8e\u7a7a\u95f2 (idle) \u72b6\u6001\u7684\u6d41\u4e0a\u53d1\u9001 RST_STREAM \u5e27<\/li>\n<li><code>SETTINGS<\/code>: \u8bbe\u7f6e\u5e27 (type=0x4)\uff0c\u8bbe\u7f6e\u6b64\u00a0<code>\u8fde\u63a5<\/code>\u00a0\u7684\u53c2\u6570\uff0c\u4f5c\u7528\u4e8e\u6574\u4e2a\u8fde\u63a5<\/li>\n<li><code>PUSH_PROMISE<\/code>: \u63a8\u9001\u5e27 (type=0x5)\uff0c\u670d\u52a1\u7aef\u63a8\u9001\uff0c\u5ba2\u6237\u7aef\u53ef\u4ee5\u8fd4\u56de\u4e00\u4e2a RST_STREAM \u5e27\u6765\u9009\u62e9\u62d2\u7edd\u63a8\u9001\u7684\u6d41<\/li>\n<li><code>PING<\/code>: PING \u5e27 (type=0x6)\uff0c\u5224\u65ad\u4e00\u4e2a\u7a7a\u95f2\u7684\u8fde\u63a5\u662f\u5426\u4ecd\u7136\u53ef\u7528\uff0c\u4e5f\u53ef\u4ee5\u6d4b\u91cf\u6700\u5c0f\u5f80\u8fd4\u65f6\u95f4 (RTT)<\/li>\n<li><code>GOAWAY<\/code>: GOWAY \u5e27 (type=0x7)\uff0c\u7528\u4e8e\u53d1\u8d77\u5173\u95ed\u8fde\u63a5\u7684\u8bf7\u6c42\uff0c\u6216\u8005\u8b66\u793a\u4e25\u91cd\u9519\u8bef\u3002GOAWAY \u4f1a\u505c\u6b62\u63a5\u6536\u65b0\u6d41\uff0c\u5e76\u4e14\u5173\u95ed\u8fde\u63a5\u524d\u4f1a\u5904\u7406\u5b8c\u5148\u524d\u5efa\u7acb\u7684\u6d41<\/li>\n<li><code>WINDOW_UPDATE<\/code>: \u7a97\u53e3\u66f4\u65b0\u5e27 (type=0x8)\uff0c\u7528\u4e8e\u6267\u884c\u6d41\u91cf\u63a7\u5236\u529f\u80fd\uff0c\u53ef\u4ee5\u4f5c\u7528\u5728\u5355\u72ec\u67d0\u4e2a\u6d41\u4e0a (\u6307\u5b9a\u5177\u4f53 Stream Identifier) \u4e5f\u53ef\u4ee5\u4f5c\u7528\u6574\u4e2a\u8fde\u63a5 (Stream Identifier \u4e3a 0x0)\uff0c\u53ea\u6709 DATA \u5e27\u53d7\u6d41\u91cf\u63a7\u5236\u5f71\u54cd\u3002\u521d\u59cb\u5316\u6d41\u91cf\u7a97\u53e3\u540e\uff0c\u53d1\u9001\u591a\u5c11\u8d1f\u8f7d\uff0c\u6d41\u91cf\u7a97\u53e3\u5c31\u51cf\u5c11\u591a\u5c11\uff0c\u5982\u679c\u6d41\u91cf\u7a97\u53e3\u4e0d\u8db3\u5c31\u65e0\u6cd5\u53d1\u9001\uff0cWINDOW_UPDATE \u5e27\u53ef\u4ee5\u589e\u52a0\u6d41\u91cf\u7a97\u53e3\u5927\u5c0f<\/li>\n<li><code>CONTINUATION<\/code>: \u5ef6\u7eed\u5e27 (type=0x9)\uff0c\u7528\u4e8e\u7ee7\u7eed\u4f20\u9001\u9996\u90e8\u5757\u7247\u6bb5\u5e8f\u5217\uff0c\u89c1\u00a0<a href=\"https:\/\/blog.csdn.net\/z69183787\/article\/details\/106643647\/#%E9%A6%96%E9%83%A8%E7%9A%84%E5%8E%8B%E7%BC%A9%E4%B8%8E%E8%A7%A3%E5%8E%8B%E7%BC%A9\" target=\"_blank\" rel=\"noopener\">\u9996\u90e8\u7684\u538b\u7f29\u4e0e\u89e3\u538b\u7f29<\/a><\/li>\n<\/ul>\n<p>DATA \u5e27\u683c\u5f0f<\/p>\n<pre><code class=\"hljs language-sql\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span>Pad Length? (<span class=\"hljs-number\">8<\/span>)<span class=\"hljs-operator\">|<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span> Data (<span class=\"hljs-operator\">*<\/span>) &#8230;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span> Padding (<span class=\"hljs-operator\">*<\/span>) &#8230;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-sql\"><\/code><\/pre>\n<ul>\n<li><code>Pad Length<\/code>: ? \u8868\u793a\u6b64\u5b57\u6bb5\u7684\u51fa\u73b0\u65f6\u6709\u6761\u4ef6\u7684\uff0c\u9700\u8981\u8bbe\u7f6e\u76f8\u5e94\u6807\u8bc6 (set flag)\uff0c\u6307\u5b9a Padding \u957f\u5ea6\uff0c\u5b58\u5728\u5219\u4ee3\u8868 PADDING flag \u88ab\u8bbe\u7f6e<\/li>\n<li><code>Data<\/code>: \u4f20\u9012\u7684\u6570\u636e\uff0c\u5176\u957f\u5ea6\u4e0a\u9650\u7b49\u4e8e\u5e27\u7684 payload \u957f\u5ea6\u51cf\u53bb\u5176\u4ed6\u51fa\u73b0\u7684\u5b57\u6bb5\u957f\u5ea6<\/li>\n<li><code>Padding<\/code>: \u586b\u5145\u5b57\u8282\uff0c\u6ca1\u6709\u5177\u4f53\u8bed\u4e49\uff0c\u53d1\u9001\u65f6\u5fc5\u987b\u8bbe\u4e3a 0\uff0c\u4f5c\u7528\u662f\u6df7\u6dc6\u62a5\u6587\u957f\u5ea6\uff0c\u4e0e TLS \u4e2d CBC \u5757\u52a0\u5bc6\u7c7b\u4f3c\uff0c\u8be6\u89c1\u00a0<a href=\"https:\/\/httpwg.org\/specs\/rfc7540.html#padding\" target=\"_blank\" rel=\"noopener\">https:\/\/httpwg.org\/specs\/rfc7540.html#padding<\/a><\/li>\n<\/ul>\n<p>DATA \u5e27\u6709\u5982\u4e0b\u6807\u8bc6 (flags):<\/p>\n<ul>\n<li>END_STREAM: bit 0 \u8bbe\u4e3a 1 \u4ee3\u8868\u5f53\u524d\u6d41\u7684\u6700\u540e\u4e00\u5e27<\/li>\n<li>PADDED: bit 3 \u8bbe\u4e3a 1 \u4ee3\u8868\u5b58\u5728 Padding<\/li>\n<\/ul>\n<p>\u4f8b\u5b50:<\/p>\n<p>image<\/p>\n<p>image<\/p>\n<p>image<\/p>\n<p>HEADERS \u5e27\u683c\u5f0f<\/p>\n<pre><code class=\"hljs language-sql\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span>Pad Length? (<span class=\"hljs-number\">8<\/span>)<span class=\"hljs-operator\">|<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-operator\">&#8211;<\/span><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span>E<span class=\"hljs-operator\">|<\/span> Stream Dependency? (<span class=\"hljs-number\">31<\/span>) <span class=\"hljs-operator\">|<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-operator\">&#8211;<\/span><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span> Weight? (<span class=\"hljs-number\">8<\/span>) <span class=\"hljs-operator\">|<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-operator\">&#8211;<\/span><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span> Header Block Fragment (<span class=\"hljs-operator\">*<\/span>) &#8230;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"10\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span> Padding (<span class=\"hljs-operator\">*<\/span>) &#8230;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"11\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-sql\"><\/code><\/pre>\n<ul>\n<li><code>Pad Length<\/code>: \u6307\u5b9a Padding \u957f\u5ea6\uff0c\u5b58\u5728\u5219\u4ee3\u8868 PADDING flag \u88ab\u8bbe\u7f6e<\/li>\n<li><code>E<\/code>: \u4e00\u4e2a\u6bd4\u7279\u4f4d\u58f0\u660e\u6d41\u7684\u4f9d\u8d56\u6027\u662f\u5426\u662f\u6392\u4ed6\u7684\uff0c\u5b58\u5728\u5219\u4ee3\u8868 PRIORITY flag \u88ab\u8bbe\u7f6e<\/li>\n<li><code>Stream Dependency<\/code>: \u6307\u5b9a\u4e00\u4e2a stream identifier\uff0c\u4ee3\u8868\u5f53\u524d\u6d41\u6240\u4f9d\u8d56\u7684\u6d41\u7684 id\uff0c\u5b58\u5728\u5219\u4ee3\u8868 PRIORITY flag \u88ab\u8bbe\u7f6e<\/li>\n<li><code>Weight<\/code>: \u4e00\u4e2a\u65e0\u7b26\u53f7 8 \u4e3a\u6574\u6570\uff0c\u4ee3\u8868\u5f53\u524d\u6d41\u7684\u4f18\u5148\u7ea7\u6743\u91cd\u503c (1~256)\uff0c\u5b58\u5728\u5219\u4ee3\u8868 PRIORITY flag \u88ab\u8bbe\u7f6e<\/li>\n<li><code>Header Block Fragment<\/code>: header \u5757\u7247\u6bb5<\/li>\n<li><code>Padding<\/code>: \u586b\u5145\u5b57\u8282\uff0c\u6ca1\u6709\u5177\u4f53\u8bed\u4e49\uff0c\u4f5c\u7528\u4e0e DATA \u7684 Padding \u4e00\u6837\uff0c\u5b58\u5728\u5219\u4ee3\u8868 PADDING flag \u88ab\u8bbe\u7f6e<\/li>\n<\/ul>\n<p>HEADERS \u5e27\u6709\u4ee5\u4e0b\u6807\u8bc6 (flags):<\/p>\n<ul>\n<li>END_STREAM: bit 0 \u8bbe\u4e3a 1 \u4ee3\u8868\u5f53\u524d header \u5757\u662f\u53d1\u9001\u7684\u6700\u540e\u4e00\u5757\uff0c\u4f46\u662f\u5e26\u6709 END_STREAM \u6807\u8bc6\u7684 HEADERS \u5e27\u540e\u9762\u8fd8\u53ef\u4ee5\u8ddf CONTINUATION \u5e27 (\u8fd9\u91cc\u53ef\u4ee5\u628a CONTINUATION \u770b\u4f5c HEADERS \u7684\u4e00\u90e8\u5206)<\/li>\n<li>END_HEADERS: bit 2 \u8bbe\u4e3a 1 \u4ee3\u8868 header \u5757\u7ed3\u675f<\/li>\n<li>PADDED: bit 3 \u8bbe\u4e3a 1 \u4ee3\u8868 Pad \u88ab\u8bbe\u7f6e\uff0c\u5b58\u5728 Pad Length \u548c Padding<\/li>\n<li>PRIORITY: bit 5 \u8bbe\u4e3a 1 \u8868\u793a\u5b58\u5728 Exclusive Flag (E), Stream Dependency, \u548c Weight<\/li>\n<\/ul>\n<p>\u4f8b\u5b50:<\/p>\n<p>image<\/p>\n<p>image<\/p>\n<p>\u9996\u90e8\u7684\u538b\u7f29\u4e0e\u89e3\u538b\u7f29<\/p>\n<p>HTTP\/2 \u91cc\u7684\u9996\u90e8\u5b57\u6bb5\u4e5f\u662f\u4e00\u4e2a\u952e\u5177\u6709\u4e00\u4e2a\u6216\u591a\u4e2a\u503c\u3002\u8fd9\u4e9b\u9996\u90e8\u5b57\u6bb5\u7528\u4e8e HTTP \u8bf7\u6c42\u548c\u54cd\u5e94\u6d88\u606f\uff0c\u4e5f\u7528\u4e8e\u670d\u52a1\u7aef\u63a8\u9001\u64cd\u4f5c\u3002<\/p>\n<p>\u9996\u90e8\u5217\u8868 (Header List) \u662f\u96f6\u4e2a\u6216\u591a\u4e2a\u9996\u90e8\u5b57\u6bb5 (Header Field) \u7684\u96c6\u5408\u3002\u5f53\u901a\u8fc7\u8fde\u63a5\u4f20\u9001\u65f6\uff0c\u9996\u90e8\u5217\u8868\u901a\u8fc7\u538b\u7f29\u7b97\u6cd5(\u5373\u4e0b\u6587 HPACK) \u5e8f\u5217\u5316\u6210\u9996\u90e8\u5757 (Header Block)\u3002\u7136\u540e\uff0c\u5e8f\u5217\u5316\u7684\u9996\u90e8\u5757\u53c8\u88ab\u5212\u5206\u6210\u4e00\u4e2a\u6216\u591a\u4e2a\u53eb\u505a\u9996\u90e8\u5757\u7247\u6bb5 (Header Block Fragment) \u7684\u5b57\u8282\u5e8f\u5217\uff0c\u5e76\u901a\u8fc7 HEADERS\u3001PUSH_PROMISE\uff0c\u6216\u8005 CONTINUATION \u5e27\u8fdb\u884c\u6709\u6548\u8d1f\u8f7d\u4f20\u9001\u3002<\/p>\n<blockquote><p>Cookie \u9996\u90e8\u5b57\u6bb5\u9700\u8981 HTTP \u6620\u5c04\u7279\u6b8a\u5bf9\u5f85\uff0c\u89c1\u00a0<a href=\"https:\/\/httpwg.org\/specs\/rfc7540.html#CompressCookie\" target=\"_blank\" rel=\"noopener\">8.1.2.5. Compressing the Cookie Header Field<\/a><\/p><\/blockquote>\n<p>\u4e00\u4e2a\u5b8c\u6574\u7684\u9996\u90e8\u5757\u6709\u4e24\u79cd\u53ef\u80fd<\/p>\n<ul>\n<li>\u4e00\u4e2a HEADERS \u5e27\u6216 PUSH_PROMISE \u5e27\u52a0\u4e0a\u8bbe\u7f6e END_HEADERS flag<\/li>\n<li>\u4e00\u4e2a\u672a\u8bbe\u7f6e END_HEADERS flag \u7684 HEADERS \u5e27\u6216 PUSH_PROMISE \u5e27\uff0c\u52a0\u4e0a\u591a\u4e2a CONTINUATION \u5e27\uff0c\u5176\u4e2d\u6700\u540e\u4e00\u4e2a CONTINUATION \u5e27\u8bbe\u7f6e END_HEADERS flag<\/li>\n<\/ul>\n<p>\u5fc5\u987b\u5c06\u9996\u90e8\u5757\u4f5c\u4e3a\u8fde\u7eed\u7684\u5e27\u5e8f\u5217\u4f20\u9001\uff0c\u4e0d\u80fd\u63d2\u5165\u4efb\u4f55\u5176\u4ed6\u7c7b\u578b\u6216\u5176\u4ed6\u6d41\u7684\u5e27\u3002\u5c3e\u5e27\u8bbe\u7f6e END_HEADERS \u6807\u8bc6\u4ee3\u8868\u9996\u90e8\u5757\u7ed3\u675f\uff0c\u8fd9\u8ba9\u9996\u90e8\u5757\u5728\u903b\u8f91\u4e0a\u7b49\u4ef7\u4e8e\u4e00\u4e2a\u5355\u72ec\u7684\u5e27\u3002\u63a5\u6536\u7aef\u8fde\u63a5\u7247\u6bb5\u91cd\u7ec4\u9996\u90e8\u5757\uff0c\u7136\u540e\u89e3\u538b\u9996\u90e8\u5757\u91cd\u5efa\u9996\u90e8\u5217\u8868\u3002<\/p>\n<p>image<\/p>\n<p>SETTINGS \u5e27\u683c\u5f0f<\/p>\n<p><a href=\"https:\/\/httpwg.org\/specs\/rfc7540.html#SETTINGS\" target=\"_blank\" rel=\"noopener\">https:\/\/httpwg.org\/specs\/rfc7540.html#SETTINGS<\/a><\/p>\n<p>\u4e00\u4e2a SETTINGS \u5e27\u7684 payload \u7531\u96f6\u4e2a\u6216\u591a\u4e2a\u53c2\u6570\u7ec4\u6210\uff0c\u6bcf\u4e2a\u53c2\u6570\u7684\u5f62\u5f0f\u5982\u4e0b:<\/p>\n<pre><code class=\"hljs language-sql\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span> Identifier (<span class=\"hljs-number\">16<\/span>) <span class=\"hljs-operator\">|<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span> <span class=\"hljs-keyword\">Value<\/span> (<span class=\"hljs-number\">32<\/span>) <span class=\"hljs-operator\">|<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-sql\"><\/code><\/pre>\n<ul>\n<li><code>Identifier<\/code>: \u4ee3\u8868\u53c2\u6570\u7c7b\u578b\uff0c\u6bd4\u5982 SETTINGS_HEADER_TABLE_SIZE \u662f 0x1<\/li>\n<li><code>Value<\/code>: \u76f8\u5e94\u53c2\u6570\u7684\u503c<\/li>\n<\/ul>\n<p>\u5728\u5efa\u7acb\u8fde\u63a5\u5f00\u59cb\u65f6\u53cc\u65b9\u90fd\u8981\u53d1\u9001 SETTINGS \u5e27\u4ee5\u8868\u660e\u81ea\u5df1\u671f\u8bb8\u5bf9\u65b9\u5e94\u505a\u7684\u914d\u7f6e\uff0c\u5bf9\u65b9\u63a5\u6536\u540e\u540c\u610f\u914d\u7f6e\u53c2\u6570\u4fbf\u8fd4\u56de\u5e26\u6709 ACK \u6807\u8bc6\u7684\u7a7a SETTINGS \u5e27\u8868\u793a\u786e\u8ba4\uff0c\u800c\u4e14\u8fde\u63a5\u540e\u4efb\u610f\u65f6\u523b\u4efb\u610f\u4e00\u65b9\u4e5f\u90fd\u53ef\u80fd\u518d\u53d1\u9001 SETTINGS \u5e27\u8c03\u6574\uff0cSETTINGS \u5e27\u4e2d\u7684\u53c2\u6570\u4f1a\u88ab\u6700\u65b0\u63a5\u6536\u5230\u7684\u53c2\u6570\u8986\u76d6<\/p>\n<p>SETTINGS \u5e27\u4f5c\u7528\u4e8e\u6574\u4e2a\u8fde\u63a5\uff0c\u800c\u4e0d\u662f\u67d0\u4e2a\u6d41\uff0c\u800c\u4e14 SETTINGS \u5e27\u7684 stream identifier \u5fc5\u987b\u662f 0x0\uff0c\u5426\u5219\u63a5\u6536\u65b9\u4f1a\u8ba4\u4e3a\u9519\u8bef (PROTOCOL_ERROR)\u3002<\/p>\n<p>SETTINGS \u5e27\u5305\u542b\u4ee5\u4e0b\u53c2\u6570:<\/p>\n<ul>\n<li>SETTINGS_HEADER_TABLE_SIZE (0x1): \u7528\u4e8e\u89e3\u6790 Header block \u7684 Header \u538b\u7f29\u8868\u7684\u5927\u5c0f\uff0c\u521d\u59cb\u503c\u662f 4096 \u5b57\u8282<\/li>\n<li>SETTINGS_ENABLE_PUSH (0x2): \u53ef\u4ee5\u5173\u95ed Server Push\uff0c\u8be5\u503c\u521d\u59cb\u4e3a 1\uff0c\u8868\u793a\u5141\u8bb8\u670d\u52a1\u7aef\u63a8\u9001\u529f\u80fd<\/li>\n<li>SETTINGS_MAX_CONCURRENT_STREAMS (0x3): \u4ee3\u8868\u53d1\u9001\u7aef\u5141\u8bb8\u63a5\u6536\u7aef\u521b\u5efa\u7684\u6700\u5927\u6d41\u6570\u76ee<\/li>\n<li>SETTINGS_INITIAL_WINDOW_SIZE (0x4): \u6307\u660e\u53d1\u9001\u7aef\u6240\u6709\u6d41\u7684\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u7684\u521d\u59cb\u5927\u5c0f\uff0c\u4f1a\u5f71\u54cd\u6240\u6709\u6d41\uff0c\u8be5\u521d\u59cb\u503c\u662f 2^16 &#8211; 1(65535) \u5b57\u8282\uff0c\u6700\u5927\u503c\u662f 2^31 &#8211; 1\uff0c\u5982\u679c\u8d85\u51fa\u6700\u5927\u503c\u5219\u4f1a\u8fd4\u56de FLOW_CONTROL_ERROR<\/li>\n<li>SETTINGS_MAX_FRAME_SIZE (0x5): \u6307\u660e\u53d1\u9001\u7aef\u5141\u8bb8\u63a5\u6536\u7684\u6700\u5927\u5e27\u8d1f\u8f7d\u7684\u5b57\u8282\u6570\uff0c\u521d\u59cb\u503c\u662f 2^14(16384) \u5b57\u8282\uff0c\u5982\u679c\u8be5\u503c\u4e0d\u5728\u521d\u59cb\u503c (2^14) \u548c\u6700\u5927\u503c (2^24 &#8211; 1) \u4e4b\u95f4\uff0c\u8fd4\u56de PROTOCOL_ERROR<\/li>\n<li>SETTINGS_MAX_HEADER_LIST_SIZE (0x6): \u901a\u77e5\u5bf9\u7aef\uff0c\u53d1\u9001\u7aef\u51c6\u5907\u63a5\u6536\u7684\u9996\u90e8\u5217\u8868\u5927\u5c0f\u7684\u6700\u5927\u5b57\u8282\u6570\u3002\u8be5\u503c\u662f\u57fa\u4e8e\u672a\u538b\u7f29\u7684\u9996\u90e8\u57df\u5927\u5c0f\uff0c\u5305\u62ec\u540d\u79f0\u548c\u503c\u7684\u5b57\u8282\u957f\u5ea6\uff0c\u5916\u52a0\u6bcf\u4e2a\u9996\u90e8\u57df\u7684 32 \u5b57\u8282\u7684\u5f00\u9500<\/li>\n<\/ul>\n<p>SETTINGS \u5e27\u6709\u4ee5\u4e0b\u6807\u8bc6 (flags):<\/p>\n<ul>\n<li>ACK: bit 0 \u8bbe\u4e3a 1 \u4ee3\u8868\u5df2\u63a5\u6536\u5230\u5bf9\u65b9\u7684 SETTINGS \u8bf7\u6c42\u5e76\u540c\u610f\u8bbe\u7f6e\uff0c\u8bbe\u7f6e\u6b64\u6807\u5fd7\u7684 SETTINGS \u5e27 payload \u5fc5\u987b\u4e3a\u7a7a<\/li>\n<\/ul>\n<p>\u4f8b\u5b50:<\/p>\n<p>image<\/p>\n<p>\u5b9e\u9645\u6293\u5305\u4f1a\u53d1\u73b0 HTTP2 \u8bf7\u6c42\u521b\u5efa\u8fde\u63a5\u53d1\u9001 SETTINGS \u5e27\u521d\u59cb\u5316\u524d\u8fd8\u6709\u4e00\u4e2a Magic \u5e27 (\u5efa\u7acb HTTP\/2 \u8bf7\u6c42\u7684\u524d\u8a00)\u3002<\/p>\n<p>\u5728 HTTP\/2 \u4e2d\uff0c\u8981\u6c42\u4e24\u7aef\u90fd\u8981\u53d1\u9001\u4e00\u4e2a\u8fde\u63a5\u524d\u8a00\uff0c\u4f5c\u4e3a\u5bf9\u6240\u4f7f\u7528\u534f\u8bae\u7684\u6700\u7ec8\u786e\u8ba4\uff0c\u5e76\u786e\u5b9a HTTP\/2 \u8fde\u63a5\u7684\u521d\u59cb\u8bbe\u7f6e\uff0c\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef\u5404\u81ea\u53d1\u9001\u4e0d\u540c\u7684\u8fde\u63a5\u524d\u8a00\u3002<\/p>\n<p>\u5ba2\u6237\u7aef\u7684\u524d\u8a00\u5185\u5bb9 (\u5bf9\u5e94\u4e0a\u56fe\u4e2d\u7f16\u53f7 23 \u7684\u5e27) \u5305\u542b\u4e00\u4e2a\u5185\u5bb9\u4e3a\u00a0<code>PRI * HTTP\/2.0\\r\\n\\r\\nSM\\r\\n\\r\\n<\/code>\u00a0\u7684\u5e8f\u5217\u52a0\u4e0a\u4e00\u4e2a\u53ef\u4ee5\u4e3a\u7a7a\u7684 SETTINGS \u5e27\uff0c\u5728\u6536\u5230 101(Switching Protocols) \u54cd\u5e94 (\u4ee3\u8868 upgrade \u6210\u529f) \u540e\u53d1\u9001\uff0c\u6216\u8005\u4f5c\u4e3a TLS \u8fde\u63a5\u7684\u7b2c\u4e00\u4e2a\u4f20\u8f93\u7684\u5e94\u7528\u6570\u636e\u3002\u5982\u679c\u5728\u9884\u5148\u77e5\u9053\u670d\u52a1\u7aef\u652f\u6301 HTTP\/2 \u7684\u60c5\u51b5\u4e0b\u542f\u7528 HTTP\/2 \u8fde\u63a5\uff0c\u5ba2\u6237\u7aef\u8fde\u63a5\u524d\u8a00\u5728\u8fde\u63a5\u5efa\u7acb\u65f6\u53d1\u9001\u3002<\/p>\n<p>\u670d\u52a1\u7aef\u7684\u524d\u8a00 (\u5bf9\u5e94\u4e0a\u56fe\u4e2d\u7f16\u53f7 26 \u7684\u5e27) \u5305\u542b\u4e00\u4e2a\u53ef\u4ee5\u4e3a\u7a7a\u7684 SETTINGS \u5e27\uff0c\u5728\u5efa\u7acb HTTP\/2 \u8fde\u63a5\u540e\u4f5c\u4e3a\u7b2c\u4e00\u5e27\u53d1\u9001\u3002\u8be6\u89c1\u00a0<a href=\"https:\/\/httpwg.org\/specs\/rfc7540.html#ConnectionHeader\" target=\"_blank\" rel=\"noopener\">HTTP\/2 Connection Preface<\/a><\/p>\n<p>\u53d1\u9001\u5b8c\u524d\u8a00\u540e\u53cc\u65b9\u90fd\u5f97\u5411\u5bf9\u65b9\u53d1\u9001\u5e26\u6709 ACK \u6807\u8bc6\u7684 SETTINGS \u5e27\u8868\u793a\u786e\u8ba4\uff0c\u5bf9\u5e94\u4e0a\u56fe\u4e2d\u7f16\u53f7 29 \u548c 31 \u7684\u5e27\u3002<\/p>\n<p>\u8bf7\u6c42\u7ad9\u70b9\u7684\u5168\u90e8\u5e27\u5e8f\u5217\uff0c\u5e27\u540e\u9762\u7684\u6570\u5b57\u4ee3\u8868\u6240\u5c5e\u6d41\u7684 id\uff0c\u6700\u540e\u4ee5 GOAWAY \u5e27\u5173\u95ed\u8fde\u63a5:<\/p>\n<p>image<\/p>\n<p>GOAWAY \u5e27\u5e26\u6709\u6700\u5927\u7684\u90a3\u4e2a\u6d41\u6807\u8bc6\u7b26 (\u6bd4\u5982\u56fe\u4e2d\u7b2c 29 \u5e27\u662f\u6700\u5927\u6d41)\uff0c\u5bf9\u4e8e\u53d1\u9001\u65b9\u6765\u8bf4\u4f1a\u7ee7\u7eed\u5904\u7406\u5b8c\u4e0d\u5927\u4e8e\u6b64\u6570\u5b57\u7684\u6d41\uff0c\u7136\u540e\u518d\u771f\u6b63\u5173\u95ed\u8fde\u63a5<\/p>\n<h3><a name=\"t5\"><\/a>\u6d41 &#8211; Stream<\/h3>\n<p>\u6d41\u53ea\u662f\u4e00\u4e2a\u903b\u8f91\u4e0a\u7684\u6982\u5ff5\uff0c\u4ee3\u8868 HTTP\/2 \u8fde\u63a5\u4e2d\u5728\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u5668\u4e4b\u95f4\u4ea4\u6362\u7684\u72ec\u7acb\u53cc\u5411\u5e27\u5e8f\u5217\uff0c\u6bcf\u4e2a\u5e27\u7684 Stream Identifier \u5b57\u6bb5\u6307\u660e\u4e86\u5b83\u5c5e\u4e8e\u54ea\u4e2a\u6d41\u3002<\/p>\n<p>\u6d41\u6709\u4ee5\u4e0b\u7279\u6027:<\/p>\n<ul>\n<li>\u5355\u4e2a h2 \u8fde\u63a5\u53ef\u4ee5\u5305\u542b\u591a\u4e2a\u5e76\u53d1\u7684\u6d41\uff0c\u4e24\u7aef\u4e4b\u95f4\u53ef\u4ee5\u4ea4\u53c9\u53d1\u9001\u4e0d\u540c\u6d41\u7684\u5e27<\/li>\n<li>\u6d41\u53ef\u4ee5\u7531\u5ba2\u6237\u7aef\u6216\u670d\u52a1\u5668\u6765\u5355\u65b9\u9762\u5730\u5efa\u7acb\u548c\u4f7f\u7528\uff0c\u6216\u8005\u5171\u4eab<\/li>\n<li>\u6d41\u53ef\u4ee5\u7531\u4efb\u4e00\u65b9\u5173\u95ed<\/li>\n<li>\u5e27\u5728\u6d41\u4e0a\u53d1\u9001\u7684\u987a\u5e8f\u975e\u5e38\u91cd\u8981\uff0c\u6700\u540e\u63a5\u6536\u65b9\u4f1a\u628a\u76f8\u540c Stream Identifier (\u540c\u4e00\u4e2a\u6d41) \u7684\u5e27\u91cd\u65b0\u7ec4\u88c5\u6210\u5b8c\u6574\u6d88\u606f\u62a5\u6587<\/li>\n<\/ul>\n<p>\u6d41\u7684\u72b6\u6001<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/img-blog.csdnimg.cn\/20200609153938837.png?x-oss-process=image\/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3o2OTE4Mzc4Nw==,size_16,color_FFFFFF,t_70\" alt=\"\" width=\"500\" height=\"267\" \/><\/p>\n<p>image<\/p>\n<blockquote><p>\u6ce8\u610f\u56fe\u4e2d\u7684 send \u548c recv \u5bf9\u8c61\u662f\u6307\u7aef\u70b9\uff0c\u4e0d\u662f\u6307\u5f53\u524d\u7684\u6d41<\/p><\/blockquote>\n<p>idle<\/p>\n<p>\u6240\u6709\u6d41\u4ee5\u201c\u7a7a\u95f2\u201d\u72b6\u6001\u5f00\u59cb\u3002\u5728\u8fd9\u79cd\u72b6\u6001\u4e0b\uff0c\u6ca1\u6709\u4efb\u4f55\u5e27\u7684\u4ea4\u6362<\/p>\n<p>\u5176\u72b6\u6001\u8f6c\u6362:<\/p>\n<ul>\n<li>\u53d1\u9001\u6216\u8005\u63a5\u6536\u4e00\u4e2a HEADERS \u5e27\u4f1a\u4f7f\u7a7a\u95f2\u00a0<code>idle<\/code>\u00a0\u6d41\u53d8\u6210\u6253\u5f00\u00a0<code>open<\/code>\u00a0\u72b6\u6001\uff0c\u5176\u4e2d HEADERS \u5e27\u7684 Stream Identifier \u5b57\u6bb5\u6307\u660e\u4e86\u6d41 id\u3002\u540c\u6837\u7684 HEADERS \u5e27(\u5e26\u6709 END_STREAM )\u4e5f\u53ef\u4ee5\u4f7f\u4e00\u4e2a\u6d41\u7acb\u5373\u8fdb\u5165 half-closed \u72b6\u6001\u3002<\/li>\n<li>\u670d\u52a1\u7aef\u5fc5\u987b\u5728\u4e00\u4e2a\u6253\u5f00\u00a0<code>open<\/code>\u00a0\u6216\u8005\u534a\u5173\u95ed (\u8fdc\u7aef)\u00a0<code>half-closed(remote)<\/code>\u00a0\u72b6\u6001\u7684\u6d41 (\u7531\u5ba2\u6237\u7aef\u53d1\u8d77\u7684) \u4e0a\u53d1\u9001 PUSH_PROMISE \u5e27\uff0c\u5176\u4e2d PUSH_PROMISE \u5e27\u7684 Promised Stream ID \u5b57\u6bb5\u6307\u5b9a\u4e86\u4e00\u4e2a\u9884\u793a\u7684\u65b0\u6d41 (\u7531\u670d\u52a1\u7aef\u53d1\u8d77)\uff0c\n<ul>\n<li>\u5728\u670d\u52a1\u7aef\u8be5\u65b0\u6d41\u4f1a\u7531\u7a7a\u95f2\u00a0<code>idle<\/code>\u00a0\u72b6\u6001\u8fdb\u5165\u88ab\u4fdd\u7559\u7684 (\u672c\u5730)\u00a0<code>reserved(local)<\/code>\u00a0\u72b6\u6001<\/li>\n<li>\u5728\u5ba2\u6237\u7aef\u8be5\u65b0\u6d41\u4f1a\u7531\u7a7a\u95f2\u00a0<code>idle<\/code>\u00a0\u72b6\u6001\u8fdb\u5165\u88ab\u4fdd\u7559\u7684 (\u8fdc\u7aef)\u00a0<code>reserved(remote)<\/code>\u00a0\u72b6\u6001<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<blockquote><p>\u5728\u00a0<a href=\"https:\/\/httpwg.org\/specs\/rfc7540.html#discover-http\" target=\"_blank\" rel=\"noopener\">3.2 &#8211; Starting HTTP\/2 for &#8220;http&#8221; URIs<\/a>\u00a0\u4e2d\u4ecb\u7ecd\u4e86\u4e00\u79cd\u7279\u6b8a\u60c5\u51b5:<\/p>\n<blockquote><p>\u5ba2\u6237\u7aef\u53d1\u8d77\u4e00\u4e2a HTTP\/1.1 \u8bf7\u6c42\uff0c\u8bf7\u6c42\u5e26\u6709 Upgrade \u673a\u5236\uff0c\u60f3\u521b\u5efa h2c \u8fde\u63a5\uff0c\u670d\u52a1\u7aef\u540c\u610f\u5347\u7ea7\u8fd4\u56de 101 \u54cd\u5e94\u3002<br \/>\n\u5347\u7ea7\u4e4b\u524d\u53d1\u9001\u7684 HTTP\/1.1 \u8bf7\u6c42\u88ab\u5206\u914d\u4e00\u4e2a\u6d41\u6807\u8bc6\u7b26 0x1\uff0c\u5e76\u88ab\u8d4b\u4e88\u9ed8\u8ba4\u4f18\u5148\u7ea7\u503c\u3002\u4ece\u5ba2\u6237\u7aef\u5230\u670d\u52a1\u7aef\u8fd9\u4e2a\u6d41 1 \u9690\u5f0f\u5730\u8f6c\u4e3a &#8220;half-closed&#8221; \u72b6\u6001\uff0c\u56e0\u4e3a\u4f5c\u4e3a HTTP\/1.1 \u8bf7\u6c42\u5b83\u5df2\u7ecf\u5b8c\u6210\u4e86\u3002HTTP\/2 \u8fde\u63a5\u5f00\u59cb\u540e\uff0c\u6d41 1 \u7528\u4e8e\u54cd\u5e94\u3002\u8be6\u7ec6\u8fc7\u7a0b\u53ef\u4ee5\u770b\u4e0b\u6587\u7684\u00a0<a href=\"https:\/\/blog.csdn.net\/z69183787\/article\/details\/106643647\/#HTTP-2-%E7%9A%84%E5%8D%8F%E8%AE%AE%E5%8D%8F%E5%95%86%E6%9C%BA%E5%88%B6\" target=\"_blank\" rel=\"noopener\">HTTP\/2 \u7684\u534f\u8bae\u534f\u5546\u673a\u5236<\/a><\/p><\/blockquote>\n<\/blockquote>\n<p>\u6b64\u72b6\u6001\u4e0b\u63a5\u6536\u5230 HEADERS \u548c PRIORITY \u4ee5\u5916\u7684\u5e27\u88ab\u89c6\u4e3a PROTOCOL_ERROR<\/p>\n<p>\u72b6\u6001\u56fe\u4e2d\u00a0<code>send PP<\/code>\u00a0\u548c\u00a0<code>recv PP<\/code>\u00a0\u662f\u6307\u8fde\u63a5\u7684\u53cc\u65b9\u7aef\u70b9\u53d1\u9001\u6216\u63a5\u6536\u4e86 PUSH_PROMISE\uff0c\u4e0d\u662f\u6307\u67d0\u4e2a\u7a7a\u95f2\u6d41\u53d1\u9001\u6216\u63a5\u6536\u4e86 PUSH_PROMISE\uff0c\u662f PUSH_PROMISE \u7684\u51fa\u73b0\u4fc3\u4f7f\u4e00\u4e2a\u9884\u793a\u7684\u6d41\u4ece\u00a0<code>idle<\/code>\u00a0\u72b6\u6001\u8f6c\u4e3a\u00a0<code>reserved<\/code><\/p>\n<blockquote><p>\u5728\u4e0b\u6587\u00a0<a href=\"https:\/\/blog.csdn.net\/z69183787\/article\/details\/106643647\/#Server-Push\" target=\"_blank\" rel=\"noopener\">Server-Push<\/a>\u00a0\u4e2d\u4f1a\u8be6\u7ec6\u4ecb\u7ecd\u670d\u52a1\u7aef\u63a8\u9001\u7684\u5185\u5bb9\u548c PUSH_PROMISE \u7684\u4f7f\u7528\u60c5\u5f62<\/p><\/blockquote>\n<p>reserved (local) \/ reserved (remote)<\/p>\n<p>PUSH_PROMISE \u9884\u793a\u7684\u6d41\u7531\u00a0<code>idle<\/code>\u00a0\u72b6\u6001\u8fdb\u5165\u6b64\u72b6\u6001\uff0c\u4ee3\u8868\u51c6\u5907\u8fdb\u884c Server push<\/p>\n<p>\u5176\u72b6\u6001\u8f6c\u6362:<\/p>\n<ul>\n<li>PUSH_PROMISE \u5e27\u9884\u793a\u7684\u6d41\u7684\u54cd\u5e94\u4ee5 HEADERS \u5e27\u5f00\u59cb\uff0c\u8fd9\u4f1a\u7acb\u5373\u5c06\u8be5\u6d41\u5728\u670d\u52a1\u7aef\u7f6e\u4e8e\u534a\u5173\u95ed (\u8fdc\u7aef)\u00a0<code>half-closed(remote)<\/code>\u00a0\u72b6\u6001\uff0c\u5728\u5ba2\u6237\u7aef\u7f6e\u4e8e\u534a\u5173\u95ed (\u672c\u5730)\u00a0<code>half-closed(local)<\/code>\u00a0\u72b6\u6001\uff0c\u6700\u540e\u4ee5\u643a\u5e26 END_STREAM \u7684\u5e27\u7ed3\u675f\uff0c\u8fd9\u4f1a\u5c06\u6d41\u7f6e\u4e8e\u5173\u95ed\u00a0<code>closed<\/code>\u00a0\u72b6\u6001<\/li>\n<li>\u4efb\u4e00\u7aef\u70b9\u90fd\u53ef\u4ee5\u53d1\u9001 RST_STREAM \u5e27\u6765\u7ec8\u6b62\u8fd9\u4e2a\u6d41\uff0c\u5176\u72b6\u6001\u7531\u00a0<code>reserved<\/code>\u00a0\u8f6c\u4e3a\u00a0<code>closed<\/code><\/li>\n<\/ul>\n<p><code>reserved(local)<\/code>\u00a0\u72b6\u6001\u4e0b\u7684\u6d41\u4e0d\u80fd\u53d1\u9001 HEADERS\u3001RST_STREAM\u3001PRIORITY \u4ee5\u5916\u7684\u5e27\uff0c\u63a5\u6536\u5230 RST_STREAM\u3001PRIORITY\u3001WINDOW_UPDATE \u4ee5\u5916\u7684\u5e27\u88ab\u89c6\u4e3a PROTOCOL_ERROR<\/p>\n<p><code>reserved(remote)<\/code>\u00a0\u72b6\u6001\u4e0b\u7684\u6d41\u4e0d\u80fd\u53d1\u9001 RST_STREAM\u3001WINDOW_UPDATE\u3001PRIORITY \u4ee5\u5916\u7684\u5e27\uff0c\u63a5\u6536\u5230 HEADERS\u3001RST_STREAM\u3001PRIORITY \u4ee5\u5916\u7684\u5e27\u88ab\u89c6\u4e3a PROTOCOL_ERROR<\/p>\n<p>open<\/p>\n<p>\u5904\u4e8e\u00a0<code>open<\/code>\u00a0\u72b6\u6001\u7684\u6d41\u53ef\u4ee5\u88ab\u4e24\u4e2a\u5bf9\u7aef\u7528\u6765\u53d1\u9001\u4efb\u4f55\u7c7b\u578b\u7684\u5e27<\/p>\n<p>\u5176\u72b6\u6001\u8f6c\u6362:<\/p>\n<ul>\n<li>\u4efb\u4e00\u7aef\u90fd\u53ef\u4ee5\u53d1\u9001\u5e26\u6709 END_STREAM \u6807\u8bc6\u7684\u5e27\uff0c\u53d1\u9001\u65b9\u4f1a\u8f6c\u5165\u00a0<code>half-closed(local)<\/code>\u00a0\u72b6\u6001\uff1b\u63a5\u6536\u65b9\u4f1a\u8f6c\u5165\u00a0<code>half-closed(remote)<\/code>\u00a0\u72b6\u6001<\/li>\n<li>\u4efb\u4e00\u7aef\u90fd\u53ef\u4ee5\u53d1\u9001 RST_STREAM \u5e27\uff0c\u8fd9\u4f1a\u4f7f\u6d41\u7acb\u5373\u8fdb\u5165\u00a0<code>closed<\/code>\u00a0\u72b6\u6001<\/li>\n<\/ul>\n<p>half-closed (local)<\/p>\n<p>\u6d41\u662f\u53cc\u5411\u7684\uff0c\u534a\u5173\u95ed\u8868\u793a\u8fd9\u4e2a\u6d41\u5355\u5411\u5173\u95ed\u4e86\uff0clocal \u4ee3\u8868\u672c\u7aef\u5230\u5bf9\u7aef\u7684\u65b9\u5411\u5173\u95ed\u4e86\uff0cremote \u4ee3\u8868\u5bf9\u7aef\u5230\u672c\u7aef\u7684\u65b9\u5411\u5173\u95ed\u4e86<\/p>\n<p>\u6b64\u72b6\u6001\u4e0b\u7684\u6d41\u4e0d\u80fd\u53d1\u9001 WINDOW_UPDATE\u3001PRIORITY\u3001RST_STREAM \u4ee5\u5916\u7684\u5e27<\/p>\n<p>\u5f53\u6b64\u72b6\u6001\u4e0b\u7684\u6d41\u6536\u5230\u5e26\u6709 END_STREAM \u6807\u8bc6\u7684\u5e27\u6216\u8005\u4efb\u4e00\u65b9\u53d1\u9001 RST_STREAM \u5e27\uff0c\u4f1a\u8f6c\u4e3a\u00a0<code>closed<\/code>\u00a0\u72b6\u6001<\/p>\n<p>\u6b64\u72b6\u6001\u4e0b\u7684\u6d41\u6536\u5230\u7684 PRIORITY \u5e27\u7528\u4ee5\u8c03\u6574\u6d41\u7684\u4f9d\u8d56\u5173\u7cfb\u987a\u5e8f\uff0c\u53ef\u4ee5\u770b\u4e0b\u6587\u7684\u6d41\u4f18\u5148\u7ea7<\/p>\n<p>half-closed (remote)<\/p>\n<p>\u6b64\u72b6\u6001\u4e0b\u7684\u6d41\u4e0d\u4f1a\u88ab\u5bf9\u7aef\u7528\u4e8e\u53d1\u9001\u5e27\uff0c\u6267\u884c\u6d41\u91cf\u63a7\u5236\u7684\u7aef\u70b9\u4e0d\u518d\u6709\u4e49\u52a1\u7ef4\u62a4\u63a5\u6536\u65b9\u7684\u6d41\u63a7\u5236\u7a97\u53e3\u3002<\/p>\n<p>\u4e00\u4e2a\u7aef\u70b9\u5728\u6b64\u72b6\u6001\u7684\u6d41\u4e0a\u63a5\u6536\u5230 WINDOW_UPDATE\u3001PRIORITY\u3001RST_STREAM \u4ee5\u5916\u7684\u5e27\uff0c\u5e94\u8be5\u54cd\u5e94\u4e00\u4e2a STREAM_CLOSED \u6d41\u9519\u8bef<\/p>\n<p>\u6b64\u72b6\u6001\u4e0b\u7684\u6d41\u53ef\u4ee5\u88ab\u7aef\u70b9\u7528\u4e8e\u53d1\u9001\u4efb\u610f\u7c7b\u578b\u7684\u5e27\uff0c\u4e14\u6b64\u72b6\u6001\u4e0b\u8be5\u7aef\u70b9\u4ecd\u4f1a\u89c2\u5bdf\u6d41\u7ea7\u522b\u7684\u6d41\u63a7\u5236\u7684\u9650\u5236<\/p>\n<p>\u5f53\u6b64\u72b6\u6001\u4e0b\u7684\u6d41\u53d1\u9001\u5e26\u6709 END_STREAM \u6807\u8bc6\u7684\u5e27\u6216\u8005\u4efb\u4e00\u65b9\u53d1\u9001 RST_STREAM \u5e27\uff0c\u4f1a\u8f6c\u4e3a\u00a0<code>closed<\/code>\u00a0\u72b6\u6001<\/p>\n<p>closed<\/p>\n<p>\u4ee3\u8868\u6d41\u5df2\u5173\u95ed<\/p>\n<p>\u6b64\u72b6\u6001\u4e0b\u7684\u6d41\u4e0d\u80fd\u53d1\u9001 PRIORITY \u4ee5\u5916\u7684\u5e27\uff0c\u53d1\u9001 PRIORITY \u5e27\u662f\u8c03\u6574\u90a3\u4e9b\u4f9d\u8d56\u8fd9\u4e2a\u5df2\u5173\u95ed\u7684\u6d41\u7684\u6d41\u4f18\u5148\u7ea7\uff0c\u7aef\u70b9\u90fd\u5e94\u8be5\u5904\u7406 PRIORITY \u5e27\uff0c\u5c3d\u7ba1\u5982\u679c\u8be5\u6d41\u4ece\u4f9d\u8d56\u5173\u7cfb\u6811\u4e2d\u79fb\u9664\u4e86\u4e5f\u53ef\u4ee5\u5ffd\u7565\u4f18\u5148\u7ea7\u5e27<\/p>\n<p>\u6b64\u72b6\u6001\u4e0b\u5728\u6536\u5230\u5e26\u6709 END_STREAM \u6807\u8bc6\u7684 DATA \u6216 HEADERS \u5e27\u540e\u7684\u4e00\u5c0f\u6bb5\u65f6\u95f4\u5185 (period) \u4ecd\u53ef\u80fd\u63a5\u6536\u5230 WINDOW_UPDATE \u6216 RST_STREAM \u5e27\uff0c\u56e0\u4e3a\u5728\u8fdc\u7a0b\u5bf9\u7aef\u63a5\u6536\u5e76\u5904\u7406 RST_STREAM \u6216\u5e26\u6709 END_STREAM \u6807\u5fd7\u7684\u5e27\u4e4b\u524d\uff0c\u5b83\u53ef\u80fd\u4f1a\u53d1\u9001\u8fd9\u4e9b\u7c7b\u578b\u7684\u5e27\u3002\u4f46\u662f\u7aef\u70b9\u5fc5\u987b\u5ffd\u7565\u63a5\u6536\u5230\u7684 WINDOW_UPDATE \u6216 RST_STREAM<\/p>\n<p>\u5982\u679c\u4e00\u4e2a\u6d41\u53d1\u9001\u4e86 RST_STREAM \u5e27\u540e\u8f6c\u5165\u6b64\u72b6\u6001\uff0c\u800c\u5bf9\u7aef\u63a5\u6536\u5230 RST_STREAM \u5e27\u65f6\u53ef\u80fd\u5df2\u7ecf\u53d1\u9001\u4e86\u6216\u8005\u5904\u5728\u53d1\u9001\u961f\u5217\u4e2d\uff0c\u8fd9\u4e9b\u5e27\u662f\u4e0d\u53ef\u64a4\u9500\u7684\uff0c\u53d1\u9001 RST_STREAM \u5e27\u7684\u7aef\u70b9\u5fc5\u987b\u5ffd\u7565\u8fd9\u4e9b\u5e27\u3002<\/p>\n<p>\u4e00\u4e2a\u7aef\u70b9\u53ef\u4ee5\u9650\u5236 period \u7684\u957f\u77ed\uff0c\u5728 period \u5185\u63a5\u53d7\u7684\u5e27\u4f1a\u5ffd\u7565\uff0c\u8d85\u51fa period \u7684\u5e27\u88ab\u89c6\u4e3a\u9519\u8bef\u3002<\/p>\n<p>\u4e00\u4e2a\u7aef\u70b9\u53d1\u9001\u4e86 RST_STREAM \u5e27\u540e\u63a5\u6536\u5230\u6d41\u63a7\u5236\u5e27(\u6bd4\u5982 DATA)\uff0c\u4ecd\u4f1a\u8ba1\u5165\u6d41\u91cf\u7a97\u53e3\uff0c\u5373\u4f7f\u8fd9\u4e9b\u5e27\u4f1a\u88ab\u5ffd\u7565\uff0c\u56e0\u4e3a\u5bf9\u7aef\u80af\u5b9a\u662f\u5728\u63a5\u6536\u5230 RST_STREAM \u5e27\u524d\u53d1\u9001\u7684\u6d41\u63a7\u5236\u5e27\uff0c\u5bf9\u7aef\u4f1a\u8ba4\u4e3a\u6d41\u63a7\u5236\u5df2\u751f\u6548<\/p>\n<p>\u4e00\u4e2a\u7aef\u70b9\u53ef\u80fd\u4f1a\u5728\u53d1\u9001\u4e86 RST_STREAM \u5e27\u540e\u6536\u5230 PUSH_PROMISE \u5e27\uff0c\u5373\u4fbf\u9884\u793a\u7684\u6d41\u5df2\u7ecf\u88ab\u91cd\u7f6e (reset)\uff0cPUSH_PROMISE \u5e27\u4e5f\u80fd\u4f7f\u9884\u793a\u6d41\u53d8\u6210\u00a0<code>reserved<\/code>\u00a0\u72b6\u6001\u3002\u56e0\u6b64\uff0c\u9700\u8981 RST_STREAM \u6765\u5173\u95ed\u4e00\u4e2a\u4e0d\u60f3\u8981\u7684\u9884\u793a\u6d41\u3002<\/p>\n<blockquote><p>PRIORITY \u5e27\u53ef\u4ee5\u88ab\u4efb\u610f\u72b6\u6001\u7684\u6d41\u53d1\u9001\u548c\u63a5\u6536\uff0c\u672a\u77e5\u7c7b\u578b\u7684\u5e27\u4f1a\u88ab\u5ffd\u7565<\/p><\/blockquote>\n<p>\u6d41\u72b6\u6001\u7684\u8f6c\u6362<\/p>\n<p>\u4e0b\u9762\u770b\u4e24\u4e2a\u4f8b\u5b50\u6765\u7406\u89e3\u6d41\u72b6\u6001:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LWNlMGVlYTJiNGU5YmZjZDAucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvODY2L2Zvcm1hdC93ZWJw?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>(1)\u3001Server \u5728 Client \u53d1\u8d77\u7684\u4e00\u4e2a\u6d41\u4e0a\u53d1\u9001 PUSH_PROMISE \u5e27\uff0c\u5176 Promised Stream ID \u6307\u5b9a\u4e00\u4e2a\u9884\u793a\u6d41\u7528\u4e8e\u540e\u7eed\u63a8\u9001\uff0csend PP \u540e\u8fd9\u4e2a\u9884\u793a\u6d41\u5728\u670d\u52a1\u7aef\u4ece idle \u72b6\u6001\u8f6c\u4e3a reserve(local) \u72b6\u6001\uff0c\u5ba2\u6237\u7aef recv PP \u540e\u8fd9\u4e2a\u6d41\u4ece idle \u72b6\u6001\u8f6c\u4e3a reserve(remote) \u72b6\u6001<\/p>\n<p>(2)(3)\u3001\u6b64\u65f6\u9884\u793a\u6d41\u5904\u4e8e\u4fdd\u7559\u72b6\u6001\uff0c\u5ba2\u6237\u7aef\u5982\u679c\u9009\u62e9\u62d2\u7edd\u63a5\u53d7\u63a8\u9001\uff0c\u53ef\u4ee5\u53d1\u9001 RST \u5e27\u5173\u95ed\u8fd9\u4e2a\u6d41\uff1b\u670d\u52a1\u7aef\u5982\u679c\u6b64\u65f6\u51fa\u95ee\u9898\u4e86\u4e5f\u53ef\u4ee5\u53d1\u9001 RST \u5e27\u53d6\u6d88\u63a8\u9001\u3002\u4e0d\u7ba1\u54ea\u4e00\u65b9\u53d1\u9001\u6216\u63a5\u6536\u5230 RST\uff0c\u6b64\u72b6\u6001\u90fd\u8f6c\u4e3a closed<\/p>\n<p>(4)\u3001\u6ca1\u6709\u51fa\u73b0\u91cd\u7f6e\u8bf4\u660e\u63a8\u9001\u4ecd\u6709\u6548\uff0c\u5219\u670d\u52a1\u7aef\u5f00\u59cb\u63a8\u9001\uff0c\u9996\u5148\u53d1\u9001\u7684\u80af\u5b9a\u662f\u54cd\u5e94\u7684 HEADERS \u9996\u90e8\u5757\uff0c\u6b64\u65f6\u6d41\u72b6\u6001\u8f6c\u4e3a\u534a\u5173\u95ed half-closed(remote)\uff1b\u5ba2\u6237\u7aef\u63a5\u6536\u5230 HEADERS \u540e\u6d41\u72b6\u6001\u8f6c\u4e3a\u534a\u5173\u95ed half-closed(local)<\/p>\n<p>(5)(6)\u3001\u534a\u5173\u95ed\u72b6\u6001\u4e0b\u7684\u6d41\u5e94\u8be5\u8fd8\u4f1a\u7ee7\u7eed\u63a8\u9001\u8bf8\u5982 DATA \u5e27\u3001CONTINUATION \u5e27\u8fd9\u6837\u7684\u6570\u636e\u5e27\uff0c\u5982\u679c\u8fd9\u4e2a\u8fc7\u7a0b\u78b0\u5230\u4efb\u4e00\u65b9\u53d1\u8d77\u91cd\u7f6e\uff0c\u5219\u6d41\u4f1a\u5173\u95ed\u8fdb\u5165 closed \u72b6\u6001<\/p>\n<p>(7)\u3001\u5982\u679c\u4e00\u5207\u987a\u5229\uff0c\u8d44\u6e90\u968f\u7740\u6570\u636e\u5e27\u54cd\u5e94\u5b8c\u6bd5\uff0c\u6700\u540e\u4e00\u5e27\u4f1a\u5e26\u4e0a END_STREAM \u6807\u8bc6\u4ee3\u8868\u8fd9\u4e2a\u6d41\u7ed3\u675f\u4e86\uff0c\u6b64\u65f6\u6d41\u8f6c\u4e3a closed \u72b6\u6001<\/p>\n<p>image<\/p>\n<p>(1)\u3001\u5ba2\u6237\u7aef\u53d1\u8d77\u8bf7\u6c42\uff0c\u9996\u5148\u53d1\u9001\u4e00\u4e2a HEADERS \u5e27\uff0c\u5176 Stream Identifier \u521b\u5efa\u4e00\u4e2a\u65b0\u6d41\uff0c\u6b64\u6d41\u4ece idle \u72b6\u6001\u8f6c\u4e3a open \u72b6\u6001<\/p>\n<p>(2)(3)\u3001\u5982\u679c\u5ba2\u6237\u7aef\u53d6\u6d88\u8bf7\u6c42\u53ef\u4ee5\u53d1\u9001 RST \u5e27\uff0c\u670d\u52a1\u7aef\u51fa\u9519\u4e5f\u53ef\u4ee5\u53d1\u9001 RST \u5e27\uff0c\u4e0d\u7ba1\u54ea\u4e00\u65b9\u63a5\u6536\u6216\u53d1\u9001 RST\uff0c\u6d41\u5173\u95ed\u8fdb\u5165 closed \u72b6\u6001\uff1b<\/p>\n<p>(4)\u3001\u5982\u679c\u8bf7\u6c42\u7ed3\u675f(END_STREAM)\uff0c\u6d41\u8f6c\u4e3a\u534a\u5173\u95ed\u72b6\u6001\u3002\u5047\u5982\u662f GET \u8bf7\u6c42\uff0c\u4e00\u822c HEADERS \u5e27\u5c31\u662f\u6700\u540e\u4e00\u5e27\uff0csend H \u540e\u6d41\u4f1a\u7acb\u5373\u8fdb\u5165\u534a\u5173\u95ed\u72b6\u6001\u3002\u5047\u5982\u662f POST \u8bf7\u6c42\uff0c\u5f85\u6570\u636e\u4f20\u5b8c\uff0c\u6700\u540e\u4e00\u5e27\u5e26\u4e0a END_STREAM \u6807\u8bc6\uff0c\u6d41\u8f6c\u4e3a\u534a\u5173\u95ed<\/p>\n<p>(5)(6)\u3001\u5ba2\u6237\u7aef\u534a\u5173\u95ed\u540e\u670d\u52a1\u7aef\u5f00\u59cb\u8fd4\u56de\u54cd\u5e94\uff0c\u6b64\u65f6\u4efb\u4e00\u65b9\u63a5\u6536\u6216\u53d1\u9001 RST\uff0c\u6d41\u5173\u95ed\uff1b<\/p>\n<p>(7)\u3001\u5982\u679c\u4e00\u5207\u987a\u5229\uff0c\u7b49\u5f85\u54cd\u5e94\u7ed3\u675f(END_STREAM)\uff0c\u6d41\u5173\u95ed<\/p>\n<p>\u6d41\u7684\u6807\u8bc6\u7b26<\/p>\n<p>\u6d41 ID \u662f 31 \u4f4d\u65e0\u7b26\u53f7\u6574\u6570\uff0c\u5ba2\u6237\u7aef\u53d1\u8d77\u7684\u6d41\u5fc5\u987b\u662f\u5947\u6570\uff0c\u670d\u52a1\u7aef\u53d1\u8d77\u7684\u6d41\u5fc5\u987b\u662f\u5076\u6570\uff0c0x0 \u4fdd\u7559\u4e3a\u8fde\u63a5\u63a7\u5236\u6d88\u606f\u4e0d\u80fd\u7528\u4e8e\u5efa\u7acb\u65b0\u6d41\u3002<\/p>\n<p>HTTP\/1.1 Upgrade to HTTP\/2 \u65f6\u54cd\u5e94\u7684\u6d41 ID \u662f 0x1\uff0c\u5728\u5347\u7ea7\u5b8c\u6210\u4e4b\u540e\uff0c\u6d41 0x1 \u5728\u5ba2\u6237\u7aef\u4f1a\u8f6c\u4e3a\u00a0<code>half-closed (local)<\/code>\u00a0\u72b6\u6001\uff0c\u56e0\u6b64\u8fd9\u79cd\u60c5\u51b5\u4e0b\u5ba2\u6237\u7aef\u4e0d\u80fd\u7528 0x1 \u521d\u59cb\u5316\u4e00\u4e2a\u6d41<\/p>\n<p>\u65b0\u5efa\u7acb\u7684\u6d41\u7684 ID \u5fc5\u987b\u5927\u4e8e\u6240\u6709\u5df2\u4f7f\u7528\u8fc7\u7684\u6570\u5b57\uff0c\u63a5\u6536\u5230\u4e00\u4e2a\u9519\u8bef\u5927\u5c0f\u7684 ID \u5e94\u8be5\u8fd4\u56de PROTOCOL_ERROR \u54cd\u5e94<\/p>\n<p>\u4f7f\u7528\u4e00\u4e2a\u65b0\u6d41\u65f6\u9690\u5f0f\u5730\u5173\u95ed\u4e86\u5bf9\u7aef\u53d1\u8d77\u7684 ID \u5c0f\u4e8e\u5f53\u524d\u6d41\u7684\u4e14\u5904\u4e8e\u00a0<code>idle<\/code>\u00a0\u72b6\u6001\u7684\u6d41\uff0c\u6bd4\u5982\u4e00\u4e2a\u6d41\u53d1\u9001\u4e00\u4e2a HEADERS \u5e27\u6253\u5f00\u4e86 ID \u4e3a 7 \u7684\u6d41\uff0c\u4f46\u8fd8\u4ece\u672a\u5411 ID \u4e3a 5 \u7684\u6d41\u53d1\u9001\u8fc7\u5e27\uff0c\u5219\u6d41 0x5 \u4f1a\u5728 0x7 \u53d1\u9001\u5b8c\u6216\u63a5\u6536\u5b8c\u7b2c\u4e00\u5e27\u540e\u8f6c\u4e3a\u00a0<code>closed<\/code>\u00a0\u72b6\u6001<\/p>\n<p>\u4e00\u4e2a\u8fde\u63a5\u5185\u7684\u6d41 ID \u4e0d\u80fd\u91cd\u7528<\/p>\n<p>\u6d41\u7684\u4f18\u5148\u7ea7<\/p>\n<p>\u5ba2\u6237\u7aef\u53ef\u4ee5\u901a\u8fc7 HEADERS \u5e27\u7684 PRIORITY \u4fe1\u606f\u6307\u5b9a\u4e00\u4e2a\u65b0\u5efa\u7acb\u6d41\u7684\u4f18\u5148\u7ea7\uff0c\u5176\u4ed6\u671f\u95f4\u4e5f\u53ef\u4ee5\u53d1\u9001 PRIORITY \u5e27\u8c03\u6574\u6d41\u4f18\u5148\u7ea7<\/p>\n<p>\u8bbe\u7f6e\u4f18\u5148\u7ea7\u7684\u76ee\u7684\u662f\u4e3a\u4e86\u8ba9\u7aef\u70b9\u8868\u8fbe\u5b83\u6240\u671f\u671b\u5bf9\u7aef\u5728\u5e76\u53d1\u7684\u591a\u4e2a\u6d41\u4e4b\u95f4\u5982\u4f55\u5206\u914d\u8d44\u6e90\u7684\u884c\u4e3a\u3002\u66f4\u91cd\u8981\u7684\u662f\uff0c\u5f53\u53d1\u9001\u5bb9\u91cf\u6709\u9650\u65f6\uff0c\u53ef\u4ee5\u4f7f\u7528\u4f18\u5148\u7ea7\u6765\u9009\u62e9\u7528\u4e8e\u53d1\u9001\u5e27\u7684\u6d41\u3002<\/p>\n<p>\u6d41\u53ef\u4ee5\u88ab\u6807\u8bb0\u4e3a\u4f9d\u8d56\u5176\u4ed6\u6d41\uff0c\u6240\u4f9d\u8d56\u7684\u6d41\u5b8c\u6210\u540e\u518d\u5904\u7406\u5f53\u524d\u6d41\u3002\u6bcf\u4e2a\u4f9d\u8d56 (dependency) \u540e\u90fd\u8ddf\u7740\u4e00\u4e2a\u6743\u91cd (weight)\uff0c\u8fd9\u4e00\u6570\u5b57\u662f\u7528\u6765\u786e\u5b9a\u4f9d\u8d56\u4e8e\u76f8\u540c\u7684\u6d41\u7684\u53ef\u5206\u914d\u53ef\u7528\u8d44\u6e90\u7684\u76f8\u5bf9\u6bd4\u4f8b<\/p>\n<p>\u6d41\u4f9d\u8d56(Stream Dependencies)<\/p>\n<p>\u6bcf\u4e2a\u6d41\u90fd\u53ef\u4ee5\u663e\u793a\u5730\u4f9d\u8d56\u53e6\u4e00\u4e2a\u6d41\uff0c\u5305\u542b\u4f9d\u8d56\u5173\u7cfb\u8868\u793a\u4f18\u5148\u5c06\u8d44\u6e90\u5206\u914d\u7ed9\u6307\u5b9a\u7684\u6d41(\u4e0a\u5c42\u8282\u70b9)\u800c\u4e0d\u662f\u4f9d\u8d56\u6d41<\/p>\n<p>\u4e00\u4e2a\u4e0d\u4f9d\u8d56\u4e8e\u5176\u4ed6\u6d41\u7684\u6d41\u4f1a\u6307\u5b9a stream dependency \u4e3a 0x0 \u503c\uff0c\u56e0\u4e3a\u4e0d\u5b58\u5728\u7684 0x0 \u6d41\u4ee3\u8868\u4f9d\u8d56\u6811\u7684\u6839<\/p>\n<p>\u4e00\u4e2a\u4f9d\u8d56\u4e8e\u5176\u4ed6\u6d41\u7684\u6d41\u53eb\u505a<strong>\u4f9d\u8d56\u6d41<\/strong>\uff0c\u88ab\u4f9d\u8d56\u7684\u6d41\u662f\u5f53\u524d\u6d41\u7684\u7236\u7ea7\u3002\u5982\u679c\u88ab\u4f9d\u8d56\u7684\u6d41\u4e0d\u5728\u5f53\u524d\u4f9d\u8d56\u6811\u4e2d(\u6bd4\u5982\u72b6\u6001\u4e3a\u00a0<code>idle<\/code>\u00a0\u7684\u6d41)\uff0c\u88ab\u4f9d\u8d56\u7684\u6d41\u4f1a\u4f7f\u7528\u4e00\u4e2a\u9ed8\u8ba4\u4f18\u5148\u7ea7<\/p>\n<p>\u5f53\u4f9d\u8d56\u4e00\u4e2a\u6d41\u65f6\uff0c\u8be5\u6d41\u4f1a\u6dfb\u52a0\u8fdb\u7236\u7ea7\u7684\u4f9d\u8d56\u5173\u7cfb\u4e2d\uff0c\u5171\u4eab\u76f8\u540c\u7236\u7ea7\u7684\u4f9d\u8d56\u6d41\u4e0d\u4f1a\u76f8\u5bf9\u4e8e\u5f7c\u6b64\u8fdb\u884c\u6392\u5e8f\uff0c\u6bd4\u5982 B \u548c C \u4f9d\u8d56 A\uff0c\u65b0\u6dfb\u52a0\u4e00\u4e2a\u4f9d\u8d56\u6d41 D\uff0cBCD \u7684\u987a\u5e8f\u662f\u4e0d\u56fa\u5b9a\u7684:<\/p>\n<pre><code class=\"hljs language-crystal\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">A A<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-regexp\">\/ \\ ==&gt; \/<\/span>|\\<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">B C B D C<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-crystal\"><\/code><\/pre>\n<p>\u72ec\u5360\u6807\u8bc6 (exclusive) \u5141\u8bb8\u63d2\u5165\u4e00\u4e2a\u65b0\u5c42\u7ea7(\u65b0\u7684\u4f9d\u8d56\u5173\u7cfb)\uff0c\u72ec\u5360\u6807\u8bc6\u5bfc\u81f4\u8be5\u6d41\u6210\u4e3a\u7236\u7ea7\u7684\u552f\u4e00\u4f9d\u8d56\u6d41\uff0c\u800c\u5176\u4ed6\u4f9d\u8d56\u6d41\u53d8\u4e3a\u5176\u5b50\u7ea7\uff0c\u6bd4\u5982\u540c\u6837\u63d2\u5165\u4e00\u4e2a\u65b0\u4f9d\u8d56\u6d41 E (\u5e26\u6709 exclusive):<\/p>\n<pre><code class=\"hljs language-crystal\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">A<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">A |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-regexp\">\/|\\ ==&gt; E<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-regexp\"> B D C \/<\/span>|\\<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">B D C<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-crystal\"><\/code><\/pre>\n<p>\u5728\u4f9d\u8d56\u5173\u7cfb\u6811\u4e2d\uff0c\u53ea\u6709\u5f53\u4e00\u4e2a\u4f9d\u8d56\u6d41\u6240\u4f9d\u8d56\u7684\u6240\u6709\u6d41(\u7236\u7ea7\u6700\u9ad8\u4e3a 0x0 \u7684\u94fe)\u88ab\u5173\u95ed\u6216\u8005\u65e0\u6cd5\u7ee7\u7eed\u5728\u4e0a\u9762\u6267\u884c\uff0c\u8fd9\u4e2a\u4f9d\u8d56\u6d41\u624d\u5e94\u8be5\u88ab\u5206\u914d\u8d44\u6e90<\/p>\n<p>\u4f9d\u8d56\u6743\u91cd<\/p>\n<p>\u6240\u6709\u4f9d\u8d56\u6d41\u90fd\u4f1a\u5206\u914d\u4e00\u4e2a 1~256 \u6743\u91cd\u503c<\/p>\n<p>\u76f8\u540c\u7236\u7ea7\u7684\u4f9d\u8d56\u6d41\u6309\u6743\u91cd\u6bd4\u4f8b\u5206\u914d\u8d44\u6e90\uff0c\u6bd4\u5982\u6d41 B \u4f9d\u8d56\u4e8e A \u4e14\u6743\u91cd\u503c\u4e3a 4\uff0c\u6d41 C \u4f9d\u8d56\u4e8e A \u4e14\u6743\u91cd\u503c\u4e3a 12\uff0c\u5f53 A \u4e0d\u518d\u6267\u884c\u65f6\uff0cB \u7406\u8bba\u4e0a\u80fd\u5206\u914d\u7684\u8d44\u6e90\u53ea\u6709 C \u7684\u4e09\u5206\u4e4b\u4e00<\/p>\n<p>\u4f18\u5148\u7ea7\u8c03\u6574 (Reprioritization)<\/p>\n<p>\u4f7f\u7528 PRIORITY \u5e27\u53ef\u4ee5\u8c03\u6574\u6d41\u4f18\u5148\u7ea7<\/p>\n<p>PRIORITY \u5e27\u5185\u5bb9\u4e0e HEADERS \u5e27\u7684\u4f18\u5148\u7ea7\u6a21\u5757\u76f8\u540c:<\/p>\n<pre><code class=\"hljs language-sql\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-operator\">&#8211;<\/span><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span>E<span class=\"hljs-operator\">|<\/span> Stream Dependency (<span class=\"hljs-number\">31<\/span>) <span class=\"hljs-operator\">|<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-operator\">&#8211;<\/span><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span> Weight (<span class=\"hljs-number\">8<\/span>) <span class=\"hljs-operator\">|<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-operator\">&#8211;<\/span><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;-+<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-sql\"><\/code><\/pre>\n<ul>\n<li>\u5982\u679c\u7236\u7ea7\u91cd\u65b0\u8bbe\u7f6e\u4e86\u4f18\u5148\u7ea7\uff0c\u5219\u4f9d\u8d56\u6d41\u4f1a\u968f\u5176\u7236\u7ea7\u6d41\u4e00\u8d77\u79fb\u52a8\u3002\u82e5\u8c03\u6574\u4f18\u5148\u7ea7\u7684\u6d41\u5e26\u6709\u72ec\u5360\u6807\u8bc6\uff0c\u4f1a\u5bfc\u81f4\u65b0\u7684\u7236\u6d41\u7684\u6240\u6709\u5b50\u7ea7\u4f9d\u8d56\u4e8e\u8fd9\u4e2a\u6d41<\/li>\n<li>\u5982\u679c\u4e00\u4e2a\u6d41\u8c03\u6574\u4e3a\u4f9d\u8d56\u81ea\u5df1\u7684\u4e00\u4e2a\u5b50\u7ea7\uff0c\u5219\u8fd9\u4e2a\u5c06\u88ab\u4f9d\u8d56\u7684\u5b50\u7ea7\u9996\u5148\u79fb\u81f3\u8c03\u6574\u6d41\u7684\u7236\u7ea7\u4e4b\u4e0b(\u5373\u540c\u4e00\u5c42)\uff0c\u518d\u79fb\u52a8\u90a3\u4e2a\u8c03\u6574\u6d41\u7684\u6574\u68f5\u5b50\u6811\uff0c\u79fb\u52a8\u7684\u4f9d\u8d56\u5173\u7cfb\u4fdd\u6301\u5176\u6743\u91cd<\/li>\n<\/ul>\n<p>\u770b\u4e0b\u9762\u8fd9\u4e2a\u4f8b\u5b50: \u7b2c\u4e00\u4e2a\u56fe\u662f\u521d\u59cb\u5173\u7cfb\u6811\uff0c\u73b0\u5728 A \u8981\u8c03\u6574\u4e3a\u4f9d\u8d56 D\uff0c\u6839\u636e\u7b2c\u4e8c\u70b9\uff0c\u73b0\u5c06 D \u79fb\u81f3 x \u4e4b\u4e0b\uff0c\u518d\u628a A \u8c03\u6574\u4e3a D \u7684\u5b50\u6811(\u56fe 3)\uff0c\u5982\u679c A \u8c03\u6574\u65f6\u5e26\u6709\u72ec\u5360\u6807\u8bc6\u6839\u636e\u7b2c\u4e00\u70b9 F \u4e5f\u5f52\u4e3a A \u5b50\u7ea7(\u56fe 4)<\/p>\n<pre><code class=\"hljs language-javascript\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">x x x x<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| \/ \\ | |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">A D A D D<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">\/ \\ \/ <span class=\"hljs-regexp\">\/ \\ \/<\/span> \\ |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">B C ==&gt; F B C ==&gt; F A <span class=\"hljs-variable constant_\">OR<\/span> A<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">\/ \\ | <span class=\"hljs-regexp\">\/ \\ \/<\/span>|\\<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">D E E B C B C F<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| | |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">F E E<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"10\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">(intermediate) (non-exclusive) (exclusive)<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-javascript\"><\/code><\/pre>\n<p>\u6d41\u4f18\u5148\u7ea7\u7684\u72b6\u6001\u7ba1\u7406<\/p>\n<p>\u5f53\u4e00\u4e2a\u6d41\u4ece\u4f9d\u8d56\u6811\u4e2d\u79fb\u9664\uff0c\u5b83\u7684\u5b50\u7ea7\u53ef\u4ee5\u8c03\u6574\u4e3a\u4f9d\u8d56\u88ab\u5173\u95ed\u6d41\u7684\u7236\u7ea7(\u5e94\u8be5\u5c31\u662f\u8fde\u63a5\u4e0a\u4e00\u5c42\u8282\u70b9)\uff0c\u65b0\u7684\u4f9d\u8d56\u6743\u91cd\u5c06\u6839\u636e\u5173\u95ed\u6d41\u7684\u6743\u91cd\u4ee5\u53ca\u6d41\u81ea\u8eab\u7684\u6743\u91cd\u91cd\u65b0\u8ba1\u7b97\u3002<\/p>\n<p>\u4ece\u4f9d\u8d56\u6811\u4e2d\u79fb\u9664\u6d41\u4f1a\u5bfc\u81f4\u67d0\u4e9b\u4f18\u5148\u7ea7\u4fe1\u606f\u4e22\u5931\u3002\u8d44\u6e90\u5728\u5177\u6709\u76f8\u540c\u7236\u7ea7\u7684\u6d41\u4e4b\u95f4\u5171\u4eab\uff0c\u8fd9\u610f\u5473\u7740\u5982\u679c\u8fd9\u4e2a\u96c6\u5408\u4e2d\u7684\u67d0\u4e2a\u6d41\u5173\u95ed\u6216\u8005\u963b\u585e\uff0c\u4efb\u4f55\u7a7a\u95f2\u5bb9\u91cf\u5c06\u5206\u914d\u7ed9\u6700\u8fd1\u7684\u76f8\u90bb\u6d41\u3002\u7136\u800c\uff0c\u5982\u679c\u6b64\u96c6\u5408\u7684\u5171\u6709\u4f9d\u8d56(\u5373\u7236\u7ea7\u8282\u70b9)\u4ece\u6811\u4e2d\u79fb\u9664\uff0c\u8fd9\u4e9b\u5b50\u6d41\u5c06\u4e0e\u66f4\u4e0a\u4e00\u5c42\u7684\u6d41\u5171\u4eab\u8d44\u6e90<\/p>\n<p>\u4e00\u4e2a\u4f8b\u5b50: \u6d41 A \u548c\u6d41 B \u4f9d\u8d56\u76f8\u540c\u7236\u7ea7\u8282\u70b9\uff0c\u800c\u6d41 C \u548c\u6d41 D \u90fd\u4f9d\u8d56 A\uff0c\u5728\u79fb\u9664\u6d41 A \u4e4b\u524d\u7684\u4e00\u6bb5\u65f6\u95f4\u5185\uff0cA \u548c D \u90fd\u65e0\u6cd5\u6267\u884c(\u53ef\u80fd\u4efb\u52a1\u963b\u585e\u4e86)\uff0c\u5219 C \u4f1a\u5206\u914d\u5230 A \u7684\u6240\u6709\u8d44\u6e90\uff1b<br \/>\n\u5982\u679c A \u88ab\u79fb\u9664\u51fa\u6811\u4e86\uff0cA \u7684\u6743\u91cd\u6309\u6bd4\u91cd\u65b0\u8ba1\u7b97\u5206\u914d\u7ed9 C \u548c D\uff0c\u6b64\u65f6 D \u4ecd\u65e7\u963b\u585e\uff0cC \u5206\u914d\u7684\u8d44\u6e90\u76f8\u8f83\u4e4b\u524d\u53d8\u5c11\u4e86\u3002\u5bf9\u4e8e\u540c\u7b49\u7684\u521d\u59cb\u6743\u91cd\uff0cC \u83b7\u53d6\u5230\u7684\u53ef\u7528\u8d44\u6e90\u662f\u4e09\u5206\u4e4b\u4e00\u800c\u4e0d\u662f\u4e8c\u5206\u4e4b\u4e00(\u4e3a\u4ec0\u4e48\u662f\u4e09\u5206\u4e4b\u4e00?\u6587\u6863\u4e2d\u6ca1\u6709\u8bf4\u660e\u7ec6\u8282\uff0c\u6743\u91cd\u5982\u4f55\u91cd\u65b0\u5206\u914d\u4e5f\u4e0d\u592a\u6e05\u695a\uff0c\u4e0b\u9762\u662f\u6309\u6211\u7684\u7406\u89e3\u89e3\u91ca\u7684)<\/p>\n<p>X \u7684\u8d44\u6e90\u4e3a 1\uff0cABCD \u521d\u59cb\u6743\u91cd\u5747\u4e3a 16\uff0c*\u53f7\u4ee3\u8868\u8282\u70b9\u5f53\u524d\u4e0d\u53ef\u7528\uff0c\u56fe\u4e00\u4e2d C \u548c B \u5404\u5360\u4e00\u534a\u8d44\u6e90\uff0c\u800c A \u79fb\u9664\u540e CD \u7684\u6743\u91cd\u91cd\u65b0\u5206\u914d\u53d8\u4e3a 8\uff0c\u6240\u4ee5\u56fe\u4e8c\u4e2d C \u548c B \u5360\u6bd4\u53d8\u4e3a 1:2\uff0cR(C) \u53d8\u4e3a 1\/3<\/p>\n<pre><code class=\"hljs language-crystal\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">X(<span class=\"hljs-symbol\">v:<\/span><span class=\"hljs-number\">1.0<\/span>) X(<span class=\"hljs-symbol\">v:<\/span><span class=\"hljs-number\">1.0<\/span>)<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-regexp\">\/ \\ \/<\/span>|\\<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-regexp\">\/ \\ \/<\/span> | \\<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">*A B ==&gt; <span class=\"hljs-regexp\">\/ | \\<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-regexp\"> (w:16) (w:16) \/<\/span> | \\<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-regexp\">\/ \\ C *D B<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-regexp\"> \/<\/span> \\ (<span class=\"hljs-symbol\">w:<\/span><span class=\"hljs-number\">8<\/span>)(<span class=\"hljs-symbol\">w:<\/span><span class=\"hljs-number\">8<\/span>)(<span class=\"hljs-symbol\">w:<\/span><span class=\"hljs-number\">16<\/span>)<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">C *D<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">(<span class=\"hljs-symbol\">w:<\/span><span class=\"hljs-number\">16<\/span>) (<span class=\"hljs-symbol\">w:<\/span><span class=\"hljs-number\">16<\/span>)<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"10\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"11\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"12\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">R(C)=<span class=\"hljs-number\">16<\/span>\/(<span class=\"hljs-number\">16<\/span>+<span class=\"hljs-number\">16<\/span>)=<span class=\"hljs-number\">1<\/span>\/<span class=\"hljs-number\">2<\/span> ==&gt; R(C)=<span class=\"hljs-number\">8<\/span>\/(<span class=\"hljs-number\">8<\/span>+<span class=\"hljs-number\">16<\/span>)=<span class=\"hljs-number\">1<\/span>\/<span class=\"hljs-number\">3<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-crystal\"><\/code><\/pre>\n<p>\u53ef\u80fd\u5411\u4e00\u4e2a\u6d41\u521b\u5efa\u4f9d\u8d56\u5173\u7cfb\u7684\u4f18\u5148\u7ea7\u4fe1\u606f\u8fd8\u5728\u4f20\u8f93\u4e2d\uff0c\u90a3\u4e2a\u6d41\u5c31\u5df2\u7ecf\u5173\u95ed\u4e86\u3002\u5982\u679c\u4e00\u4e2a\u4f9d\u8d56\u6d41\u7684\u4f9d\u8d56\u6307\u5411\u6ca1\u6709\u76f8\u5173\u4f18\u5148\u7ea7\u4fe1\u606f(\u5373\u7236\u8282\u70b9\u65e0\u6548)\uff0c\u5219\u8fd9\u4e2a\u4f9d\u8d56\u6d41\u4f1a\u5206\u914d\u9ed8\u8ba4\u4f18\u5148\u7ea7\uff0c\u8fd9\u53ef\u80fd\u4f1a\u9020\u6210\u4e0d\u7406\u60f3\u7684\u4f18\u5148\u7ea7\uff0c\u56e0\u4e3a\u7ed9\u6d41\u5206\u914d\u4e86\u4e0d\u5728\u9884\u671f\u7684\u4f18\u5148\u7ea7\u3002<\/p>\n<p>\u4e3a\u4e86\u907f\u514d\u4e0a\u8ff0\u95ee\u9898\uff0c\u4e00\u4e2a\u7aef\u70b9\u5e94\u8be5\u5728\u6d41\u5173\u95ed\u540e\u7684\u4e00\u6bb5\u65f6\u95f4\u5185\u4fdd\u7559\u6d41\u7684\u4f18\u5148\u7ea7\u8c03\u6574\u72b6\u6001\u4fe1\u606f\uff0c\u6b64\u72b6\u6001\u4fdd\u7559\u65f6\u95f4\u8d8a\u957f\uff0c\u6d41\u88ab\u5206\u914d\u9519\u8bef\u7684\u6216\u8005\u9ed8\u8ba4\u7684\u4f18\u5148\u7ea7\u53ef\u80fd\u6027\u8d8a\u4f4e\u3002<\/p>\n<p>\u7c7b\u4f3c\u5730\uff0c\u5904\u4e8e\u201c\u7a7a\u95f2\u201d\u72b6\u6001\u7684\u6d41\u53ef\u4ee5\u88ab\u5206\u914d\u4f18\u5148\u7ea7\u6216\u6210\u4e3a\u5176\u4ed6\u6d41\u7684\u7236\u8282\u70b9\u3002\u8fd9\u5141\u8bb8\u5728\u4f9d\u8d56\u5173\u7cfb\u6811\u4e2d\u521b\u5efa\u5206\u7ec4\u8282\u70b9\uff0c\u4ece\u800c\u5b9e\u73b0\u66f4\u7075\u6d3b\u7684\u4f18\u5148\u7ea7\u8868\u8fbe\u5f0f\u3002\u7a7a\u95f2\u6d41\u4ee5\u9ed8\u8ba4\u4f18\u5148\u7ea7\u5f00\u59cb<\/p>\n<p>\u6d41\u4f18\u5148\u7ea7\u72b6\u6001\u4fe1\u606f\u7684\u4fdd\u7559\u53ef\u80fd\u589e\u52a0\u7ec8\u7aef\u7684\u8d1f\u62c5\uff0c\u56e0\u6b64\u8fd9\u79cd\u72b6\u6001\u53ef\u4ee5\u88ab\u9650\u5236\u3002\u7ec8\u7aef\u53ef\u80fd\u6839\u636e\u8d1f\u8377\u6765\u51b3\u5b9a\u4fdd\u7559\u7684\u989d\u5916\u7684\u72b6\u6001\u7684\u6570\u76ee\uff1b\u5728\u9ad8\u8d1f\u8377\u4e0b\uff0c\u53ef\u4ee5\u4e22\u5f03\u989d\u5916\u7684\u4f18\u5148\u7ea7\u72b6\u6001\u6765\u9650\u5236\u8d44\u6e90\u7684\u4efb\u52a1\u3002\u5728\u6781\u7aef\u60c5\u51b5\u4e0b\uff0c\u7ec8\u7aef\u751a\u81f3\u53ef\u4ee5\u4e22\u5f03\u6fc0\u6d3b\u6216\u8005\u4fdd\u7559\u72b6\u6001\u6d41\u7684\u4f18\u5148\u7ea7\u4fe1\u606f\u3002\u5982\u679c\u4f7f\u7528\u4e86\u56fa\u5b9a\u7684\u9650\u5236\uff0c\u7ec8\u7aef\u5e94\u5f53\u81f3\u5c11\u4fdd\u7559\u8ddf SETTINGS_MAX_CONCURRENT_STREAMS \u8bbe\u7f6e\u4e00\u6837\u5927\u5c0f\u7684\u6d41\u72b6\u6001<\/p>\n<p>\u9ed8\u8ba4\u4f18\u5148\u7ea7<\/p>\n<p>\u6240\u6709\u6d41\u90fd\u662f\u521d\u59cb\u4e3a\u975e\u72ec\u5360\u5730\u4f9d\u8d56\u4e8e\u6d41 0x0\u3002<\/p>\n<p>Pushed \u6d41\u521d\u59cb\u4f9d\u8d56\u4e8e\u76f8\u5173\u7684\u6d41(\u89c1 Server-Push)\u3002<\/p>\n<p>\u4ee5\u4e0a\u4e24\u79cd\u60c5\u51b5\uff0c\u6d41\u7684\u6743\u91cd\u90fd\u6307\u5b9a\u4e3a 16\u3002<\/p>\n<h3><a name=\"t6\"><\/a>Server-Push<\/h3>\n<p>PUSH_PROMISE \u5e27\u683c\u5f0f<\/p>\n<pre><code class=\"hljs language-sql\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span>Pad Length? (<span class=\"hljs-number\">8<\/span>)<span class=\"hljs-operator\">|<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-operator\">&#8211;<\/span><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span>R<span class=\"hljs-operator\">|<\/span> Promised Stream ID (<span class=\"hljs-number\">31<\/span>) <span class=\"hljs-operator\">|<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-operator\">&#8211;<\/span><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span> Header Block Fragment (<span class=\"hljs-operator\">*<\/span>) &#8230;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span> Padding (<span class=\"hljs-operator\">*<\/span>) &#8230;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-sql\"><\/code><\/pre>\n<ul>\n<li><code>Pad Length<\/code>: \u6307\u5b9a Padding \u957f\u5ea6\uff0c\u5b58\u5728\u5219\u4ee3\u8868 PADDING flag \u88ab\u8bbe\u7f6e<\/li>\n<li><code>R<\/code>: \u4fdd\u7559\u76841bit\u4f4d<\/li>\n<li><code>Promised Stream ID<\/code>: 31 \u4f4d\u7684\u65e0\u7b26\u53f7\u6574\u6570\uff0c\u4ee3\u8868 PUSH_PROMISE \u5e27\u4fdd\u7559\u7684\u6d41\uff0c\u5bf9\u4e8e\u53d1\u9001\u8005\u6765\u8bf4\u8be5\u6d41\u6807\u8bc6\u7b26\u5fc5\u987b\u662f\u53ef\u7528\u4e8e\u4e0b\u4e00\u4e2a\u6d41\u7684\u6709\u6548\u503c<\/li>\n<li><code>Header Block Fragment<\/code>: \u5305\u542b\u8bf7\u6c42\u9996\u90e8\u57df\u7684\u9996\u90e8\u5757\u7247\u6bb5<\/li>\n<li><code>Padding<\/code>: \u586b\u5145\u5b57\u8282\uff0c\u6ca1\u6709\u5177\u4f53\u8bed\u4e49\uff0c\u4f5c\u7528\u4e0e DATA \u7684 Padding \u4e00\u6837\uff0c\u5b58\u5728\u5219\u4ee3\u8868 PADDING flag \u88ab\u8bbe\u7f6e<\/li>\n<\/ul>\n<p>PUSH_PROMISE \u5e27\u6709\u4ee5\u4e0b\u6807\u8bc6 (flags):<\/p>\n<ul>\n<li>END_HEADERS: bit 2 \u7f6e 1 \u4ee3\u8868 header \u5757\u7ed3\u675f<\/li>\n<li>PADDED: bit 3 \u7f6e 1 \u4ee3\u8868 Pad \u88ab\u8bbe\u7f6e\uff0c\u5b58\u5728 Pad Length \u548c Padding<\/li>\n<\/ul>\n<p>Push \u7684\u8fc7\u7a0b<\/p>\n<p>\u7ed3\u5408\u4e0a\u6587\u5173\u4e8e Server-Push \u7684\u6d41\u72b6\u6001\u8f6c\u6362<\/p>\n<p>PUSH_PROMISE \u5e27\u53ea\u80fd\u5728\u5bf9\u7aef(\u5ba2\u6237\u7aef)\u53d1\u8d77\u7684\u4e14\u6d41\u72b6\u6001\u4e3a open \u6216\u8005 half-closed (remote) \u7684\u6d41\u4e0a\u53d1\u9001<\/p>\n<p>PUSH_PROMISE \u5e27\u51c6\u5907\u63a8\u9001\u7684\u54cd\u5e94\u603b\u662f\u548c\u6765\u81ea\u4e8e\u5ba2\u6237\u7aef\u7684\u8bf7\u6c42\u76f8\u5173\u8054\u3002\u670d\u52a1\u7aef\u5728\u8be5\u8bf7\u6c42\u6240\u5728\u7684\u6d41\u4e0a\u53d1\u9001 PUSH_PROMISE \u5e27\u3002PUSH_PROMISE \u5e27\u5305\u542b\u4e00\u4e2a Promised Stream ID\uff0c\u8be5\u6d41\u6807\u8bc6\u7b26\u662f\u4ece\u670d\u52a1\u7aef\u53ef\u7528\u7684\u6d41\u6807\u8bc6\u7b26\u91cc\u9009\u51fa\u6765\u7684\u3002<\/p>\n<p>\u5982\u679c\u670d\u52a1\u7aef\u6536\u5230\u4e86\u4e00\u4e2a\u5bf9\u6587\u6863\u7684\u8bf7\u6c42\uff0c\u8be5\u6587\u6863\u5305\u542b\u5185\u5d4c\u7684\u6307\u5411\u591a\u4e2a\u56fe\u7247\u6587\u4ef6\u7684\u94fe\u63a5\uff0c\u4e14\u670d\u52a1\u7aef\u9009\u62e9\u5411\u5ba2\u6237\u7aef\u63a8\u9001\u90a3\u4e9b\u989d\u5916\u7684\u56fe\u7247\uff0c\u90a3\u4e48\u5728\u53d1\u9001\u5305\u542b\u56fe\u7247\u94fe\u63a5\u7684 DATA \u5e27\u4e4b\u524d\u53d1\u9001 PUSH_PROMISE \u5e27\u53ef\u4ee5\u786e\u4fdd\u5ba2\u6237\u7aef\u5728\u53d1\u73b0\u5185\u5d4c\u7684\u94fe\u63a5\u4e4b\u524d\uff0c\u80fd\u591f\u77e5\u9053\u6709\u4e00\u4e2a\u8d44\u6e90\u5c06\u8981\u88ab\u63a8\u9001\u8fc7\u6765\u3002\u540c\u6837\u5730\uff0c\u5982\u679c\u670d\u52a1\u7aef\u51c6\u5907\u63a8\u9001\u88ab\u9996\u90e8\u5757\u5f15\u7528\u7684\u54cd\u5e94 (\u6bd4\u5982\uff0c\u5728\u00a0<a href=\"https:\/\/www.w3.org\/wiki\/LinkHeader\" target=\"_blank\" rel=\"noopener\">Link \u9996\u90e8\u5b57\u6bb5<\/a>\u00a0\u91cc\u7684)\uff0c\u5728\u53d1\u9001\u9996\u90e8\u5757\u4e4b\u524d\u53d1\u9001\u4e00\u4e2a PUSH_PROMISE \u5e27\uff0c\u53ef\u4ee5\u786e\u4fdd\u5ba2\u6237\u7aef\u4e0d\u518d\u8bf7\u6c42\u90a3\u4e9b\u8d44\u6e90<\/p>\n<p>\u4e00\u65e6\u5ba2\u6237\u7aef\u6536\u5230\u4e86 PUSH_PROMISE \u5e27\uff0c\u5e76\u9009\u62e9\u63a5\u6536\u88ab\u63a8\u9001\u7684\u54cd\u5e94\uff0c\u5ba2\u6237\u7aef\u5c31\u4e0d\u5e94\u8be5\u4e3a\u51c6\u5907\u63a8\u9001\u7684\u54cd\u5e94\u53d1\u8d77\u4efb\u4f55\u8bf7\u6c42\uff0c\u76f4\u5230\u9884\u793a\u7684\u6d41\u88ab\u5173\u95ed\u4ee5\u540e\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTRmMmQxYWEyNTM5ODVlNTEucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTIwMC9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>image<\/p>\n<blockquote><p>\u6ce8\u610f\u56fe\u4e2d\u63a8\u9001\u7684\u56db\u4e2a\u8d44\u6e90\u5404\u9884\u793a\u4e86\u4e00\u4e2a\u6d41 (Promised Stream ID)\uff0c\u800c\u53d1\u9001 PUSH_PROMISE \u5e27\u7684\u8fd8\u662f\u5728\u5ba2\u6237\u7aef\u53d1\u8d77\u7684\u8bf7\u6c42\u6d41 (Stream Identifier = 1) \u4e0a\uff0c\u5ba2\u6237\u7aef\u6536\u5230 PUSH_PROMISE \u5e27\u5e76\u9009\u62e9\u63a5\u6536\u4fbf\u4e0d\u4f1a\u5bf9\u8fd9\u56db\u4e2a\u8d44\u6e90\u53d1\u8d77\u8bf7\u6c42\uff0c\u4e4b\u540e\u670d\u52a1\u7aef\u4f1a\u53d1\u8d77\u9884\u793a\u7684\u6d41\u7136\u540e\u63a8\u9001\u8d44\u6e90\u76f8\u5173\u7684\u54cd\u5e94<\/p><\/blockquote>\n<p>\u4e0d\u7ba1\u51fa\u4e8e\u4ec0\u4e48\u539f\u56e0\uff0c\u5982\u679c\u5ba2\u6237\u7aef\u51b3\u5b9a\u4e0d\u518d\u4ece\u670d\u52a1\u7aef\u63a5\u6536\u51c6\u5907\u63a8\u9001\u7684\u54cd\u5e94\uff0c\u6216\u8005\u5982\u679c\u670d\u52a1\u7aef\u82b1\u8d39\u4e86\u592a\u957f\u65f6\u95f4\u51c6\u5907\u53d1\u9001\u88ab\u9884\u793a\u7684\u54cd\u5e94\uff0c\u5ba2\u6237\u7aef\u53ef\u4ee5\u53d1\u9001\u4e00\u4e2a RST_STREAM \u5e27\uff0c\u8be5\u5e27\u53ef\u4ee5\u4f7f\u7528 CANCEL \u6216\u8005 REFUSED_STEAM \u7801\uff0c\u5e76\u5f15\u7528\u88ab\u63a8\u9001\u7684\u6d41\u6807\u8bc6\u7b26\u3002<\/p>\n<p>nginx \u914d\u7f6e Server-Push<\/p>\n<blockquote><p>server-push \u9700\u8981\u670d\u52a1\u7aef\u8bbe\u7f6e\uff0c\u5e76\u4e0d\u662f\u8bf4\u6d4f\u89c8\u5668\u53d1\u8d77\u8bf7\u6c42\uff0c\u4e0e\u6b64\u8bf7\u6c42\u76f8\u5173\u7684\u8d44\u6e90\u670d\u52a1\u7aef\u5c31\u4f1a\u81ea\u52a8\u63a8\u9001<\/p><\/blockquote>\n<p>\u4ee5 nginx \u4e3a\u4f8b\uff0c\u4ece\u7248\u672c 1.13.9 \u5f00\u59cb\u6b63\u5f0f\u652f\u6301 hppt2 serverpush \u529f\u80fd\uff0c<\/p>\n<p>\u5728\u76f8\u5e94 server \u6216 location \u6a21\u5757\u4e2d\u52a0\u5165\u00a0<code>http2_push<\/code>\u00a0\u5b57\u6bb5\u52a0\u4e0a\u76f8\u5bf9\u8def\u5f84\u7684\u6587\u4ef6\u5373\u53ef\u5728\u8bf7\u6c42\u8be5\u8d44\u6e90\u65f6\u63a8\u9001\u76f8\u5173\u8d44\u6e90\uff0c\u6bd4\u5982\u6211\u7684\u535a\u5ba2\u8bbe\u7f6e\u5982\u4e0b\uff0c\u8bbf\u95ee\u9996\u9875\u65f6\u6709\u56db\u4e2a\u6587\u4ef6\u4f1a\u7531\u670d\u52a1\u5668\u4e3b\u52a8\u63a8\u9001\u8fc7\u53bb\u800c\u4e0d\u9700\u8981\u5ba2\u6237\u7aef\u8bf7\u6c42:<\/p>\n<pre><code class=\"hljs language-bash\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">server_name blog.wangriyu.wang;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">root \/blog;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">index index.html index.htm;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">location = \/index.html {<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">http2_push \/css\/style.css;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">http2_push \/js\/main.js;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">http2_push \/img\/yule.jpg;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">http2_push \/img\/avatar.jpg;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"10\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">}<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-bash\"><\/code><\/pre>\n<p>\u901a\u8fc7\u6d4f\u89c8\u5668\u63a7\u5236\u53f0\u53ef\u4ee5\u67e5\u770b\u00a0<code>Push<\/code>\u00a0\u54cd\u5e94:<\/p>\n<p>image<\/p>\n<p>\u4e5f\u53ef\u4ee5\u7528\u00a0<code>nghttp<\/code>\u00a0\u6d4b\u8bd5 push \u54cd\u5e94 (* \u53f7\u4ee3\u8868\u662f\u670d\u52a1\u7aef\u63a8\u9001\u7684):<\/p>\n<p>image<\/p>\n<p>\u4e0a\u9762\u00a0<code>http2_push<\/code>\u00a0\u7684\u8bbe\u7f6e\u9002\u5408\u9759\u6001\u8d44\u6e90\uff0c\u670d\u52a1\u7aef\u4e8b\u5148\u77e5\u9053\u54ea\u4e9b\u6587\u4ef6\u662f\u5ba2\u6237\u7aef\u9700\u8981\u7684\uff0c\u7136\u540e\u9009\u62e9\u6027\u63a8\u9001<\/p>\n<p>\u5047\u5982\u662f\u540e\u53f0\u5e94\u7528\u52a8\u6001\u751f\u6210\u7684\u6587\u4ef6(\u6bd4\u5982 json \u6587\u4ef6)\uff0c\u670d\u52a1\u5668\u4e8b\u5148\u4e0d\u77e5\u9053\u8981\u63a8\u9001\u4ec0\u4e48\uff0c\u53ef\u4ee5\u7528\u00a0<code>Link<\/code>\u00a0\u54cd\u5e94\u5934\u6765\u505a\u81ea\u52a8\u63a8\u9001<\/p>\n<p>\u5728 server \u6a21\u5757\u4e2d\u6dfb\u52a0\u00a0<code>http2_push_preload on;<\/code><\/p>\n<pre><code class=\"hljs language-csharp\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">server_name blog.wangriyu.wang;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">root \/blog;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">index index.html index.htm;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">http2_push_preload <span class=\"hljs-keyword\">on<\/span>;<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-csharp\"><\/code><\/pre>\n<p>\u7136\u540e\u8bbe\u7f6e\u54cd\u5e94\u5934 (add_header) \u6216\u8005\u540e\u53f0\u7a0b\u5e8f\u751f\u6210\u6570\u636e\u6587\u4ef6\u8fd4\u56de\u65f6\u5e26\u4e0a\u54cd\u5e94\u5934 Link \u6807\u7b7e\uff0c\u6bd4\u5982<\/p>\n<pre><code class=\"hljs language-javascript\"><span class=\"hljs-title class_\">Link<\/span>: &lt;<span class=\"hljs-regexp\">\/style.css&gt;; as=style; rel=preload, &lt;\/m<\/span>ain.<span class=\"hljs-property\">js<\/span>&gt;; <span class=\"hljs-keyword\">as<\/span>=script; rel=preload, &lt;\/image.<span class=\"hljs-property\">jpg<\/span>&gt;; <span class=\"hljs-keyword\">as<\/span>=image; rel=preload\r\n<\/code><\/pre>\n<p>nginx \u4f1a\u6839\u636e Link \u54cd\u5e94\u5934\u4e3b\u52a8\u63a8\u9001\u8fd9\u4e9b\u8d44\u6e90<\/p>\n<p>\u66f4\u591anginx \u5b98\u65b9\u4ecb\u7ecd\u89c1\u00a0<a href=\"https:\/\/www.nginx.com\/blog\/nginx-1-13-9-http2-server-push\/\" target=\"_blank\" rel=\"noopener\">Introducing HTTP\/2 Server Push with NGINX 1.13.9<\/a><\/p>\n<p>Server-Push \u6f5c\u5728\u7684\u95ee\u9898<\/p>\n<p>\u770b\u4e86\u8fd9\u7bc7\u6587\u7ae0\u00a0<a href=\"https:\/\/imququ.com\/post\/server-push-in-http2.html\" target=\"_blank\" rel=\"noopener\">HTTP\/2 \u4e2d\u7684 Server Push \u8ba8\u8bba<\/a>\uff0c\u53d1\u73b0 Server-Push \u6709\u4e2a\u6f5c\u5728\u7684\u95ee\u9898<\/p>\n<p>Server-Push \u6ee1\u8db3\u6761\u4ef6\u65f6\u4fbf\u4f1a\u53d1\u8d77\u63a8\u9001\uff0c\u53ef\u662f\u5ba2\u6237\u7aef\u5df2\u7ecf\u6709\u7f13\u5b58\u4e86\u60f3\u53d1\u9001 RST \u62d2\u6536\uff0c\u800c\u670d\u52a1\u5668\u5728\u6536\u5230 RST \u4e4b\u524d\u5df2\u7ecf\u63a8\u9001\u8d44\u6e90\u4e86\uff0c\u867d\u7136\u8fd9\u90e8\u5206\u63a8\u9001\u65e0\u6548\u4f46\u662f\u80af\u5b9a\u4f1a\u5360\u7528\u5e26\u5bbd<\/p>\n<p>\u6bd4\u5982\u6211\u4e0a\u9762\u535a\u5ba2\u5173\u4e8e http2_push \u7684\u914d\u7f6e\uff0c\u6211\u6bcf\u6b21\u6253\u5f00\u9996\u9875\u670d\u52a1\u5668\u90fd\u4f1a\u63a8\u9001\u90a3\u56db\u4e2a\u6587\u4ef6\uff0c\u800c\u5b9e\u9645\u4e0a\u6d4f\u89c8\u5668\u77e5\u9053\u81ea\u5df1\u6709\u7f13\u5b58\u4f7f\u7528\u7684\u4e5f\u662f\u672c\u5730\u7f13\u5b58\uff0c\u4e5f\u5c31\u662f\u8bf4\u672c\u5730\u7f13\u5b58\u672a\u5931\u6548\u7684\u671f\u95f4\u5185\uff0c\u670d\u52a1\u5668\u7684 Server-Push \u53ea\u662f\u8d77\u5230\u4e86\u5360\u7528\u5e26\u5bbd\u7684\u4f5c\u7528<\/p>\n<p>\u5f53\u7136\u5b9e\u9645\u4e0a\u5bf9\u6211\u7684\u5c0f\u7ad9\u70b9\u6765\u8bf4\u5f71\u54cd\u5e76\u4e0d\u5927\uff0c\u4f46\u662f\u5982\u679c\u7f51\u7ad9\u9700\u8981\u5927\u91cf\u63a8\u9001\u7684\u8bdd\uff0c\u9700\u8981\u8003\u8651\u5e76\u6d4b\u8bd5 Server-Push \u662f\u5426\u4f1a\u5f71\u54cd\u7528\u6237\u7684\u540e\u7eed\u8bbf\u95ee<\/p>\n<p>\u53e6\u5916\u670d\u52a1\u7aef\u53ef\u4ee5\u8bbe\u7f6e Cookie \u6216\u8005 Session \u8bb0\u5f55\u8bbf\u95ee\u65f6\u95f4\uff0c\u7136\u540e\u4e4b\u540e\u7684\u8bbf\u95ee\u5224\u65ad\u662f\u5426\u9700\u8981 Push\uff1b\u8fd8\u6709\u5c31\u662f\u5ba2\u6237\u7aef\u53ef\u4ee5\u9650\u5236 PUSH \u6d41\u7684\u6570\u76ee\uff0c\u4e5f\u53ef\u4ee5\u8bbe\u7f6e\u4e00\u4e2a\u5f88\u4f4e\u7684\u6d41\u91cf\u7a97\u53e3\u6765\u9650\u5236 PUSH \u53d1\u9001\u7684\u6570\u636e\u5927\u5c0f<\/p>\n<p>\u81f3\u4e8e\u54ea\u4e9b\u8d44\u6e90\u9700\u8981\u63a8\u9001\uff0c\u5728\u300aweb \u6027\u80fd\u6743\u5a01\u6307\u5357\u300b\u4e2d\u5c31\u63d0\u5230\u51e0\u79cd\u7b56\u7565\uff0c\u6bd4\u5982 Apache \u7684 mod_spdy \u80fd\u591f\u8bc6\u522b X-Associated-Content \u9996\u90e8\uff0c\u5f53\u4e2d\u5217\u51fa\u4e86\u5e0c\u671b\u670d\u52a1\u5668\u63a8\u9001\u7684\u8d44\u6e90\uff1b\u53e6\u5916\u7f51\u4e0a\u6709\u4eba\u5df2\u7ecf\u505a\u4e86\u57fa\u4e8e Referer \u9996\u90e8\u7684\u4e2d\u95f4\u4ef6\u6765\u5904\u7406 Server-Push\uff1b\u6216\u8005\u670d\u52a1\u7aef\u80fd\u66f4\u667a\u80fd\u7684\u8bc6\u522b\u6587\u6863\uff0c\u6839\u636e\u5f53\u524d\u6d41\u91cf\u51b3\u5b9a\u662f\u5426\u63a8\u9001\u6216\u8005\u63a8\u9001\u90a3\u4e9b\u8d44\u6e90\u3002\u76f8\u4fe1\u4ee5\u540e\u4f1a\u6709\u66f4\u591a\u5173\u4e8e Server-Push \u7684\u5b9e\u73b0\u548c\u5e94\u7528<\/p>\n<h3><a name=\"t7\"><\/a>\u6d41\u91cf\u63a7\u5236<\/h3>\n<p>\u591a\u8def\u590d\u7528\u7684\u6d41\u4f1a\u7ade\u4e89 TCP \u8d44\u6e90\uff0c\u8fdb\u800c\u5bfc\u81f4\u6d41\u88ab\u963b\u585e\u3002\u6d41\u63a7\u5236\u673a\u5236\u786e\u4fdd\u540c\u4e00\u8fde\u63a5\u4e0a\u7684\u6d41\u4e0d\u4f1a\u76f8\u4e92\u5e72\u6270\u3002\u6d41\u91cf\u63a7\u5236\u4f5c\u7528\u4e8e\u5355\u4e2a\u6d41\u6216\u6574\u4e2a\u8fde\u63a5\u3002HTTP\/2 \u901a\u8fc7\u4f7f\u7528 WINDOW_UPDATE \u5e27\u6765\u63d0\u4f9b\u6d41\u91cf\u63a7\u5236\u3002<\/p>\n<p>\u6d41\u63a7\u5236\u5177\u6709\u4ee5\u4e0b\u7279\u5f81:<\/p>\n<ul>\n<li>\u6d41\u91cf\u63a7\u5236\u662f\u7279\u5b9a\u4e8e\u8fde\u63a5\u7684\u3002\u4e24\u79cd\u7ea7\u522b\u7684\u6d41\u91cf\u63a7\u5236\u90fd\u4f4d\u4e8e\u5355\u8df3\u7684\u7aef\u70b9\u4e4b\u95f4\uff0c\u800c\u4e0d\u662f\u6574\u4e2a\u7aef\u5230\u7aef\u7684\u8def\u5f84\u3002\u6bd4\u5982 server \u524d\u9762\u6709\u4e00\u4e2a front-end proxy \u5982 Nginx\uff0c\u8fd9\u65f6\u5c31\u4f1a\u6709\u4e24\u4e2a connection\uff0cbrowser-Nginx, Nginx\u2014server\uff0cflow control \u5206\u522b\u4f5c\u7528\u4e8e\u4e24\u4e2a connection\u3002\u8be6\u60c5\u89c1:\u00a0<a href=\"https:\/\/stackoverflow.com\/questions\/40747040\/how-is-http-2-hop-by-hop-flow-control-accomplished\" target=\"_blank\" rel=\"noopener\">How is HTTP\/2 hop-by-hop flow control accomplished? &#8211; stackoverflow<\/a><\/li>\n<li>\u6d41\u91cf\u63a7\u5236\u662f\u57fa\u4e8e WINDOW_UPDATE \u5e27\u7684\u3002\u63a5\u6536\u65b9\u516c\u5e03\u81ea\u5df1\u6253\u7b97\u5728\u6bcf\u4e2a\u6d41\u4ee5\u53ca\u6574\u4e2a\u8fde\u63a5\u4e0a\u5206\u522b\u63a5\u6536\u591a\u5c11\u5b57\u8282\u3002\u8fd9\u662f\u4e00\u4e2a\u4ee5\u4fe1\u7528\u4e3a\u57fa\u7840\u7684\u65b9\u6848\u3002<\/li>\n<li>\u6d41\u91cf\u63a7\u5236\u662f\u6709\u65b9\u5411\u7684\uff0c\u7531\u63a5\u6536\u8005\u5168\u9762\u63a7\u5236\u3002\u63a5\u6536\u65b9\u53ef\u4ee5\u4e3a\u6bcf\u4e2a\u6d41\u548c\u6574\u4e2a\u8fde\u63a5\u8bbe\u7f6e\u4efb\u610f\u7684\u7a97\u53e3\u5927\u5c0f\u3002\u53d1\u9001\u65b9\u5fc5\u987b\u5c0a\u91cd\u63a5\u6536\u65b9\u8bbe\u7f6e\u7684\u6d41\u91cf\u63a7\u5236\u9650\u5236\u3002\u5ba2\u6237\u65b9\u3001\u670d\u52a1\u7aef\u548c\u4e2d\u95f4\u4ee3\u7406\u4f5c\u4e3a\u63a5\u6536\u65b9\u65f6\u90fd\u72ec\u7acb\u5730\u516c\u5e03\u5404\u81ea\u7684\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\uff0c\u4f5c\u4e3a\u53d1\u9001\u65b9\u65f6\u90fd\u9075\u5b88\u5bf9\u7aef\u7684\u6d41\u91cf\u63a7\u5236\u8bbe\u7f6e\u3002<\/li>\n<li>\u65e0\u8bba\u662f\u65b0\u6d41\u8fd8\u662f\u6574\u4e2a\u8fde\u63a5\uff0c\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u7684\u521d\u59cb\u503c\u662f 65535 \u5b57\u8282\u3002<\/li>\n<li>\u5e27\u7684\u7c7b\u578b\u51b3\u5b9a\u4e86\u6d41\u91cf\u63a7\u5236\u662f\u5426\u9002\u7528\u4e8e\u5e27\u3002\u76ee\u524d\uff0c\u53ea\u6709 DATA \u5e27\u4f1a\u53d7\u6d41\u91cf\u63a7\u5236\u5f71\u54cd\uff0c\u6240\u6709\u5176\u5b83\u7c7b\u578b\u7684\u5e27\u5e76\u4e0d\u6d88\u8017\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u7684\u7a7a\u95f4\u3002\u8fd9\u4fdd\u8bc1\u4e86\u91cd\u8981\u7684\u63a7\u5236\u5e27\u4e0d\u4f1a\u88ab\u6d41\u91cf\u63a7\u5236\u963b\u585e\u3002<\/li>\n<li>\u6d41\u91cf\u63a7\u5236\u4e0d\u80fd\u88ab\u7981\u7528\u3002<\/li>\n<li>HTTP\/2 \u53ea\u5b9a\u4e49\u4e86 WINDOW_UPDATE \u5e27\u7684\u683c\u5f0f\u548c\u8bed\u4e49\uff0c\u5e76\u6ca1\u6709\u89c4\u5b9a\u63a5\u6536\u65b9\u5982\u4f55\u51b3\u5b9a\u4f55\u65f6\u53d1\u9001\u5e27\u3001\u53d1\u9001\u4ec0\u4e48\u6837\u7684\u503c\uff0c\u4e5f\u6ca1\u6709\u89c4\u5b9a\u53d1\u9001\u65b9\u5982\u4f55\u9009\u62e9\u53d1\u9001\u5305\u3002\u5177\u4f53\u5b9e\u73b0\u53ef\u4ee5\u9009\u62e9\u4efb\u4f55\u6ee1\u8db3\u9700\u6c42\u7684\u7b97\u6cd5\u3002<\/li>\n<\/ul>\n<p>WINDOW_UPDATE \u5e27\u683c\u5f0f<\/p>\n<p>&nbsp;<\/p>\n<pre><code class=\"hljs language-sql\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-operator\">&#8211;<\/span><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">|<\/span>R<span class=\"hljs-operator\">|<\/span> <span class=\"hljs-keyword\">Window<\/span> Size Increment (<span class=\"hljs-number\">31<\/span>) <span class=\"hljs-operator\">|<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-operator\">+<\/span><span class=\"hljs-operator\">&#8211;<\/span><span class=\"hljs-operator\">+<\/span><span class=\"hljs-comment\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-sql\"><\/code><\/pre>\n<p>Window Size Increment \u8868\u793a\u9664\u4e86\u73b0\u6709\u7684\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u4e4b\u5916\uff0c\u53d1\u9001\u7aef\u8fd8\u53ef\u4ee5\u4f20\u9001\u7684\u5b57\u8282\u6570\u3002\u53d6\u503c\u8303\u56f4\u662f 1 \u5230 2^31 &#8211; 1 \u5b57\u8282\u3002<\/p>\n<p>WINDOW_UPDATE \u5e27\u53ef\u4ee5\u662f\u9488\u5bf9\u4e00\u4e2a\u6d41\u6216\u8005\u662f\u9488\u5bf9\u6574\u4e2a\u8fde\u63a5\u7684\u3002\u5982\u679c\u662f\u524d\u8005\uff0cWINDOW_UPDATE \u5e27\u7684\u6d41\u6807\u8bc6\u7b26\u6307\u660e\u4e86\u53d7\u5f71\u54cd\u7684\u6d41\uff1b\u5982\u679c\u662f\u540e\u8005\uff0c\u6d41\u6807\u8bc6\u7b26\u4e3a 0 \u8868\u793a\u4f5c\u7528\u4e8e\u6574\u4e2a\u8fde\u63a5\u3002<\/p>\n<p>\u6d41\u91cf\u63a7\u5236\u529f\u80fd\u53ea\u9002\u7528\u4e8e\u88ab\u6807\u8bc6\u7684\u3001\u53d7\u6d41\u91cf\u63a7\u5236\u5f71\u54cd\u7684\u5e27\u3002\u6587\u6863\u5b9a\u4e49\u7684\u5e27\u7c7b\u578b\u4e2d\uff0c\u53ea\u6709 DATA \u5e27\u53d7\u6d41\u91cf\u63a7\u5236\u5f71\u54cd\u3002\u9664\u975e\u63a5\u6536\u7aef\u4e0d\u80fd\u518d\u5206\u914d\u8d44\u6e90\u53bb\u5904\u7406\u8fd9\u4e9b\u5e27\uff0c\u5426\u5219\u4e0d\u53d7\u6d41\u91cf\u63a7\u5236\u5f71\u54cd\u7684\u5e27\u5fc5\u987b\u88ab\u63a5\u6536\u5e76\u5904\u7406\u3002\u5982\u679c\u63a5\u6536\u7aef\u4e0d\u80fd\u518d\u63a5\u6536\u5e27\u4e86\uff0c\u53ef\u4ee5\u54cd\u5e94\u4e00\u4e2a FLOW_CONTROL_ERROR \u7c7b\u578b\u7684\u6d41\u9519\u8bef\u6216\u8005\u8fde\u63a5\u9519\u8bef\u3002<\/p>\n<p>WINDOW_UPDATE \u53ef\u4ee5\u7531\u53d1\u9001\u8fc7\u5e26\u6709 END_STREAM \u6807\u5fd7\u7684\u5e27\u7684\u5bf9\u7aef\u53d1\u9001\u3002\u8fd9\u610f\u5473\u7740\u63a5\u6536\u7aef\u53ef\u80fd\u4f1a\u5728 half-closed (remote) \u6216\u8005 closed \u72b6\u6001\u7684\u6d41\u4e0a\u6536\u5230 WINDOW_UPDATE \u5e27\uff0c\u63a5\u6536\u7aef\u4e0d\u80fd\u5c06\u5176\u5f53\u505a\u9519\u8bef\u3002<\/p>\n<p>\u6d41\u91cf\u63a7\u5236\u7a97\u53e3<\/p>\n<p>\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u6574\u6570\u503c\uff0c\u6307\u51fa\u4e86\u51c6\u8bb8\u53d1\u9001\u7aef\u4f20\u9001\u7684\u6570\u636e\u7684\u5b57\u8282\u6570\u3002\u7a97\u53e3\u503c\u8861\u91cf\u4e86\u63a5\u6536\u7aef\u7684\u7f13\u5b58\u80fd\u529b\u3002<\/p>\n<p>\u9664\u975e\u5c06\u5176\u5f53\u505a\u8fde\u63a5\u9519\u8bef\uff0c\u5426\u5219\u5f53\u63a5\u6536\u7aef\u6536\u5230 DATA \u5e27\u65f6\uff0c\u5fc5\u987b\u603b\u662f\u4ece\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u4e2d\u51cf\u6389\u5176\u957f\u5ea6(\u4e0d\u5305\u62ec\u5e27\u5934\u7684\u957f\u5ea6\uff0c\u800c\u4e14\u4e24\u4e2a\u7ea7\u522b\u7684\u63a7\u5236\u7a97\u53e3\u90fd\u8981\u51cf)\u3002\u5373\u4f7f\u5e27\u6709\u9519\u8bef\uff0c\u8fd9\u4e5f\u662f\u6709\u5fc5\u8981\u7684\uff0c\u56e0\u4e3a\u53d1\u9001\u7aef\u5df2\u7ecf\u5c06\u8be5\u5e27\u8ba1\u5165\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\uff0c\u5982\u679c\u63a5\u6536\u7aef\u6ca1\u6709\u8fd9\u6837\u505a\uff0c\u53d1\u9001\u7aef\u548c\u63a5\u6536\u7aef\u7684\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u5c31\u4f1a\u4e0d\u4e00\u81f4\u3002<\/p>\n<p>\u53d1\u9001\u7aef\u4e0d\u80fd\u53d1\u9001\u53d7\u6d41\u91cf\u63a7\u5236\u5f71\u54cd\u7684\u3001\u5176\u957f\u5ea6\u8d85\u51fa\u63a5\u6536\u7aef\u544a\u77e5\u7684\u4e24\u79cd\u7ea7\u522b\u7684\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u53ef\u7528\u7a7a\u95f4\u7684\u5e27\u3002\u5373\u4f7f\u8fd9\u4e24\u79cd\u7ea7\u522b\u7684\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u90fd\u6ca1\u6709\u53ef\u7528\u7a7a\u95f4\u4e86\uff0c\u4e5f\u53ef\u4ee5\u53d1\u9001\u957f\u5ea6\u4e3a 0\u3001\u8bbe\u7f6e\u4e86 END_STREAM \u6807\u5fd7\u7684\u5e27(\u5373\u7a7a\u7684 DATA \u5e27)\u3002<\/p>\n<p>\u5f53\u5e27\u7684\u63a5\u6536\u7aef\u6d88\u8017\u4e86\u6570\u636e\u5e76\u91ca\u653e\u4e86\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u7684\u7a7a\u95f4\u65f6\uff0c\u53ef\u4ee5\u53d1\u9001\u4e00\u4e2a WINDOW_UPDATE \u5e27\u3002\u5bf9\u4e8e\u6d41\u7ea7\u522b\u548c\u8fde\u63a5\u7ea7\u522b\u7684\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\uff0c\u9700\u8981\u5206\u522b\u53d1\u9001 WINDOW_UPDATE \u5e27\u3002<\/p>\n<p>\u65b0\u5efa\u8fde\u63a5\u65f6\uff0c\u6d41\u548c\u8fde\u63a5\u7684\u521d\u59cb\u7a97\u53e3\u5927\u5c0f\u90fd\u662f 2^16 &#8211; 1(65535) \u5b57\u8282\u3002\u53ef\u4ee5\u901a\u8fc7\u8bbe\u7f6e\u8fde\u63a5\u524d\u8a00\u4e2d SETTINGS \u5e27\u7684 SETTINGS_INITIAL_WINDOW_SIZE \u53c2\u6570\u6539\u53d8\u6d41\u7684\u521d\u59cb\u7a97\u53e3\u5927\u5c0f\uff0c\u8fd9\u4f1a\u4f5c\u7528\u4e8e\u6240\u6709\u6d41\u3002\u800c<code>\u8fde\u63a5\u7684\u521d\u59cb\u7a97\u53e3\u5927\u5c0f\u4e0d\u80fd\u6539\uff0c\u4f46\u53ef\u4ee5\u7528 WINDOW_UPDATE \u5e27\u6765\u6539\u53d8\u6d41\u91cf\u63a7\u5236\u7a97\u53e3<\/code>\uff0c\u8fd9\u662f\u4e3a\u4ec0\u4e48\u8fde\u63a5\u524d\u8a00\u5f80\u5f80\u5e26\u6709\u4e00\u4e2a WINDOW_UPDATE \u5e27\u7684\u539f\u56e0\u3002<\/p>\n<p>\u9664\u4e86\u6539\u53d8\u8fd8\u672a\u6fc0\u6d3b\u7684\u6d41\u7684\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u5916\uff0cSETTIGNS \u5e27\u8fd8\u53ef\u4ee5\u6539\u53d8\u5df2\u6d3b\u8dc3\u7684\u6d41 (\u5904\u4e8e open \u6216 half-closed (remote) \u72b6\u6001\u7684\u6d41)\u7684\u521d\u59cb\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u7684\u5927\u5c0f\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53 SETTINGS_INITIAL_WINDOW_SIZE \u7684\u503c\u53d8\u5316\u65f6\uff0c\u63a5\u6536\u7aef\u5fc5\u987b\u8c03\u6574\u5b83\u6240\u7ef4\u62a4\u7684\u6240\u6709\u6d41\u7684\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u7684\u503c\uff0c\u4e0d\u7ba1\u662f\u4e4b\u524d\u5c31\u6253\u5f00\u7684\u6d41\u8fd8\u662f\u5c1a\u672a\u6253\u5f00\u7684\u6d41\u3002<\/p>\n<p>\u6539\u53d8 SETTINGS_INITIAL_WINDOW_SIZE \u53ef\u80fd\u5f15\u53d1\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u7684\u53ef\u7528\u7a7a\u95f4\u53d8\u6210\u8d1f\u503c\u3002\u53d1\u9001\u7aef\u5fc5\u987b\u8ffd\u8e2a\u8d1f\u7684\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\uff0c\u5e76\u4e14\u76f4\u5230\u5b83\u6536\u5230\u4e86\u4f7f\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u53d8\u6210\u6b63\u503c\u7684 WINDOW_UPDATE \u5e27\uff0c\u624d\u80fd\u53d1\u9001\u65b0\u7684 DATA \u5e27\u3002<\/p>\n<p>\u4f8b\u5982\uff0c\u5982\u679c\u8fde\u63a5\u4e00\u5efa\u7acb\u5ba2\u6237\u7aef\u5c31\u7acb\u5373\u53d1\u9001 60KB \u7684\u6570\u636e\uff0c\u800c\u670d\u52a1\u7aef\u5374\u5c06\u521d\u59cb\u7a97\u53e3\u5927\u5c0f\u8bbe\u7f6e\u4e3a 16KB\uff0c\u90a3\u4e48\u5ba2\u6237\u7aef\u4e00\u6536\u5230 SETTINGS \u5e27\uff0c\u5c31\u4f1a\u5c06\u53ef\u7528\u7684\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u91cd\u65b0\u8ba1\u7b97\u4e3a -44KB\u3002\u5ba2\u6237\u7aef\u4fdd\u6301\u8d1f\u7684\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\uff0c\u76f4\u5230 WINDOW_UPDATE \u5e27\u5c06\u7a97\u53e3\u503c\u6062\u590d\u4e3a\u6b63\u503c\uff0c\u5ba2\u6237\u7aef\u624d\u53ef\u4ee5\u7ee7\u7eed\u53d1\u9001\u6570\u636e\u3002<\/p>\n<p>\u5982\u679c\u6539\u53d8 SETTINGS_INITIAL_WINDOW_SIZE \u5bfc\u81f4\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\u8d85\u51fa\u4e86\u6700\u5927\u503c\uff0c\u4e00\u7aef\u5fc5\u987b \u5c06\u5176\u5f53\u505a\u7c7b\u578b\u4e3a FLOW_CONTROL_ERROR \u7684\u8fde\u63a5\u9519\u8bef<\/p>\n<p>\u5982\u679c\u63a5\u6536\u7aef\u5e0c\u671b\u4f7f\u7528\u6bd4\u5f53\u524d\u503c\u5c0f\u7684\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\uff0c\u53ef\u4ee5\u53d1\u9001\u4e00\u4e2a\u65b0\u7684 SETTINGS \u5e27\u3002\u4f46\u662f\uff0c\u63a5\u6536\u7aef\u5fc5\u987b\u51c6\u5907\u597d\u63a5\u6536\u8d85\u51fa\u8be5\u7a97\u53e3\u503c\u7684\u6570\u636e\uff0c\u56e0\u4e3a\u53ef\u80fd\u5728\u6536\u5230 SETTIGNS \u5e27\u4e4b\u524d\uff0c\u53d1\u9001\u7aef\u5df2\u7ecf\u53d1\u9001\u4e86\u8d85\u51fa\u8be5\u8f83\u5c0f\u7a97\u53e3\u503c\u7684\u6570\u636e\u3002<\/p>\n<p>\u5408\u7406\u4f7f\u7528\u6d41\u63a7\u5236<\/p>\n<p>\u6d41\u91cf\u63a7\u5236\u7684\u5b9a\u4e49\u662f\u7528\u6765\u4fdd\u62a4\u7aef\u70b9\u5728\u8d44\u6e90\u7ea6\u675f\u6761\u4ef6\u4e0b\u7684\u64cd\u4f5c\u3002\u4f8b\u5982\uff0c\u4e00\u4e2a\u4ee3\u7406\u9700\u8981\u5728\u5f88\u591a\u8fde\u63a5\u4e4b\u95f4\u5171\u4eab\u5185\u5b58\uff0c\u4e5f\u6709\u53ef\u80fd\u6709\u7f13\u6162\u7684\u4e0a\u6e38\u8fde\u63a5\u548c\u5feb\u901f\u7684\u4e0b\u6e38\u8fde\u63a5\u3002\u6d41\u91cf\u63a7\u5236\u89e3\u51b3\u4e86\u63a5\u6536\u65b9\u65e0\u6cd5\u5728\u4e00\u4e2a\u6d41\u4e0a\u5904\u7406\u6570\u636e\uff0c\u4f46\u4ecd\u5e0c\u671b\u7ee7\u7eed\u5904\u7406\u540c\u4e00\u8fde\u63a5\u4e2d\u7684\u5176\u4ed6\u6d41\u7684\u60c5\u51b5\u3002<\/p>\n<p>\u4e0d\u9700\u8981\u6b64\u529f\u80fd\u7684\u90e8\u7f72\u53ef\u4ee5\u901a\u544a\u6700\u5927\u5927\u5c0f (2^31 &#8211; 1) \u7684\u6d41\u91cf\u63a7\u5236\u7a97\u53e3\uff0c\u5e76\u4e14\u53ef\u4ee5\u901a\u8fc7\u5728\u6536\u5230\u4efb\u4f55\u6570\u636e\u65f6\u53d1\u9001 WINDOW_UPDATE \u5e27\u6765\u7ef4\u62a4\u6b64\u7a97\u53e3\u5927\u5c0f\u4fdd\u6301\u4e0d\u53d8\u3002\u8fd9\u53ef\u4ee5\u6709\u6548\u7981\u7528\u63a5\u53d7\u65b9\u7684\u6d41\u63a7\u5236\u3002\u76f8\u53cd\u5730\uff0c\u53d1\u9001\u65b9\u603b\u662f\u53d7\u63a7\u4e8e\u63a5\u6536\u65b9\u901a\u544a\u7684\u6d41\u63a7\u5236\u7a97\u53e3\u7684\u9650\u5236\u3002<\/p>\n<p>\u8d44\u6e90\u7ea6\u675f\u4e0b(\u4f8b\u5982\u5185\u5b58)\u7684\u8c03\u5ea6\u53ef\u4ee5\u4f7f\u7528\u6d41\u91cf\u6765\u9650\u5236\u4e00\u4e2a\u5bf9\u7aef\u53ef\u4ee5\u6d88\u8017\u7684\u5185\u5b58\u91cf\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\u5982\u679c\u5728\u4e0d\u77e5\u9053\u5e26\u5bbd\u5ef6\u8fdf\u79ef\u7684\u65f6\u5019\u542f\u7528\u6d41\u91cf\u63a7\u5236\u53ef\u80fd\u5bfc\u81f4\u65e0\u6cd5\u6700\u4f18\u7684\u5229\u7528\u53ef\u7528\u7684\u7f51\u7edc\u8d44\u6e90 (RFC1323)\u3002<\/p>\n<p>\u5373\u4fbf\u662f\u5bf9\u5f53\u524d\u7684\u7f51\u7edc\u5ef6\u8fdf\u4e58\u79ef\u6709\u5145\u5206\u7684\u8ba4\u8bc6\uff0c\u6d41\u91cf\u63a7\u5236\u7684\u5b9e\u73b0\u4e5f\u53ef\u80fd\u5f88\u590d\u6742\u3002\u5f53\u4f7f\u7528\u6d41\u91cf\u63a7\u5236\u65f6\uff0c\u63a5\u6536\u7aef\u5fc5\u987b\u53ca\u65f6\u5730\u4ece TCP \u63a5\u6536\u7f13\u51b2\u533a\u8bfb\u53d6\u6570\u636e\u3002\u8fd9\u6837\u505a\u53ef\u80fd\u5bfc\u81f4\u5728\u4e00\u4e9b\u4f8b\u5982 WINDOW_UPDATE \u7684\u5173\u952e\u5e27\u5728 HTTP\/2 \u4e0d\u53ef\u7528\u65f6\u5bfc\u81f4\u6b7b\u9501\u3002\u4f46\u662f\u6d41\u91cf\u63a7\u5236\u53ef\u4ee5\u4fdd\u8bc1\u7ea6\u675f\u8d44\u6e90\u80fd\u5728\u4e0d\u9700\u8981\u51cf\u5c11\u8fde\u63a5\u5229\u7528\u7684\u60c5\u51b5\u4e0b\u5f97\u5230\u4fdd\u62a4\u3002<\/p>\n<h3><a name=\"t8\"><\/a>HTTP\/2 \u7684\u534f\u8bae\u534f\u5546\u673a\u5236<\/h3>\n<p>\u975e\u52a0\u5bc6\u4e0b\u7684\u534f\u5546 &#8211; h2c<\/p>\n<p>\u5ba2\u6237\u7aef\u4f7f\u7528 HTTP Upgrade \u673a\u5236\u8bf7\u6c42\u5347\u7ea7\uff0cHTTP2-Settings \u9996\u90e8\u5b57\u6bb5\u662f\u4e00\u4e2a\u4e13\u7528\u4e8e\u8fde\u63a5\u7684\u9996\u90e8\u5b57\u6bb5\uff0c\u5b83\u5305\u542b\u7ba1\u7406 HTTP\/2 \u8fde\u63a5\u7684\u53c2\u6570(\u4f7f\u7528 Base64 \u7f16\u7801)\uff0c\u5176\u524d\u63d0\u662f\u5047\u8bbe\u670d\u52a1\u7aef\u4f1a\u63a5\u53d7\u5347\u7ea7\u8bf7\u6c42<\/p>\n<pre><code class=\"hljs language-vbscript\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-keyword\">GET<\/span> \/ HTTP\/<span class=\"hljs-number\">1.1<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">Host: <span class=\"hljs-built_in\">server<\/span>.example.com<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">Connection: Upgrade, HTTP2-Settings<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">Upgrade: h2c<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">HTTP2-Settings: &lt;base64url encoding of HTTP\/<span class=\"hljs-number\">2<\/span> SETTINGS payload&gt;<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-vbscript\"><\/code><\/pre>\n<p>\u670d\u52a1\u5668\u5982\u679c\u652f\u6301 http\/2 \u5e76\u540c\u610f\u5347\u7ea7\uff0c\u5219\u8f6c\u6362\u534f\u8bae\uff0c\u5426\u5219\u5ffd\u7565<\/p>\n<pre><code class=\"hljs language-vbnet\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">HTTP\/<span class=\"hljs-number\">1.1<\/span> <span class=\"hljs-number\">101<\/span> Switching Protocols<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-symbol\">Connection:<\/span> Upgrade<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-symbol\">Upgrade:<\/span> h2c<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-vbnet\"><\/code><\/pre>\n<p>\u6b64\u65f6\u6f5c\u5728\u7684\u5b58\u5728\u4e00\u4e2a\u6d41 0x1\uff0c\u5ba2\u6237\u7aef\u4e0a\u8fd9\u4e2a\u6d41\u5728\u5b8c\u6210 h1 \u8bf7\u6c42\u540e\u4fbf\u8f6c\u4e3a\u00a0<code>half-closed<\/code>\u00a0\u72b6\u6001\uff0c\u670d\u52a1\u7aef\u4f1a\u7528\u8fd9\u4e2a\u6d41\u8fd4\u56de\u54cd\u5e94<\/p>\n<p>image<\/p>\n<p>image<\/p>\n<p>image<\/p>\n<p>\u6ce8\u610f\u56fe\u4e2d\u7b2c\u4e00\u4e2a\u54cd\u5e94\u6240\u5728\u7684\u6d41\u662f 0x1\uff0c\u4e0e\u4e0a\u6587\u6240\u8bf4\u7684\u4e00\u81f4<\/p>\n<p>\u76ee\u524d\u6d4f\u89c8\u5668\u53ea\u652f\u6301 TLS \u52a0\u5bc6\u4e0b\u7684 HTTP\/2 \u901a\u4fe1\uff0c\u6240\u4ee5\u4e0a\u8ff0\u60c5\u51b5\u5728\u6d4f\u89c8\u5668\u4e2d\u76ee\u524d\u662f\u4e0d\u53ef\u80fd\u78b0\u5230\u7684\uff0c\u56fe\u4e2d\u663e\u793a\u7684\u662f nghttp \u5ba2\u6237\u7aef\u53d1\u8d77\u7684\u8bf7\u6c42<\/p>\n<p>\u52a0\u5bc6\u7684\u534f\u5546\u673a\u5236 &#8211; h2<\/p>\n<p>TLS \u52a0\u5bc6\u4e2d\u5728 Client-Hello \u548c Server-Hello \u7684\u8fc7\u7a0b\u4e2d\u901a\u8fc7\u00a0<a href=\"https:\/\/zh.wikipedia.org\/wiki\/%E5%BA%94%E7%94%A8%E5%B1%82%E5%8D%8F%E8%AE%AE%E5%8D%8F%E5%95%86\" target=\"_blank\" rel=\"noopener\">ALPN<\/a>\u00a0\u8fdb\u884c\u534f\u8bae\u534f\u5546<\/p>\n<p>image<\/p>\n<p>\u5e94\u7528\u5c42\u534f\u8bae\u534f\u5546\u5728 TLS \u63e1\u624b\u7b2c\u4e00\u6b65\u7684\u6269\u5c55\u4e2d\uff0cClient Hello \u4e2d\u5ba2\u6237\u7aef\u6307\u5b9a ALPN Next Protocol \u4e3a h2 \u6216\u8005 http\/1.1 \u8bf4\u660e\u5ba2\u6237\u7aef\u652f\u6301\u7684\u534f\u8bae<\/p>\n<p>image<\/p>\n<p>\u670d\u52a1\u7aef\u5982\u679c\u5728 Server Hello \u4e2d\u9009\u62e9 h2 \u6269\u5c55\uff0c\u8bf4\u660e\u534f\u5546\u534f\u8bae\u4e3a h2\uff0c\u540e\u7eed\u8bf7\u6c42\u54cd\u5e94\u8ddf\u7740\u53d8\u5316\uff1b\u5982\u679c\u670d\u52a1\u7aef\u672a\u8bbe\u7f6e http\/2 \u6216\u8005\u4e0d\u652f\u6301 h2\uff0c\u5219\u7ee7\u7eed\u7528 http\/1.1 \u901a\u4fe1<\/p>\n<h3><a name=\"t9\"><\/a>\u5206\u6790\u5b9e\u4f8b<\/h3>\n<p>image<\/p>\n<p>196: TLS \u63e1\u624b\u7b2c\u4e00\u6b65 Client Hello\uff0c\u5f00\u59cb\u534f\u8bae\u534f\u5546\uff0c\u4e14\u6b64\u5904\u5e26\u4e0a\u4e86 Session Ticket<\/p>\n<p>200: Server Hello \u540c\u610f\u4f7f\u7528 h2\uff0c\u800c\u4e14\u5ba2\u6237\u7aef\u7684\u4f1a\u8bdd\u7968\u8bc1\u6709\u6548\uff0c\u6062\u590d\u4f1a\u8bdd\uff0c\u63e1\u624b\u6210\u529f<\/p>\n<p>202: \u5ba2\u6237\u7aef\u4e5f\u6062\u590d\u4f1a\u8bdd\uff0c\u5f00\u59cb\u52a0\u5bc6\u540e\u7eed\u6d88\u606f<\/p>\n<p>205: \u670d\u52a1\u7aef\u53d1\u8d77\u4e00\u4e2a\u8fde\u63a5\u524d\u8a00 (SETTINGS)\uff0cSETTINGS \u5e27\u4e2d\u8bbe\u7f6e\u4e86\u6700\u5927\u5e76\u884c\u6d41\u6570\u91cf\u3001\u521d\u59cb\u7a97\u53e3\u5927\u5c0f\u3001\u6700\u5927\u5e27\u957f\u5ea6\uff0c\u7136\u540e (WINDOW_UPDATE) \u6269\u5927\u7a97\u53e3\u5927\u5c0f<\/p>\n<p>310: \u5ba2\u6237\u7aef\u4e5f\u53d1\u9001\u4e00\u4e2a\u8fde\u63a5\u524d\u8a00 Magic\uff0c\u5e76\u521d\u59cb\u5316\u8bbe\u7f6e (SETTINGS)\uff0cSETTINGS \u5e27\u4e2d\u8bbe\u7f6e\u4e86 HEADER TABLE \u5927\u5c0f\u3001\u521d\u59cb\u7a97\u53e3\u5927\u5c0f\u3001\u6700\u5927\u5e76\u884c\u6d41\u6570\u91cf\uff0c\u7136\u540e (WINDOW_UPDATE) \u6269\u5927\u7a97\u53e3\u5927\u5c0f<\/p>\n<p>311: \u5ba2\u6237\u7aef\u53d1\u9001\u5b8c\u8fde\u63a5\u524d\u8a00\u540e\u53ef\u4ee5\u7acb\u5373\u8ddf\u4e0a\u4e00\u4e2a\u8bf7\u6c42\uff0cGET \/ (HEADERS[1])\uff0c\u800c\u4e14\u8fd9\u4e2a HEADERS \u5e27\u8fd8\u5e26\u6709 END_STREAM\uff0c\u8fd9\u4f1a\u4f7f\u6d41 1 \u4ece idle \u72b6\u6001\u7acb\u5373\u8f6c\u4e3a half-closed(local) \u72b6\u6001 (open \u662f\u4e2d\u95f4\u6001)<\/p>\n<p>image<\/p>\n<p>311: \u6b64\u6d88\u606f\u4e2d\u8fd8\u5305\u542b\u4e00\u4e2a\u5ba2\u6237\u7aef\u53d1\u9001\u7ed9\u670d\u52a1\u7aef\u7684\u5e26 ACK \u7684 SETTINGS \u5e27<\/p>\n<p>312: \u670d\u52a1\u7aef\u4e5f\u54cd\u5e94\u5e26 ACK \u7684 SETTINGS \u5e27<\/p>\n<p>321: \u670d\u52a1\u7aef\u5728\u6d41 1 (\u6b64\u65f6\u72b6\u6001\u4e3a half-closed(remote)) \u4e0a\u53d1\u9001\u4e86\u56db\u4e2a PUSH_PROMISE \u5e27\uff0c\u5b83\u4eec\u5206\u522b\u4fdd\u7559\u4e86\u6d41 2\u30014\u30016\u30018 \u7528\u4e8e\u540e\u7eed\u63a8\u9001\uff0c<\/p>\n<p>image<\/p>\n<p>321: \u6b64\u6d88\u606f\u4e2d\u8fd8\u8fd4\u56de\u4e86\u4e0a\u9762\u8bf7\u6c42\u7684\u54cd\u5e94 (HEADERS &#8211; DATA)\uff0c\u6700\u540e DATA \u5e26\u4e0a END_STREAM\uff0c\u6d41 1 \u4ece half-closed \u8f6c\u4e3a closed<\/p>\n<p>329: \u8c03\u6574\u6d41\u4f18\u5148\u7ea7\uff0c\u4f9d\u8d56\u5173\u7cfb: 8 -&gt; 6 -&gt; 4 -&gt; 2 -&gt; 1 (\u90fd\u5e26\u6709\u72ec\u5360\u6807\u5fd7\uff0c\u800c\u4e14\u6743\u91cd\u5747\u4e3a 110)<\/p>\n<p>image<\/p>\n<p>342: \u6d41 1 \u5173\u95ed\u540e\uff0c\u6d41 2 \u5f97\u5230\u5206\u914d\u8d44\u6e90\uff0c\u670d\u52a1\u5668\u5f00\u59cb\u63a8\u9001\uff0c\u6570\u636e\u7531\u4e24\u4e2a DATA \u5e27\u8fd4\u56de<\/p>\n<p>344: \u6d41 2 \u7ed3\u675f\uff0c\u5f00\u59cb\u63a8\u9001\u6d41 4<\/p>\n<p>356: \u8c03\u6574\u4f9d\u8d56\u5173\u7cfb<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTc4YzUwYzM5M2Y0NDc3ZGYucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvNDg4L2Zvcm1hdC93ZWJw?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<pre><code class=\"hljs language-coffeescript\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-number\">1<\/span> <span class=\"hljs-number\">1<\/span> <span class=\"hljs-number\">1<\/span> <span class=\"hljs-number\">1<\/span>(w: <span class=\"hljs-number\">110<\/span>)<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| | | |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-number\">2<\/span> <span class=\"hljs-number\">2<\/span> <span class=\"hljs-number\">2<\/span> <span class=\"hljs-number\">2<\/span>(w: <span class=\"hljs-number\">110<\/span>)<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| | | |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-number\">4<\/span> =<span class=\"hljs-function\">=&gt;<\/span> <span class=\"hljs-number\">4<\/span> =<span class=\"hljs-function\">=&gt;<\/span> <span class=\"hljs-number\">6<\/span> =<span class=\"hljs-function\">=&gt;<\/span> <span class=\"hljs-number\">6<\/span>(w: <span class=\"hljs-number\">147<\/span>)<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| | | |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-number\">6<\/span> <span class=\"hljs-number\">8<\/span> <span class=\"hljs-number\">4<\/span> <span class=\"hljs-number\">8<\/span>(w: <span class=\"hljs-number\">147<\/span>)<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| | | |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-number\">8<\/span> <span class=\"hljs-number\">6<\/span> <span class=\"hljs-number\">8<\/span> <span class=\"hljs-number\">4<\/span>(w: <span class=\"hljs-number\">110<\/span>)<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-coffeescript\"><\/code><\/pre>\n<p>367\u3001369\u3001372: \u63a8\u9001 6 \u548c 8 \u7684\u6d41\u6570\u636e<\/p>\n<p>377: \u53d1\u8d77\u4e00\u4e2a\u8bf7\u6c42\uff0c\u6253\u5f00\u6d41 3\uff0c\u5176\u4e2d\u5ba2\u6237\u7aef\u53d1\u8d77\u7684\u8bf7\u6c42\u90fd\u662f\u4f9d\u8d56\u6d41 0x0<\/p>\n<p>\u4e4b\u540e\u90fd\u662f\u540c\u6837\u7684\u5957\u8def\u5b8c\u6210\u8bf7\u6c42 &#8211; \u54cd\u5e94\uff0c\u6700\u540e\u4ee5 GOAWAY \u5e27\u5173\u95ed\u8fde\u63a5\u7ed3\u675f<\/p>\n<h3><a name=\"t10\"><\/a>HPACK \u7b97\u6cd5<\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LWE2MjA5Yzk3MDE4MjA0ODEucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTIwMC9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>\u4e0a\u56fe\u6765\u81ea Ilya Grigorik \u7684 PPT &#8211;\u00a0<a href=\"https:\/\/blog.csdn.net\/z69183787\/article\/details\/106643647\/#references\" target=\"_blank\" rel=\"noopener\">HTTP\/2 is here, let&#8217;s optimize!<\/a><\/p>\n<p>\u53ef\u4ee5\u6e05\u695a\u5730\u770b\u5230 HTTP2 \u5934\u90e8\u4f7f\u7528\u7684\u4e5f\u662f\u952e\u503c\u5bf9\u5f62\u5f0f\u7684\u503c\uff0c\u800c\u4e14 HTTP1 \u5f53\u4e2d\u7684\u8bf7\u6c42\u884c\u4ee5\u53ca\u72b6\u6001\u884c\u4e5f\u88ab\u5206\u5272\u6210\u952e\u503c\u5bf9\uff0c\u8fd8\u6709\u6240\u6709\u952e\u90fd\u662f\u5c0f\u5199\uff0c\u4e0d\u540c\u4e8e HTTP1\u3002\u9664\u6b64\u4e4b\u5916\uff0c\u8fd8\u6709\u4e00\u4e2a\u5305\u542b\u9759\u6001\u7d22\u5f15\u8868\u548c\u52a8\u6001\u7d22\u5f15\u8868\u7684\u7d22\u5f15\u7a7a\u95f4\uff0c\u5b9e\u9645\u4f20\u8f93\u65f6\u4f1a\u628a\u5934\u90e8\u952e\u503c\u8868\u538b\u7f29\uff0c\u4f7f\u7528\u7684\u7b97\u6cd5\u5373 HPACK\uff0c\u5176\u539f\u7406\u5c31\u662f\u5339\u914d\u5f53\u524d\u8fde\u63a5\u5b58\u5728\u7684\u7d22\u5f15\u7a7a\u95f4\uff0c\u82e5\u67d0\u4e2a\u952e\u503c\u5df2\u5b58\u5728\uff0c\u5219\u7528\u76f8\u5e94\u7684\u7d22\u5f15\u4ee3\u66ff\u9996\u90e8\u6761\u76ee\uff0c\u6bd4\u5982 \u201c:method: GET\u201d \u53ef\u4ee5\u5339\u914d\u5230\u9759\u6001\u7d22\u5f15\u4e2d\u7684 index 2\uff0c\u4f20\u8f93\u65f6\u53ea\u9700\u8981\u4f20\u8f93\u4e00\u4e2a\u5305\u542b 2 \u7684\u5b57\u8282\u5373\u53ef\uff1b\u82e5\u7d22\u5f15\u7a7a\u95f4\u4e2d\u4e0d\u5b58\u5728\uff0c\u5219\u7528\u5b57\u7b26\u7f16\u7801\u4f20\u8f93\uff0c\u5b57\u7b26\u7f16\u7801\u53ef\u4ee5\u9009\u62e9\u54c8\u592b\u66fc\u7f16\u7801\uff0c\u7136\u540e\u5206\u60c5\u51b5\u5224\u65ad\u662f\u5426\u9700\u8981\u5b58\u5165\u52a8\u6001\u7d22\u5f15\u8868\u4e2d<\/p>\n<p>\u7d22\u5f15\u8868<\/p>\n<p>\u9759\u6001\u7d22\u5f15<\/p>\n<p>\u9759\u6001\u7d22\u5f15\u8868\u662f\u56fa\u5b9a\u7684\uff0c\u5bf9\u4e8e\u5ba2\u6237\u7aef\u670d\u52a1\u7aef\u90fd\u4e00\u6837\uff0c\u76ee\u524d\u534f\u8bae\u5546\u5b9a\u7684\u9759\u6001\u7d22\u5f15\u5305\u542b 61 \u4e2a\u952e\u503c\uff0c\u8be6\u89c1\u00a0<a href=\"https:\/\/httpwg.org\/specs\/rfc7541.html#static.table.definition\" target=\"_blank\" rel=\"noopener\">Static Table Definition &#8211; RFC 7541<\/a><\/p>\n<p>\u6bd4\u5982\u524d\u51e0\u4e2a\u5982\u4e0b<\/p>\n<div class=\"table-box\">\n<table>\n<thead>\n<tr>\n<th>\u7d22\u5f15<\/th>\n<th>\u5b57\u6bb5\u503c<\/th>\n<th>\u952e\u503c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>index<\/td>\n<td>Header Name<\/td>\n<td>Header Value<\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>:authority<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>:method<\/td>\n<td>GET<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>:method<\/td>\n<td>POST<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>:path<\/td>\n<td>\/<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>:path<\/td>\n<td>\/index.html<\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td>:scheme<\/td>\n<td>http<\/td>\n<\/tr>\n<tr>\n<td>7<\/td>\n<td>:scheme<\/td>\n<td>https<\/td>\n<\/tr>\n<tr>\n<td>8<\/td>\n<td>:status<\/td>\n<td>200<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>\u52a8\u6001\u7d22\u5f15<\/p>\n<p>\u52a8\u6001\u7d22\u5f15\u8868\u662f\u4e00\u4e2a FIFO \u961f\u5217\u7ef4\u62a4\u7684\u6709\u7a7a\u95f4\u9650\u5236\u7684\u8868\uff0c\u91cc\u9762\u542b\u6709\u975e\u9759\u6001\u8868\u7684\u7d22\u5f15\u3002<br \/>\n\u52a8\u6001\u7d22\u5f15\u8868\u662f\u9700\u8981\u8fde\u63a5\u53cc\u65b9\u7ef4\u62a4\u7684\uff0c\u5176\u5185\u5bb9\u57fa\u4e8e\u8fde\u63a5\u4e0a\u4e0b\u6587\uff0c\u4e00\u4e2a HTTP2 \u8fde\u63a5\u6709\u4e14\u4ec5\u6709\u4e00\u4efd\u52a8\u6001\u8868\u3002<br \/>\n\u5f53\u4e00\u4e2a\u9996\u90e8\u5339\u914d\u4e0d\u5230\u7d22\u5f15\u65f6\uff0c\u53ef\u4ee5\u9009\u62e9\u628a\u5b83\u63d2\u5165\u52a8\u6001\u7d22\u5f15\u8868\u4e2d\uff0c\u4e0b\u6b21\u540c\u540d\u7684\u503c\u5c31\u53ef\u80fd\u4f1a\u5728\u8868\u4e2d\u67e5\u5230\u7d22\u5f15\u5e76\u66ff\u6362\u3002<br \/>\n\u4f46\u662f\u5e76\u975e\u6240\u6709\u9996\u90e8\u952e\u503c\u90fd\u4f1a\u5b58\u5165\u52a8\u6001\u7d22\u5f15\uff0c\u56e0\u4e3a\u52a8\u6001\u7d22\u5f15\u8868\u662f\u6709\u7a7a\u95f4\u9650\u5236\u7684\uff0c\u6700\u5927\u503c\u7531 SETTING \u5e27\u4e2d\u7684 SETTINGS_HEADER_TABLE_SIZE (\u9ed8\u8ba4 4096 \u5b57\u8282) \u8bbe\u7f6e<\/p>\n<ul>\n<li>\u5982\u4f55\u8ba1\u7b97\u52a8\u6001\u7d22\u5f15\u8868\u7684\u5927\u5c0f (Table Size):<\/li>\n<\/ul>\n<p>\u5927\u5c0f\u5747\u4ee5\u5b57\u8282\u4e3a\u5355\u4f4d\uff0c\u52a8\u6001\u7d22\u5f15\u8868\u7684\u5927\u5c0f\u7b49\u4e8e\u6240\u6709\u6761\u76ee\u5927\u5c0f\u4e4b\u548c\uff0c\u6bcf\u4e2a\u6761\u76ee\u7684\u5927\u5c0f = \u5b57\u6bb5\u957f\u5ea6 + \u952e\u503c\u957f\u5ea6 + 32<\/p>\n<blockquote><p>\u8fd9\u4e2a\u989d\u5916\u7684 32 \u5b57\u8282\u662f\u9884\u4f30\u7684\u6761\u76ee\u5f00\u9500\uff0c\u6bd4\u5982\u4e00\u4e2a\u6761\u76ee\u4f7f\u7528\u4e86\u4e24\u4e2a 64-bit \u6307\u9488\u5206\u522b\u6307\u5411\u5b57\u6bb5\u548c\u952e\u503c\uff0c\u5e76\u4f7f\u7528\u4e24\u4e2a 64-bit \u6574\u6570\u6765\u8bb0\u5f55\u5b57\u6bb5\u548c\u952e\u503c\u7684\u5f15\u7528\u6b21\u6570<\/p>\n<p>golang \u5b9e\u73b0\u4e5f\u662f\u52a0\u4e0a\u4e86 32:\u00a0<a href=\"https:\/\/github.com\/golang\/net\/blob\/db08ff08e8622530d9ed3a0e8ac279f6d4c02196\/http2\/hpack\/hpack.go#L61\" target=\"_blank\" rel=\"noopener\">golang.org\/x\/net\/http2\/hpack\/hpack.go#L61<\/a><\/p><\/blockquote>\n<p>SETTING \u5e27\u89c4\u5b9a\u4e86\u52a8\u6001\u8868\u7684\u6700\u5927\u5927\u5c0f\uff0c\u4f46\u7f16\u7801\u5668\u53ef\u4ee5\u53e6\u5916\u9009\u62e9\u4e00\u4e2a\u6bd4 SETTINGS_HEADER_TABLE_SIZE \u5c0f\u7684\u503c\u4f5c\u4e3a\u52a8\u6001\u8868\u7684\u6709\u6548\u8d1f\u8f7d\u91cf<\/p>\n<ul>\n<li>\u5982\u4f55\u66f4\u65b0\u52a8\u6001\u7d22\u5f15\u8868\u7684\u6700\u5927\u5bb9\u91cf<\/li>\n<\/ul>\n<p>\u4fee\u6539\u6700\u5927\u52a8\u6001\u8868\u5bb9\u91cf\u53ef\u4ee5\u53d1\u9001\u4e00\u4e2a\u00a0<code>dynamic table size update<\/code>\u00a0\u4fe1\u53f7\u6765\u66f4\u6539:<\/p>\n<pre><code class=\"hljs language-diff\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| 0 | 0 | 1 | Max size (5+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-diff\"><\/code><\/pre>\n<p>\u524d\u7f00 001 \u4ee3\u8868\u6b64\u5b57\u8282\u4e3a\u00a0<code>dynamic table size update<\/code>\u00a0\u4fe1\u53f7\uff0c\u540e\u9762\u4f7f\u7528\u00a0<strong>N=5 \u7684\u6574\u6570\u7f16\u7801\u65b9\u6cd5<\/strong>\u8868\u793a\u65b0\u7684\u6700\u5927\u52a8\u6001\u8868\u5bb9\u91cf(\u4e0d\u80fd\u8d85\u8fc7 SETTINGS_HEADER_TABLE_SIZE)\uff0c\u5176\u8ba1\u7b97\u65b9\u6cd5\u4e0b\u6587\u4f1a\u4ecb\u7ecd\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f\u8fd9\u4e2a\u4fe1\u53f7\u5fc5\u987b\u5728\u9996\u90e8\u5757\u53d1\u9001\u4e4b\u524d\u6216\u8005\u4e24\u4e2a\u9996\u90e8\u5757\u4f20\u8f93\u7684\u95f4\u9694\u53d1\u9001\uff0c\u53ef\u4ee5\u901a\u8fc7\u53d1\u9001\u4e00\u4e2a Max size \u4e3a 0 \u7684\u66f4\u65b0\u4fe1\u53f7\u6765\u6e05\u7a7a\u73b0\u6709\u52a8\u6001\u8868<\/p>\n<ul>\n<li>\u52a8\u6001\u7d22\u5f15\u8868\u4ec0\u4e48\u65f6\u5019\u9700\u8981\u9a71\u9010\u6761\u76ee<\/li>\n<\/ul>\n<ol>\n<li>\u6bcf\u5f53\u51fa\u73b0\u8868\u5927\u5c0f\u66f4\u65b0\u7684\u4fe1\u53f7\u65f6\uff0c\u9700\u8981\u5224\u65ad\u5e76\u9a71\u9010\u961f\u5c3e\u7684\u6761\u76ee\uff0c\u5373\u65e7\u7684\u7d22\u5f15\uff0c\u76f4\u5230\u5f53\u524d\u5927\u5c0f\u5c0f\u4e8e\u7b49\u4e8e\u65b0\u7684\u5bb9\u91cf<\/li>\n<li>\u6bcf\u5f53\u63d2\u5165\u65b0\u6761\u76ee\u65f6\uff0c\u9700\u8981\u5224\u65ad\u5e76\u9a71\u9010\u961f\u5c3e\u7684\u6761\u76ee\uff0c\u76f4\u5230\u5f53\u524d\u5927\u5c0f\u5c0f\u4e8e\u7b49\u4e8e\u5bb9\u91cf\u3002\u8fd9\u4e2a\u60c5\u5f62\u4e0b\u63d2\u5165\u4e00\u4e2a\u6bd4 Max size \u8fd8\u5927\u7684\u65b0\u6761\u76ee\u4e0d\u4f1a\u89c6\u4f5c\u9519\u8bef\uff0c\u4f46\u5176\u7ed3\u679c\u662f\u4f1a\u6e05\u7a7a\u52a8\u6001\u7d22\u5f15\u8868<\/li>\n<\/ol>\n<blockquote><p>\u5173\u4e8e\u52a8\u6001\u7d22\u5f15\u8868\u5982\u4f55\u7ba1\u7406\u7684\uff0c\u63a8\u8350\u770b\u4e0b golang \u7684\u5b9e\u73b0:\u00a0<a href=\"https:\/\/github.com\/golang\/net\/blob\/db08ff08e8622530d9ed3a0e8ac279f6d4c02196\/http2\/hpack\/hpack.go#L157\" target=\"_blank\" rel=\"noopener\">golang.org\/x\/net\/http2\/hpack\/hpack.go#L157<\/a>\uff0c\u901a\u8fc7\u4ee3\u7801\u80fd\u66f4\u660e\u767d\u8fd9\u4e2a\u8fc7\u7a0b<\/p><\/blockquote>\n<p>\u7d22\u5f15\u5730\u5740\u7a7a\u95f4<\/p>\n<p>\u7531\u9759\u6001\u7d22\u5f15\u8868\u548c\u52a8\u6001\u7d22\u5f15\u8868\u53ef\u4ee5\u7ec4\u6210\u4e00\u4e2a\u7d22\u5f15\u5730\u5740\u7a7a\u95f4:<\/p>\n<pre><code class=\"hljs language-haskell\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">&lt;-<span class=\"hljs-comment\">&#8212;&#8212;&#8212; Index Address Space &#8212;&#8212;&#8212;-&gt;<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">&lt;&#8211; <span class=\"hljs-type\">Static<\/span> <span class=\"hljs-type\">Table<\/span> <span class=\"hljs-comment\">&#8211;&gt; &lt;&#8211; Dynamic Table &#8211;&gt;<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+<span class=\"hljs-comment\">&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;+ +&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| <span class=\"hljs-number\">1<\/span> | &#8230; | s | |s+<span class=\"hljs-number\">1<\/span>| &#8230; |s+k|<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+<span class=\"hljs-comment\">&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;+ +&#8212;+&#8212;&#8212;&#8212;&#8211;+&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">\u234b |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| \u2352<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-type\">Insertion<\/span> <span class=\"hljs-type\">Point<\/span> <span class=\"hljs-type\">Dropping<\/span> <span class=\"hljs-type\">Point<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-haskell\"><\/code><\/pre>\n<p>\u76ee\u524d s \u5c31\u662f 61\uff0c\u800c\u6709\u65b0\u952e\u503c\u8981\u63d2\u5165\u52a8\u6001\u7d22\u5f15\u8868\u65f6\uff0c\u4ece index 62 \u5f00\u59cb\u63d2\u5165\u961f\u5217\uff0c\u6240\u4ee5\u52a8\u6001\u7d22\u5f15\u8868\u4e2d\u7d22\u5f15\u4ece\u5c0f\u5230\u5927\u4f9d\u6b21\u5b58\u7740\u4ece\u65b0\u5230\u65e7\u7684\u952e\u503c<\/p>\n<p>\u7f16\u7801\u7c7b\u578b\u8868\u793a<\/p>\n<p>HPACK \u7f16\u7801\u4f7f\u7528\u4e24\u79cd\u539f\u59cb\u7c7b\u578b: \u65e0\u7b26\u53f7\u53ef\u53d8\u957f\u5ea6\u6574\u6570\u548c\u516b\u4f4d\u5b57\u8282\u8868\u793a\u7684\u5b57\u7b26\u4e32\uff0c\u76f8\u5e94\u5730\u89c4\u5b9a\u4e86\u4ee5\u4e0b\u4e24\u79cd\u7f16\u7801\u65b9\u5f0f<\/p>\n<p>\u6574\u6570\u7f16\u7801<\/p>\n<p>\u4e00\u4e2a\u6574\u6570\u7f16\u7801\u53ef\u4ee5\u7528\u4e8e\u8868\u793a\u5b57\u6bb5\u7d22\u5f15\u503c\u3001\u9996\u90e8\u6761\u76ee\u7d22\u5f15\u503c\u6216\u8005\u5b57\u7b26\u4e32\u957f\u5ea6\u3002<br \/>\n\u4e00\u4e2a\u6574\u6570\u7f16\u7801\u542b\u4e24\u90e8\u5206: \u4e00\u4e2a\u524d\u7f00\u5b57\u8282\u548c\u53ef\u9009\u7684\u540e\u8ddf\u5b57\u8282\u5e8f\u5217\uff0c\u53ea\u6709\u524d\u7f00\u5b57\u8282\u4e0d\u8db3\u4ee5\u8868\u8fbe\u6574\u6570\u503c\u65f6\u624d\u9700\u8981\u540e\u8ddf\u5b57\u8282\uff0c<strong>\u524d\u7f00\u5b57\u8282\u4e2d\u53ef\u7528\u6bd4\u7279\u4f4d N \u662f\u6574\u6570\u7f16\u7801\u7684\u4e00\u4e2a\u53c2\u6570<\/strong><\/p>\n<p>\u6bd4\u5982\u4e0b\u9762\u6240\u793a\u7684\u662f\u4e00\u4e2a N=5 \u7684\u6574\u6570\u7f16\u7801(\u524d\u4e09\u6bd4\u7279\u7528\u4e8e\u5176\u4ed6\u6807\u8bc6)\uff0c\u5982\u679c\u6211\u4eec\u8981\u7f16\u7801\u7684\u6574\u6570\u503c\u5c0f\u4e8e 2^N &#8211; 1\uff0c\u76f4\u63a5\u7528\u4e00\u4e2a\u524d\u7f00\u5b57\u8282\u8868\u793a\u5373\u53ef\uff0c\u6bd4\u5982 10 \u5c31\u7528\u00a0<code>???01010<\/code>\u00a0\u8868\u793a<\/p>\n<pre><code class=\"hljs language-diff\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| ? | ? | ? | Value |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;+&#8212;+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-diff\"><\/code><\/pre>\n<p>\u5982\u679c\u8981\u7f16\u7801\u7684\u6574\u6570\u503c X \u5927\u4e8e\u7b49\u4e8e 2^N &#8211; 1\uff0c\u524d\u7f00\u5b57\u8282\u7684\u53ef\u7528\u6bd4\u7279\u4f4d\u90fd\u8bbe\u6210 1\uff0c\u7136\u540e\u628a X \u51cf\u53bb 2^N &#8211; 1 \u5f97\u5230\u503c R\uff0c\u5e76\u7528\u4e00\u4e2a\u6216\u591a\u4e2a\u5b57\u8282\u5e8f\u5217\u8868\u793a R\uff0c\u5b57\u8282\u5e8f\u5217\u4e2d\u6bcf\u4e2a\u5b57\u8282\u7684\u6700\u9ad8\u6709\u6548\u4f4d (msb) \u7528\u4e8e\u8868\u793a\u662f\u5426\u7ed3\u675f\uff0c<strong>msb \u8bbe\u4e3a 0 \u65f6\u4ee3\u8868\u662f\u6700\u540e\u4e00\u4e2a\u5b57\u8282<\/strong>\u3002\u5177\u4f53\u7f16\u7801\u770b\u4e0b\u9762\u7684\u4f2a\u4ee3\u7801\u548c\u4f8b\u5b50<\/p>\n<pre><code class=\"hljs language-diff\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| ? | ? | ? | 1 1 1 1 1 |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;+&#8212;+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| 1 | Value-(2^N-1) LSB |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">&#8230;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| 0 | Value-(2^N-1) MSB |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-diff\"><\/code><\/pre>\n<p>\u7f16\u7801:<\/p>\n<pre><code class=\"hljs language-csharp\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-keyword\">if<\/span> I &lt; <span class=\"hljs-number\">2<\/span>^N &#8211; <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-function\">encode I <span class=\"hljs-keyword\">on<\/span> N bits<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">else<\/span><\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-function\"> <span class=\"hljs-title\">encode<\/span> (<span class=\"hljs-params\"><span class=\"hljs-number\">2<\/span>^N &#8211; <span class=\"hljs-number\">1<\/span><\/span>) <span class=\"hljs-keyword\">on<\/span> N bits<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-function\"> I<\/span> = I &#8211; (<span class=\"hljs-number\">2<\/span>^N &#8211; <span class=\"hljs-number\">1<\/span>)<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-keyword\">while<\/span> I &gt;= <span class=\"hljs-number\">128<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">encode (I % <span class=\"hljs-number\">128<\/span> + <span class=\"hljs-number\">128<\/span>) <span class=\"hljs-keyword\">on<\/span> <span class=\"hljs-number\">8<\/span> bits<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">I = I \/ <span class=\"hljs-number\">128<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">encode I <span class=\"hljs-keyword\">on<\/span> <span class=\"hljs-number\">8<\/span> bits<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-csharp\"><\/code><\/pre>\n<p>\u89e3\u7801:<\/p>\n<p>&nbsp;<\/p>\n<pre><code class=\"hljs language-r\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">decode I from the <span class=\"hljs-keyword\">next<\/span> N bits<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-keyword\">if<\/span> I <span class=\"hljs-operator\">&lt;<\/span> <span class=\"hljs-number\">2<\/span><span class=\"hljs-operator\">^<\/span>N <span class=\"hljs-operator\">&#8211;<\/span> <span class=\"hljs-number\">1<\/span><span class=\"hljs-punctuation\">,<\/span> <span class=\"hljs-built_in\">return<\/span> I<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-keyword\">else<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">M <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-number\">0<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-keyword\">repeat<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">B <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">next<\/span> octet<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">I <span class=\"hljs-operator\">=<\/span> I <span class=\"hljs-operator\">+<\/span> <span class=\"hljs-punctuation\">(<\/span>B <span class=\"hljs-operator\">&amp;<\/span> <span class=\"hljs-number\">127<\/span><span class=\"hljs-punctuation\">)<\/span> <span class=\"hljs-operator\">*<\/span> <span class=\"hljs-number\">2<\/span><span class=\"hljs-operator\">^<\/span>M<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">M <span class=\"hljs-operator\">=<\/span> M <span class=\"hljs-operator\">+<\/span> <span class=\"hljs-number\">7<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-keyword\">while<\/span> B <span class=\"hljs-operator\">&amp;<\/span> <span class=\"hljs-number\">128<\/span> <span class=\"hljs-operator\">==<\/span> <span class=\"hljs-number\">128<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"10\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-built_in\">return<\/span> I<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-r\"><\/code><\/pre>\n<p>\u6bd4\u5982\u4f7f\u7528 N=5 \u7684\u6574\u6570\u7f16\u7801\u8868\u793a 1337:<\/p>\n<p>1337 \u5927\u4e8e 31 (2^5 &#8211; 1), \u5c06\u524d\u7f00\u5b57\u8282\u540e\u4e94\u4f4d\u586b\u6ee1 1<\/p>\n<p>I = 1337 &#8211; (2^5 &#8211; 1) = 1306<\/p>\n<p>I \u4ecd\u7136\u5927\u4e8e 128, I % 128 = 26, 26 + 128 = 154<\/p>\n<p>154 \u4e8c\u8fdb\u5236\u7f16\u7801: 10011010, \u8fd9\u5373\u662f\u7b2c\u4e00\u4e2a\u540e\u8ddf\u5b57\u8282<\/p>\n<p>I = 1306 \/ 128 = 10, I \u5c0f\u4e8e 128, \u5faa\u73af\u7ed3\u675f<\/p>\n<p>\u5c06 I \u7f16\u7801\u6210\u4e8c\u8fdb\u5236: 00001010, \u8fd9\u5373\u662f\u6700\u540e\u4e00\u4e2a\u5b57\u8282<\/p>\n<pre><code class=\"hljs language-diff\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| X | X | X | 1 | 1 | 1 | 1 | 1 | Prefix = 31, I = 1306<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1306 &gt;= 128, encode(154), I=1306\/128=10<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 10 &lt; 128, encode(10), done<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-diff\"><\/code><\/pre>\n<p>\u89e3\u7801\u65f6\u8bfb\u53d6\u7b2c\u4e00\u4e2a\u5b57\u8282\uff0c\u53d1\u73b0\u540e\u4e94\u4f4d (11111) \u5bf9\u5e94\u7684\u503c I \u7b49\u4e8e 31(&gt;= 2^N &#8211; 1)\uff0c\u8bf4\u660e\u8fd8\u6709\u540e\u8ddf\u5b57\u8282\uff1b\u4ee4 M=0\uff0c\u7ee7\u7eed\u8bfb\u4e0b\u4e00\u4e2a\u5b57\u8282 B\uff0cI = I + (B &amp; 127) * 2^M = 31 + 26 * 1 = 57\uff0cM = M + 7 = 7\uff0c\u6700\u9ad8\u6709\u6548\u4f4d\u4e3a 1\uff0c\u8868\u793a\u5b57\u8282\u5e8f\u5217\u672a\u7ed3\u675f\uff0cB \u6307\u5411\u4e0b\u4e00\u4e2a\u5b57\u8282\uff1bI = I + (B &amp; 127) * 2^M = 57 + 10 * 128 = 1337\uff0c\u6700\u9ad8\u6709\u6548\u4f4d\u4e3a 0\uff0c\u8868\u793a\u5b57\u8282\u7801\u7ed3\u675f\uff0c\u8fd4\u56de I<\/p>\n<blockquote><p>\u8fd9\u91cc\u4e5f\u53ef\u4ee5\u8fd9\u6837\u5904\u7406 1306: 1306 = 0x51a = (0101 0001 1010)B\uff0c\u5c06 bit \u5e8f\u5217\u4ece\u4f4e\u5230\u9ad8\u6309 7 \u4e2a\u4e00\u7ec4\u5206\u7ec4\uff0c\u5219\u6709\u7b2c\u4e00\u7ec4 001 1010\uff0c\u7b2c\u4e8c\u7ec4 000 1010\uff0c\u52a0\u4e0a\u6700\u9ad8\u6709\u6548\u4f4d 0\/1 \u4fbf\u4e0e\u4e0a\u9762\u7684\u540e\u8ddf\u5b57\u8282\u5bf9\u5e94<\/p><\/blockquote>\n<p>\u5b57\u7b26\u7f16\u7801<\/p>\n<p>\u4e00\u4e2a\u5b57\u7b26\u4e32\u53ef\u80fd\u4ee3\u8868 Header \u6761\u76ee\u7684\u5b57\u6bb5\u6216\u8005\u952e\u503c\u3002\u5b57\u7b26\u7f16\u7801\u4f7f\u7528\u5b57\u8282\u5e8f\u5217\u8868\u793a\uff0c\u8981\u4e48\u76f4\u63a5\u4f7f\u7528\u5b57\u7b26\u7684\u516b\u4f4d\u5b57\u8282\u7801\u8981\u4e48\u4f7f\u7528\u54c8\u592b\u66fc\u7f16\u7801\u3002<\/p>\n<pre><code class=\"hljs language-diff\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| H | String Length (7+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| String Data (Length octets) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-diff\"><\/code><\/pre>\n<ul>\n<li>H: \u4e00\u4e2a\u6bd4\u7279\u4f4d\u8868\u793a\u662f\u5426\u4f7f\u7528\u54c8\u592b\u66fc\u7f16\u7801<\/li>\n<li>String Length: \u4ee3\u8868\u5b57\u8282\u5e8f\u5217\u957f\u5ea6\uff0c\u5373 String Data \u7684\u957f\u5ea6\uff0c\u4f7f\u7528 N=7 \u7684\u6574\u6570\u7f16\u7801\u65b9\u5f0f\u8868\u793a<\/li>\n<li>String Data: \u5b57\u7b26\u4e32\u7684\u516b\u4f4d\u5b57\u8282\u7801\u5e8f\u5217\u8868\u793a\uff0c\u5982\u679c H \u4e3a 0\uff0c\u5219\u6b64\u5904\u5c31\u662f\u539f\u5b57\u7b26\u7684\u516b\u4f4d\u5b57\u8282\u7801\u8868\u793a\uff1b\u5982\u679c H \u4e3a 1\uff0c\u5219\u6b64\u5904\u4e3a\u539f\u5b57\u7b26\u7684\u54c8\u592b\u66fc\u7f16\u7801<\/li>\n<\/ul>\n<p>RFC 7541 \u7ed9\u51fa\u4e86\u4e00\u4efd\u5b57\u7b26\u7684\u54c8\u592b\u66fc\u7f16\u7801\u8868:\u00a0<a href=\"https:\/\/httpwg.org\/specs\/rfc7541.html#huffman.code\" target=\"_blank\" rel=\"noopener\">Huffman Code<\/a>\uff0c\u8fd9\u662f\u57fa\u4e8e\u5927\u91cf HTTP \u9996\u90e8\u6570\u636e\u751f\u6210\u7684\u54c8\u592b\u66fc\u7f16\u7801\u3002<\/p>\n<ul>\n<li>\u5f53\u4e2d\u7b2c\u4e00\u5217 (sym) \u8868\u793a\u8981\u7f16\u7801\u7684\u5b57\u7b26\uff0c\u6700\u540e\u7684\u7279\u6b8a\u5b57\u7b26 \u201cEOS\u201d \u4ee3\u8868\u5b57\u7b26\u4e32\u7ed3\u675f<\/li>\n<li>\u7b2c\u4e8c\u5217 (code as bits) \u662f\u4e8c\u8fdb\u5236\u54c8\u592b\u66fc\u7f16\u7801\uff0c\u5411\u6700\u9ad8\u6709\u6548\u4f4d\u5bf9\u9f50<\/li>\n<li>\u7b2c\u4e09\u5217 (code as hex) \u662f\u5341\u516d\u8fdb\u5236\u54c8\u592b\u66fc\u7f16\u7801\uff0c\u5411\u6700\u4f4e\u6709\u6548\u4f4d\u5bf9\u9f50<\/li>\n<li>\u6700\u540e\u4e00\u5217 (len) \u4ee3\u8868\u7f16\u7801\u957f\u5ea6\uff0c\u5355\u4f4d bit<\/li>\n<\/ul>\n<p>\u4f7f\u7528\u54c8\u592b\u66fc\u7f16\u7801\u53ef\u80fd\u5b58\u5728\u7f16\u7801\u4e0d\u662f\u6574\u5b57\u8282\u7684\uff0c\u4f1a\u5728\u540e\u9762\u586b\u5145 1 \u4f7f\u5176\u53d8\u6210\u6574\u5b57\u8282<\/p>\n<p>\u6bd4\u5982\u4e0b\u9762\u7684\u4f8b\u5b50:<\/p>\n<p>Literal Header Field with Incremental Indexing &#8211; Indexed Name<\/p>\n<p><code>:authority: blog.wangriyu.wang<\/code>\u00a0\u9996\u90e8\u5bf9\u5e94\u7684\u7f16\u7801\u4e3a:<\/p>\n<pre><code class=\"hljs language-bash\">41 8e 8e 83 cc bf 81 d5    35 86 f5 6a fe 07 54 <span class=\"hljs-built_in\">df<\/span>\r\n<\/code><\/pre>\n<p><code>Literal Header Field with Incremental Indexing \u2014 Indexed Name<\/code>\u00a0\u7684\u7f16\u7801\u683c\u5f0f\u89c1\u4e0b\u6587<\/p>\n<p>41 (0100 0001) \u8868\u793a\u5b57\u6bb5\u5b58\u5728\u7d22\u5f15\u503c 1\uff0c\u5373\u5bf9\u5e94\u9759\u6001\u8868\u4e2d\u7b2c\u4e00\u9879 :authority<\/p>\n<p>8e (1000 1110) \u6700\u9ad8\u6709\u6548\u4f4d\u4e3a 1 \u8868\u793a\u952e\u503c\u4f7f\u7528\u54c8\u592b\u66fc\u7f16\u7801\uff0c000 1110 \u8868\u793a\u5b57\u8282\u5e8f\u5217\u957f\u5ea6\u4e3a 14<\/p>\n<p>\u540e\u9762\u00a0<code>8e 83 cc bf 81 d5 35 86 f5 6a fe 07 54 df<\/code>\u00a0\u662f\u4e00\u6bb5\u54c8\u592b\u66fc\u7f16\u7801\u5e8f\u5217<\/p>\n<p>\u7531\u54c8\u592b\u66fc\u7f16\u7801\u8868\u53ef\u77e5 100011 -&gt; &#8216;b&#8217;, 101000 -&gt; &#8216;l&#8217;, 00111 -&gt; &#8216;o&#8217;, 100110 -&gt; &#8216;g&#8217;, 010111 -&gt; &#8216;.&#8217;, 1111000 -&gt; &#8216;w&#8217;, 00011 -&gt; &#8216;a&#8217;, 101010 -&gt; &#8216;n&#8217;, 100110 -&gt; &#8216;g&#8217;, 101100 -&gt; &#8216;r&#8217;, 00110 -&gt; &#8216;i&#8217;, 1111010 -&gt; &#8216;y&#8217;, 101101 -&gt; &#8216;u&#8217;<\/p>\n<pre><code class=\"hljs language-bash\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">8e 83 cc bf 81 d5 35 86 f5 6a fe 07 54 <span class=\"hljs-built_in\">df<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">|<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">\u2352<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">1000 1110 1000 0011 1100 1100 1011 1111 1000 0001 1101 0101 0011 0101 1000 0110 1111 0101 0110 1010 1111 1110 0000 0111 0101 0100 1101 1111<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">|<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">\u2352<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">100011 101000 00111 100110 010111 1111000 00011 101010 100110 101100 00110 1111010 101101 010111 1111000 00011 101010 100110 11111<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">|<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">\u2352<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"10\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">blog.wangriyu.wang \u6700\u540e 11111 \u7528\u4e8e\u586b\u5145<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-bash\"><\/code><\/pre>\n<p>\u4e8c\u8fdb\u5236\u7f16\u7801<\/p>\n<p>\u73b0\u5728\u5f00\u59cb\u662f HPACK \u771f\u6b63\u7684\u7f16\u89e3\u7801\u89c4\u8303<\/p>\n<p>\u5df2\u7d22\u5f15\u9996\u90e8\u6761\u76ee\u8868\u793a (Indexed Header Field Representation)<\/p>\n<ul>\n<li><code>Indexed Header Field<\/code><\/li>\n<\/ul>\n<p>\u4ee5 1 \u5f00\u59cb\u4e3a\u6807\u8bc6\uff0c\u80fd\u5728\u7d22\u5f15\u7a7a\u95f4\u5339\u914d\u5230\u7d22\u5f15\u7684\u9996\u90e8\u4f1a\u66ff\u6362\u6210\u8fd9\u79cd\u5f62\u5f0f\uff0c\u540e\u9762\u7684 index \u4f7f\u7528\u4e0a\u8ff0\u7684\u6574\u6570\u7f16\u7801\u65b9\u5f0f\u4e14 N = 7\u3002<br \/>\n\u6bd4\u5982\u00a0<code>:method: GET<\/code>\u00a0\u53ef\u4ee5\u7528 0x82\uff0c\u5373 10000010 \u8868\u793a<\/p>\n<pre><code class=\"hljs language-diff\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| 1 | Index (7+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-addition\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-diff\"><\/code><\/pre>\n<p>Indexed Header Field<\/p>\n<p>\u672a\u7d22\u5f15\u6587\u5b57\u9996\u90e8\u6761\u76ee\u8868\u793a (Literal Header Field Representation)<\/p>\n<p>\u5c1a\u672a\u88ab\u7d22\u5f15\u7684\u9996\u90e8\u6709\u4e09\u79cd\u8868\u793a\u5f62\u5f0f\uff0c\u7b2c\u4e00\u79cd\u4f1a\u6dfb\u52a0\u8fdb\u7d22\u5f15\uff0c\u7b2c\u4e8c\u79cd\u5bf9\u4e8e\u5f53\u524d\u8df3\u6765\u8bf4\u4e0d\u4f1a\u6dfb\u52a0\u8fdb\u7d22\u5f15\uff0c\u7b2c\u4e09\u79cd\u7edd\u5bf9\u4e0d\u88ab\u5141\u8bb8\u6dfb\u52a0\u8fdb\u7d22\u5f15<\/p>\n<ol>\n<li>\u4f1a\u6dfb\u52a0\u7d22\u5f15\u7684\u6587\u5b57\u9996\u90e8 (Literal Header Field with Incremental Indexing)<\/li>\n<\/ol>\n<p>\u4ee5 01 \u5f00\u59cb\u4e3a\u6807\u8bc6\uff0c\u6b64\u9996\u90e8\u4f1a\u52a0\u5165\u5230\u89e3\u7801\u540e\u7684\u9996\u90e8\u5217\u8868 (Header List) \u4e2d\u5e76\u4e14\u4f1a\u628a\u5b83<strong>\u4f5c\u4e3a\u65b0\u6761\u76ee\u63d2\u5165\u5230\u52a8\u6001\u7d22\u5f15\u8868\u4e2d<\/strong><\/p>\n<ul>\n<li><code>Literal Header Field with Incremental Indexing \u2014 Indexed Name<\/code><\/li>\n<\/ul>\n<p>\u5982\u679c\u5b57\u6bb5\u5df2\u7ecf\u5b58\u5728\u7d22\u5f15\uff0c\u4f46\u952e\u503c\u672a\u88ab\u7d22\u5f15\uff0c\u6bd4\u5982\u9996\u90e8\u00a0<code>:authority: blog.wangriyu.wang<\/code>\u00a0\u7684\u5b57\u6bb5\u00a0<code>:authority<\/code>\u00a0\u5df2\u5b58\u5728\u7d22\u5f15\u4f46\u952e\u503c\u00a0<code>blog.wangriyu.wang<\/code>\u00a0\u4e0d\u5b58\u5728\u7d22\u5f15\uff0c\u5219\u4f1a\u66ff\u6362\u6210\u5982\u4e0b\u5f62\u5f0f (index \u4f7f\u7528 N=6 \u7684\u6574\u6570\u7f16\u7801\u8868\u793a)<\/p>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| 0 | 1 | Index (6+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| H | Value Length (7+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| Value String (Length octets) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<p>Literal Header Field with Incremental Indexing &#8211; Indexed Name<\/p>\n<ul>\n<li><code>Literal Header Field with Incremental Indexing \u2014 New Name<\/code><\/li>\n<\/ul>\n<p>\u5982\u679c\u5b57\u6bb5\u548c\u952e\u503c\u5747\u672a\u88ab\u7d22\u5f15\uff0c\u6bd4\u5982\u00a0<code>upgrade-insecure-requests: 1<\/code>\uff0c\u5219\u4f1a\u66ff\u6362\u6210\u5982\u4e0b\u5f62\u5f0f<\/p>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| 0 | 1 | 0 |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| H | Name Length (7+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| Name String (Length octets) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| H | Value Length (7+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"10\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| Value String (Length octets) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"11\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<p>Literal Header Field with Incremental Indexing \u2014 New Name<\/p>\n<ol>\n<li>\u4e0d\u6dfb\u52a0\u7d22\u5f15\u7684\u9996\u90e8 (Literal Header Field without Indexing)<\/li>\n<\/ol>\n<p>\u4ee5 0000 \u5f00\u59cb\u4e3a\u6807\u8bc6\uff0c\u6b64\u9996\u90e8\u4f1a\u52a0\u5165\u5230\u89e3\u7801\u540e\u7684\u9996\u90e8\u5217\u8868\u4e2d\uff0c\u4f46<strong>\u4e0d\u4f1a\u63d2\u5165\u5230\u52a8\u6001\u7d22\u5f15\u8868\u4e2d<\/strong><\/p>\n<ul>\n<li><code>Literal Header Field without Indexing \u2014 Indexed Name<\/code><\/li>\n<\/ul>\n<p>\u5982\u679c\u5b57\u6bb5\u5df2\u7ecf\u5b58\u5728\u7d22\u5f15\uff0c\u4f46\u952e\u503c\u672a\u88ab\u7d22\u5f15\uff0c\u5219\u4f1a\u66ff\u6362\u6210\u5982\u4e0b\u5f62\u5f0f (index \u4f7f\u7528 N=4 \u7684\u6574\u6570\u7f16\u7801\u8868\u793a)<\/p>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| 0 | 0 | 0 | 0 | Index (4+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| H | Value Length (7+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| Value String (Length octets) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<p>Literal Header Field without Indexing &#8211; Indexed Name<\/p>\n<ul>\n<li><code>Literal Header Field without Indexing \u2014 New Name<\/code><\/li>\n<\/ul>\n<p>\u5982\u679c\u5b57\u6bb5\u548c\u952e\u503c\u5747\u672a\u88ab\u7d22\u5f15\uff0c\u5219\u4f1a\u66ff\u6362\u6210\u5982\u4e0b\u5f62\u5f0f\u3002\u6bd4\u5982\u00a0<code>strict-transport-security: max-age=63072000; includeSubdomains<\/code><\/p>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| 0 | 0 | 0 | 0 | 0 |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| H | Name Length (7+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| Name String (Length octets) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| H | Value Length (7+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"10\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| Value String (Length octets) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"11\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<p>Literal Header Field without Indexing &#8211; New Name<\/p>\n<ol>\n<li>\u7edd\u5bf9\u4e0d\u6dfb\u52a0\u7d22\u5f15\u7684\u9996\u90e8 (Literal Header Field Never Indexed)<\/li>\n<\/ol>\n<p>\u8fd9\u4e0e\u4e0a\u4e00\u79cd\u9996\u90e8\u7c7b\u4f3c\uff0c\u53ea\u662f\u6807\u8bc6\u4e3a 0001\uff0c\u9996\u90e8\u4e5f\u662f\u4f1a\u6dfb\u52a0\u8fdb\u89e3\u7801\u540e\u7684\u9996\u90e8\u5217\u8868\u4e2d\u4f46\u4e0d\u4f1a\u63d2\u5165\u52a8\u6001\u66f4\u65b0\u8868\u3002<\/p>\n<p>\u533a\u522b\u5728\u4e8e\u8fd9\u7c7b\u9996\u90e8\u53d1\u51fa\u662f\u4ec0\u4e48\u683c\u5f0f\u8868\u793a\uff0c\u63a5\u6536\u4e5f\u662f\u4e00\u6837\u7684\u683c\u5f0f\uff0c\u4f5c\u7528\u4e8e\u6bcf\u4e00\u8df3 (hop)\uff0c\u5982\u679c\u4e2d\u95f4\u901a\u8fc7\u4ee3\u7406\uff0c\u4ee3\u7406\u5fc5\u987b\u539f\u6837\u8f6c\u53d1\u4e0d\u80fd\u53e6\u884c\u7f16\u7801\u3002<\/p>\n<p>\u800c\u4e0a\u4e00\u79cd\u9996\u90e8\u53ea\u662f\u4f5c\u7528\u5f53\u524d\u8df3\uff0c\u901a\u8fc7\u4ee3\u7406\u540e\u53ef\u80fd\u4f1a\u88ab\u91cd\u65b0\u7f16\u7801<\/p>\n<p>golang \u5b9e\u73b0\u4e2d\u4f7f\u7528\u4e00\u4e2a\u00a0<code>Sensitive<\/code>\u00a0\u6807\u660e\u54ea\u4e9b\u5b57\u6bb5\u662f\u7edd\u5bf9\u4e0d\u6dfb\u52a0\u7d22\u5f15\u7684:\u00a0<a href=\"https:\/\/github.com\/golang\/net\/blob\/db08ff08e8622530d9ed3a0e8ac279f6d4c02196\/http2\/hpack\/hpack.go#L41\" target=\"_blank\" rel=\"noopener\">golang.org\/x\/net\/http2\/hpack\/hpack.go#L41<\/a><\/p>\n<p>RFC \u6587\u6863\u4e2d\u8be6\u7ec6\u8bf4\u660e\u4e86\u8fd9\u4e48\u505a\u7684\u539f\u56e0:\u00a0<a href=\"https:\/\/httpwg.org\/specs\/rfc7541.html#never.indexed.literals\" target=\"_blank\" rel=\"noopener\">Never-Indexed Literals<\/a><\/p>\n<p>\u8868\u793a\u5f62\u5f0f\u9664\u4e86\u6807\u8bc6\u5176\u4ed6\u90fd\u8ddf\u4e0a\u4e00\u79cd\u9996\u90e8\u4e00\u6837:<\/p>\n<ul>\n<li><code>Literal Header Field Never Indexed \u2014 Indexed Name<\/code><\/li>\n<\/ul>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| 0 | 0 | 0 | 1 | Index (4+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| H | Value Length (7+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| Value String (Length octets) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<ul>\n<li><code>Literal Header Field Never Indexed \u2014 New Name<\/code><\/li>\n<\/ul>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| 0 | 0 | 0 | 1 | 0 |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| H | Name Length (7+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| Name String (Length octets) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| H | Value Length (7+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"10\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| Value String (Length octets) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"11\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<p>\u52a8\u6001\u8868\u6700\u5927\u5bb9\u91cf\u66f4\u65b0 (Dynamic Table Size Update)<\/p>\n<p>\u4ee5 001 \u5f00\u59cb\u4e3a\u6807\u8bc6\uff0c\u4f5c\u7528\u524d\u9762\u5df2\u7ecf\u63d0\u8fc7<\/p>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+&#8212;+<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">| 0 | 0 | 1 | Max size (5+) |<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">+&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTIyY2IxNjFlYmQ0YWRiM2QucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTIwMC9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>Literal Header Field without Indexing &#8211; Indexed Name<\/p>\n<p>\u53ef\u4ee5\u53d1\u9001 Max Size \u4e3a 0 \u7684\u66f4\u65b0\u6765\u6e05\u7a7a\u52a8\u6001\u7d22\u5f15\u8868<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTY0ODZhZmZmMzcxZDJjMDEucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvNDYyL2Zvcm1hdC93ZWJw?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>Literal Header Field without Indexing &#8211; Indexed Name<\/p>\n<p>\u5b9e\u4f8b<\/p>\n<p>RFC \u4e2d\u7ed9\u51fa\u4e86\u5f88\u591a\u5b9e\u4f8b\u00a0<a href=\"https:\/\/httpwg.org\/specs\/rfc7541.html#examples\" target=\"_blank\" rel=\"noopener\">Examples &#8211; RFC 7541<\/a>\uff0c\u63a8\u8350\u770b\u4e00\u904d\u52a0\u6df1\u7406\u89e3<\/p>\n<h2><a name=\"t11\"><\/a>What then ?<\/h2>\n<h3><a name=\"t12\"><\/a>HTTP\/2 \u6f14\u793a<\/h3>\n<p><a href=\"https:\/\/http2.akamai.com\/demo\" target=\"_blank\" rel=\"noopener\">https:\/\/http2.akamai.com\/demo<\/a><\/p>\n<p><a href=\"https:\/\/http2.golang.org\/\" target=\"_blank\" rel=\"noopener\">https:\/\/http2.golang.org\/<\/a><\/p>\n<p>\u7f51\u7ad9\u542f\u7528 h2 \u7684\u524d\u540e\u5bf9\u6bd4\uff0c\u4f7f\u7528\u00a0<a href=\"http:\/\/www.webpagetest.org\/\" target=\"_blank\" rel=\"noopener\">WebPageTest<\/a>\u00a0\u505a\u7684\u6d4b\u8bd5\uff0c\u7b2c\u4e00\u5f20\u662f h1\uff0c\u7b2c\u4e8c\u5f20\u662f h2:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTIxOTc0NTAwOWQwMmM3NGEucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTIwMC9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTcwOTA1ZGMyODcwY2M0ZWQucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTIwMC9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<h3><a name=\"t13\"><\/a>\u4f7f\u7528 HTTP\/2 \u5efa\u8bae<\/h3>\n<p>nginx \u5f00\u542f HTTP2 \u53ea\u9700\u5728\u76f8\u5e94\u7684 HTTPS \u8bbe\u7f6e\u540e\u52a0\u4e0a\u00a0<code>http2<\/code>\u00a0\u5373\u53ef<\/p>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">listen [::]:443 ssl http2 ipv6only=on;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">listen 443 ssl http2;<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<p>\u4ee5\u4e0b\u51e0\u70b9\u662f HTTP\/1 \u548c HTTP\/2 \u90fd\u540c\u6837\u9002\u7528\u7684<\/p>\n<p>1\u3001\u5f00\u542f\u538b\u7f29<\/p>\n<p>\u914d\u7f6e gzip \u7b49\u53ef\u4ee5\u4f7f\u4f20\u8f93\u5185\u5bb9\u66f4\u5c0f\uff0c\u4f20\u8f93\u901f\u5ea6\u66f4\u5feb<\/p>\n<p>\u4f8b\u5982 nginx \u53ef\u4ee5\u518d http \u6a21\u5757\u4e2d\u52a0\u5165\u4ee5\u4e0b\u5b57\u6bb5\uff0c\u5176\u4ed6\u5b57\u6bb5\u548c\u8be6\u7ec6\u89e3\u91ca\u53ef\u4ee5\u8c37\u6b4c<\/p>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">gzip on; \/\/ \u5f00\u542f<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">gzip_min_length 1k;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">gzip_comp_level 1; \/\/ \u538b\u7f29\u7ea7\u522b<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">gzip_types text\/plain application\/javascript application\/x-javascript application\/octet-stream application\/json text\/css application\/xml text\/javascript application\/x-httpd-php image\/jpeg image\/gif image\/png font\/ttf font\/otf image\/svg+xml; \/\/ \u9700\u8981\u538b\u7f29\u7684\u6587\u4ef6\u7c7b\u578b<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">gzip_vary on;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">gzip_disable <span class=\"hljs-string\">&#8220;MSIE [1-6]\\.&#8221;<\/span>;<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<p>2\u3001\u4f7f\u7528\u7f13\u5b58<\/p>\n<p>\u7ed9\u9759\u6001\u8d44\u6e90\u8bbe\u7f6e\u4e00\u4e2a\u7f13\u5b58\u671f\u662f\u975e\u5e38\u6709\u5fc5\u8981\u7684\uff0c\u5173\u4e8e\u7f13\u5b58\u89c1\u53e6\u4e00\u7bc7\u535a\u6587\u00a0<code>HTTP Message<\/code><\/p>\n<p>\u4f8b\u5982 nginx \u5728 server \u6a21\u5757\u4e2d\u6dfb\u52a0\u4ee5\u4e0b\u5b57\u6bb5\u53ef\u4ee5\u8bbe\u7f6e\u7f13\u5b58\u65f6\u95f4<\/p>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">location ~* ^.+\\.(ico|gif|jpg|jpeg|png|moc|mtn|mp3|mp4|mov)$ {<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">access_log off;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">expires 30d;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">}<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">location ~* ^.+\\.(css|js|txt|xml|swf|wav|json)$ {<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"7\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">access_log off;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"8\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">expires 5d;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"9\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">}<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"10\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"11\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">location ~* ^.+\\.(html|htm)$ {<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"12\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">expires 24h;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"13\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">}<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"14\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"15\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">location ~* ^.+\\.(eot|ttf|otf|woff|svg)$ {<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"16\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">access_log off;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"17\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">expires 30d;<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"18\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">}<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<p>3\u3001CDN \u52a0\u901f<\/p>\n<p>CDN \u7684\u597d\u5904\u662f\u5c31\u8fd1\u8bbf\u95ee\uff0c\u5ef6\u8fdf\u4f4e\uff0c\u8bbf\u95ee\u5feb<\/p>\n<p>4\u3001\u51cf\u5c11 DNS \u67e5\u8be2<\/p>\n<p>\u6bcf\u4e2a\u57df\u540d\u90fd\u9700\u8981 DNS \u67e5\u8be2\uff0c\u4e00\u822c\u9700\u8981\u51e0\u6beb\u79d2\u5230\u51e0\u767e\u6beb\u79d2\uff0c\u79fb\u52a8\u73af\u5883\u4e0b\u4f1a\u66f4\u6162\u3002DNS \u89e3\u6790\u5b8c\u6210\u4e4b\u524d\uff0c\u8bf7\u6c42\u4f1a\u88ab\u963b\u585e\u3002\u51cf\u5c11 DNS \u67e5\u8be2\u4e5f\u662f\u4f18\u5316\u9879\u4e4b\u4e00<\/p>\n<p>\u6d4f\u89c8\u5668\u7684\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Link_prefetching\" target=\"_blank\" rel=\"noopener\">DNS Prefetching<\/a>\u00a0\u6280\u672f\u4e5f\u662f\u4e00\u79cd\u4f18\u5316\u624b\u6bb5<\/p>\n<p>5\u3001\u51cf\u5c11\u91cd\u5b9a\u5411<\/p>\n<p>\u91cd\u5b9a\u5411\u53ef\u80fd\u5f15\u5165\u65b0\u7684 DNS \u67e5\u8be2\u3001\u65b0\u7684 TCP \u8fde\u63a5\u4ee5\u53ca\u65b0\u7684 HTTP \u8bf7\u6c42\uff0c\u6240\u4ee5\u51cf\u5c11\u91cd\u5b9a\u5411\u4e5f\u5f88\u91cd\u8981\u3002<\/p>\n<p>\u6d4f\u89c8\u5668\u57fa\u672c\u90fd\u4f1a\u7f13\u5b58\u901a\u8fc7 301 Moved Permanently \u6307\u5b9a\u7684\u8df3\u8f6c\uff0c\u6240\u4ee5\u5bf9\u4e8e\u6c38\u4e45\u6027\u8df3\u8f6c\uff0c\u53ef\u4ee5\u8003\u8651\u4f7f\u7528\u72b6\u6001\u7801 301\u3002\u5bf9\u4e8e\u542f\u7528\u4e86 HTTPS \u7684\u7f51\u7ad9\uff0c\u914d\u7f6e HSTS \u7b56\u7565\uff0c\u4e5f\u53ef\u4ee5\u51cf\u5c11\u4ece HTTP \u5230 HTTPS \u7684\u91cd\u5b9a\u5411<\/p>\n<p>\u4f46\u4ee5\u4e0b\u51e0\u70b9\u5c31\u4e0d\u63a8\u8350\u5728 HTTP\/2 \u4e2d\u7528\u4e86<\/p>\n<p>1\u3001\u57df\u540d\u5206\u7247<\/p>\n<p>HTTP\/2 \u5bf9\u4e8e\u540c\u4e00\u57df\u540d\u4f7f\u7528\u4e00\u4e2a TCP \u8fde\u63a5\u8db3\u77e3\uff0c\u8fc7\u591a TCP \u8fde\u63a5\u6d6a\u8d39\u8d44\u6e90\u800c\u4e14\u6548\u679c\u4e0d\u89c1\u5f97\u4e00\u5b9a\u597d<\/p>\n<p>\u800c\u4e14\u8d44\u6e90\u5206\u57df\u4f1a\u7834\u574f HTTP\/2 \u7684\u4f18\u5148\u7ea7\u7279\u6027\uff0c\u8fd8\u4f1a\u964d\u4f4e\u5934\u90e8\u538b\u7f29\u6548\u679c<\/p>\n<p>2\u3001\u8d44\u6e90\u5408\u5e76<\/p>\n<p>\u8d44\u6e90\u5408\u5e76\u4f1a\u4e0d\u5229\u4e8e\u7f13\u5b58\u673a\u5236\uff0c\u800c\u4e14\u5355\u6587\u4ef6\u8fc7\u5927\u5bf9\u4e8e HTTP\/2 \u7684\u4f20\u8f93\u4e0d\u597d\uff0c\u5c3d\u91cf\u505a\u5230\u7ec6\u7c92\u5316\u66f4\u6709\u5229\u4e8e HTTP\/2 \u4f20\u8f93<\/p>\n<p>3\u3001\u8d44\u6e90\u5185\u8054<\/p>\n<p>HTTP\/2 \u652f\u6301 Server-Push\uff0c\u76f8\u6bd4\u8f83\u5185\u8054\u4f18\u52bf\u66f4\u5927\u6548\u679c\u66f4\u597d<\/p>\n<p>\u800c\u4e14\u5185\u8054\u7684\u8d44\u6e90\u4e0d\u80fd\u6709\u6548\u7f13\u5b58<\/p>\n<p>\u5982\u679c\u6709\u5171\u7528\uff0c\u591a\u9875\u9762\u5185\u8054\u4e5f\u4f1a\u9020\u6210\u6d6a\u8d39<\/p>\n<p>HTTP\/2 \u6700\u4f73\u5b9e\u8df5<\/p>\n<p>\u4f7f\u7528 HTTP\/2 \u5c3d\u53ef\u80fd\u7528\u6700\u5c11\u7684\u8fde\u63a5\uff0c\u56e0\u4e3a\u540c\u4e00\u4e2a\u8fde\u63a5\u4e0a\u4ea7\u751f\u7684\u8bf7\u6c42\u548c\u54cd\u5e94\u8d8a\u591a\uff0c\u52a8\u6001\u5b57\u5178\u79ef\u7d2f\u5f97\u8d8a\u5168\uff0c\u5934\u90e8\u538b\u7f29\u6548\u679c\u4e5f\u5c31\u8d8a\u597d\uff0c\u800c\u4e14\u591a\u8def\u590d\u7528\u6548\u7387\u9ad8\uff0c\u4e0d\u4f1a\u50cf\u591a\u8fde\u63a5\u90a3\u6837\u9020\u6210\u8d44\u6e90\u6d6a\u8d39<\/p>\n<p>\u4e3a\u6b64\u9700\u8981\u6ce8\u610f\u4ee5\u4e0b\u4e24\u70b9:<\/p>\n<ul>\n<li>\u540c\u4e00\u57df\u540d\u4e0b\u7684\u8d44\u6e90\u4f7f\u7528\u540c\u4e00\u4e2a\u8fde\u63a5\uff0c\u8fd9\u662f HTTP\/2 \u7684\u7279\u6027<\/li>\n<li>\u4e0d\u540c\u57df\u540d\u4e0b\u7684\u8d44\u6e90\uff0c\u5982\u679c\u6ee1\u8db3\u80fd\u89e3\u6790\u5230\u540c\u4e00 IP \u6216\u8005\u4f7f\u7528\u7684\u662f\u540c\u4e00\u4e2a\u8bc1\u4e66(\u6bd4\u5982\u6cdb\u57df\u540d\u8bc1\u4e66)\uff0cHTTP\/2 \u53ef\u4ee5\u5408\u5e76\u591a\u4e2a\u8fde\u63a5<\/li>\n<\/ul>\n<p>\u6240\u4ee5\u4f7f\u7528\u76f8\u540c\u7684 IP \u548c\u8bc1\u4e66\u90e8\u7f72 Web \u670d\u52a1\u662f\u76ee\u524d\u6700\u597d\u7684\u9009\u62e9\uff0c\u56e0\u4e3a\u8fd9\u8ba9\u652f\u6301 HTTP\/2 \u7684\u7ec8\u7aef\u53ef\u4ee5\u590d\u7528\u540c\u4e00\u4e2a\u8fde\u63a5\uff0c\u5b9e\u73b0 HTTP\/2 \u534f\u8bae\u5e26\u6765\u7684\u597d\u5904\uff1b\u800c\u53ea\u652f\u6301 HTTP\/1.1 \u7684\u7ec8\u7aef\u5219\u4f1a\u4e0d\u540c\u57df\u540d\u5efa\u7acb\u4e0d\u540c\u8fde\u63a5\uff0c\u8fbe\u5230\u540c\u65f6\u66f4\u591a\u5e76\u53d1\u8bf7\u6c42\u7684\u76ee\u7684<\/p>\n<p>\u6bd4\u5982 Google \u4e00\u7cfb\u5217\u7f51\u7ad9\u90fd\u662f\u7528\u7684\u540c\u4e00\u4e2a\u8bc1\u4e66:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTdlZDM1ZjI4YTJjNDRkNzMucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTIwMC9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>\u4f46\u662f\u8fd9\u597d\u50cf\u4e5f\u4f1a\u9020\u6210\u4e00\u4e2a\u95ee\u9898\uff0c\u6211\u4f7f\u7528 nginx \u642d\u5efa\u7684 webserver\uff0c\u6709\u4e09\u4e2a\u865a\u62df\u4e3b\u673a\uff0c\u5b83\u4eec\u5171\u7528\u4e00\u5957\u8bc1\u4e66\uff0c\u5176\u4e2d\u4e24\u4e2a\u6211\u663e\u793a\u5730\u914d\u7f6e\u4e86 http2\uff0c\u800c\u5269\u4e0b\u4e00\u4e2a\u6211\u5e76\u6ca1\u6709\u914d\u7f6e http2\uff0c\u7ed3\u679c\u6211\u8bbf\u95ee\u672a\u914d\u7f6e http2 \u7684\u7ad9\u70b9\u65f6\u4e5f\u53d8\u6210\u4e86 http2\u3002<\/p>\n<h3><a name=\"t14\"><\/a>\u5927\u56fe\u7247\u4f20\u8f93\u78b0\u5230\u7684\u95ee\u9898<\/h3>\n<p>\u5148\u6bd4\u8f83\u4e00\u4e0b h1 \u548c h2 \u7684\u9875\u9762\u52a0\u8f7d\u65f6\u95f4\uff0c\u56fe\u4e2d\u7eff\u8272\u4ee3\u8868\u53d1\u8d77\u8bf7\u6c42\u6536\u5230\u54cd\u5e94\u7b49\u5f85\u8d1f\u8f7d\u7684\u65f6\u95f4\uff0c\u84dd\u8272\u4ee3\u8868\u4e0b\u8f7d\u8d1f\u8f7d\u7684\u65f6\u95f4:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTFlZjhlNjZiNTk3NmFmNjEucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTIwMC9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTYxYWRlMDg2ZmRmODk4NGQucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTIwMC9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>\u53ef\u4ee5\u53d1\u73b0 h2 \u52a0\u8f7d\u65f6\u95f4\u8fd8\u6bd4 h1 \u6162\u4e00\u70b9\uff0c\u7279\u522b\u662f\u78b0\u5230\u5927\u56fe\u7247\u65f6\u5dee\u522b\u66f4\u660e\u663e<\/p>\n<p>\u8fd9\u7bc7\u6587\u7ae0\u5bf9\u4e0d\u540c\u573a\u666f\u4e0b h1 \u548c h2 \u52a0\u8f7d\u56fe\u7247\u505a\u4e86\u6d4b\u8bd5:\u00a0<a href=\"https:\/\/99designs.com\/tech-blog\/blog\/2016\/07\/14\/real-world-http-2-400gb-of-images-per-day\/\" target=\"_blank\" rel=\"noopener\">Real\u2013world HTTP\/2: 400gb of images per day<\/a><\/p>\n<p>\u5176\u7ed3\u679c\u662f:<\/p>\n<ul>\n<li>\u5bf9\u4e00\u4e2a\u5178\u578b\u7684\u5bcc\u56fe\u50cf\uff0c\u5ef6\u8fdf\u9650\u5236 (latency\u2013bound) \u7684\u754c\u9762\u6765\u8bf4\u3002\u4f7f\u7528\u4e00\u4e2a\u9ad8\u901f\uff0c\u4f4e\u5ef6\u8fdf\u7684\u8fde\u63a5\uff0c\u89c6\u89c9\u5b8c\u6210\u5ea6 (visual completion) \u5e73\u5747\u4f1a\u5feb 5%\u3002<\/li>\n<li>\u5bf9\u4e00\u4e2a\u56fe\u50cf\u6781\u5176\u591a\uff0c\u5e26\u5bbd\u9650\u5236 (bandwidth\u2013bound) \u7684\u9875\u9762\u6765\u8bf4\u3002\u4f7f\u7528\u540c\u6837\u7684\u8fde\u63a5\uff0c\u89c6\u89c9\u5b8c\u6210\u5ea6\u5e73\u5747\u5c06\u4f1a\u6162 5\u201310%\uff0c\u4f46\u9875\u9762\u7684\u6574\u4f53\u52a0\u8f7d\u65f6\u95f4\u5b9e\u9645\u662f\u51cf\u5c11\u4e86\uff0c\u56e0\u4e3a\u5f97\u76ca\u4e8e\u8fde\u63a5\u5ef6\u8fdf\u5c11\u3002<\/li>\n<li>\u4e00\u4e2a\u9ad8\u5ef6\u8fdf\uff0c\u4f4e\u901f\u5ea6\u7684\u8fde\u63a5(\u6bd4\u5982\u79fb\u52a8\u7aef\u7684\u6162\u901f 3G) \u4f1a\u5bf9\u9875\u9762\u7684\u89c6\u89c9\u5b8c\u6210\u9020\u6210\u6781\u5927\u7684\u5ef6\u8fdf\uff0c\u4f46 h2 \u7684\u89c6\u89c9\u5b8c\u6210\u5ea6\u660e\u663e\u66f4\u9ad8\u66f4\u597d\u3002<\/li>\n<\/ul>\n<p>\u5728\u6240\u6709\u7684\u6d4b\u8bd5\u4e2d\uff0c\u90fd\u53ef\u4ee5\u770b\u5230: h2 \u4f7f\u6574\u4f53\u9875\u9762\u7684\u52a0\u8f7d\u901f\u5ea6\u63d0\u9ad8\u4e86\uff0c\u5e76\u4e14\u5728\u521d\u6b21\u7ed8\u5236 (initial render) \u4e0a\u505a\u7684\u66f4\u597d\uff0c\u867d\u7136\u7b2c\u4e8c\u79cd\u60c5\u51b5\u4e2d\u89c6\u89c9\u5b8c\u6210\u5ea6\u7565\u5fae\u4e0b\u964d\uff0c\u4f46\u603b\u4f53\u6548\u679c\u8fd8\u662f\u597d\u7684<\/p>\n<p>\u89c6\u89c9\u5b8c\u6210\u5ea6\u4e0b\u964d\u7684\u539f\u56e0\u662f\u56e0\u4e3a\u6ca1\u6709 HTTP\/1.x \u540c\u65f6\u8fde\u63a5\u6570\u91cf\u7684\u9650\u5236\uff0ch2 \u53ef\u4ee5\u540c\u65f6\u53d1\u8d77\u591a\u5f20\u56fe\u7247\u7684\u8bf7\u6c42\uff0c\u670d\u52a1\u5668\u53ef\u4ee5\u540c\u65f6\u54cd\u5e94\u56fe\u7247\u7684\u8d1f\u8f7d\uff0c\u53ef\u4ee5\u4ece\u4e0b\u9762\u7684\u52a8\u56fe\u4e2d\u770b\u5230<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTUwMmU1NGNmYTJiZWRjNDUuZ2lmP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTIwMC9mb3JtYXQvd2VicA\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>\u4e00\u65e6\u56fe\u7247\u4e0b\u8f7d\u5b8c\u6210\uff0c\u6d4f\u89c8\u5668\u5c31\u4f1a\u7ed8\u5236\u51fa\u5b83\u4eec\uff0c\u7136\u800c\uff0c\u5c0f\u56fe\u7247\u4e0b\u8f7d\u540e\u4f1a\u6e32\u67d3\u5730\u66f4\u5feb\uff0c\u4f46\u662f\u5982\u679c\u4e00\u4e2a\u5927\u56fe\u7247\u6070\u597d\u662f\u521d\u59cb\u7684\u89c6\u56fe\uff0c\u90a3\u5c31\u4f1a\u82b1\u8d39\u8f83\u957f\u7684\u65f6\u95f4\u52a0\u8f7d\uff0c\u5ef6\u8fdf\u89c6\u89c9\u4e0a\u7684\u5b8c\u6210\u5ea6\u3002<\/p>\n<p>chrome bug<\/p>\n<p>\u4e0a\u9762\u7684\u52a8\u56fe\u662f\u5728 Safari \u4e0a\u7684\u6d4b\u8bd5\u7ed3\u679c\uff0c\u56fe\u7247\u6700\u540e\u90fd\u4e0b\u8f7d\u6210\u529f\u4e86\uff0c\u800c\u6211\u5728 Chrome \u4e0a\u6d4b\u8bd5\u65f6\u540e\u9762\u7684\u90e8\u5206\u56fe\u7247\u76f4\u63a5\u6302\u4e86\uff0c\u90fd\u62a5\u00a0<code>ERR_SPDY_PROTOCOL_ERROR<\/code>\u00a0\u9519\u8bef\uff0c\u800c\u4e14\u662f\u767e\u5206\u767e\u590d\u73b0<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LWE1YTk0YTIwZDZhMTUxZTUuZ2lmP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTIwMC9mb3JtYXQvd2VicA\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>\u53bb\u770b\u4e86\u4e0b\u00a0<code>ERR_SPDY_PROTOCOL_ERROR<\/code>\u00a0\u51fa\u5728\u54ea\uff0c\u53d1\u73b0\u662f Server reset stream\uff0c\u5e94\u8be5\u662f\u54ea\u51fa\u9519\u4e86\u5bfc\u81f4\u6d41\u63d0\u524d\u7ec8\u6b62<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LWY2ZDhiMmZkYTE4ZGQ1NmIucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTIwMC9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>\u7136\u540e\u518d\u7814\u7a76\u4e86\u4e00\u4e0b HTTP\/2 \u7684\u5e27\u5e8f\u5217\uff0c\u53d1\u51fa\u7684\u8bf7\u6c42\u90fd\u5728 629 \u53f7\u6d88\u606f\u4e2d\u54cd\u5e94\u6210\u529f\u4e86\uff0c\u4f46\u662f\u8fd4\u56de\u7684\u6570\u636e\u5e27\u53ea\u6709\u6d41 15 \u4e0a\u7684\uff0c\u5b9e\u9645\u6536\u5230\u7684\u56fe\u7247\u53c8\u4e0d\u6b62\u6d41 15 \u5bf9\u5e94\u7684\u56fe\u7247\uff0c\u8fd9\u662f\u4e3a\u4ec0\u4e48?<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LTkzZmZiYWExZmY1ZmVlYjUucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTIwMC9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<p>\u540e\u9762\u6211\u7ee7\u7eed\u6d4b\u8bd5\u53d1\u73b0\u8fde\u7eed\u8bf7\u6c42\u51e0\u5f20\u5927\u56fe\u7247\uff0c\u867d\u7136 HEADERS \u5e27\u90fd\u6253\u5f00\u7684\u662f\u4e0d\u540c\u7684\u6d41\uff0c\u8fd4\u56de\u7684\u54cd\u5e94\u7684 HEADERS \u5e27\u4e5f\u8fd8\u662f\u5bf9\u5e94\u524d\u9762\u7684\u6d41 ID\uff0c\u4f46\u662f\u54cd\u5e94\u7684 DATA \u5e27\u90fd\u662f\u4ece\u7b2c\u4e00\u4e2a\u6253\u5f00\u7684\u6d41\u4e0a\u8fd4\u56de\u7684\u3002<\/p>\n<p>\u5982\u679c\u662f\u5c0f\u56fe\u7247\u7684\u8bdd\uff0c\u4e00\u4e2a\u8bf7\u6c42\u54cd\u5e94\u8fc7\u540e\u8fd9\u4e2a\u6d41\u5c31\u5173\u95ed\u4e86\uff0c\u4e0b\u4e00\u5f20\u5c0f\u56fe\u662f\u5728\u5176\u81ea\u5df1\u5bf9\u5e94\u7684\u6d41\u4e0a\u8fd4\u56de\u7684\u3002\u53ea\u6709\u8fde\u7eed\u51e0\u5f20\u5927\u56fe\u4f1a\u51fa\u73b0\u4e0a\u8ff0\u60c5\u5f62\uff0c\u8fd9\u4e2a\u673a\u5236\u5f88\u5947\u602a\uff0c\u6211\u6682\u65f6\u8fd8\u6ca1\u6709\u627e\u5230\u89e3\u91ca\u7684\u6587\u6863\u3002<\/p>\n<p>\u81f3\u4e8e chrome \u4e3a\u4ec0\u4e48\u51fa\u9519\u5462\uff0c\u770b\u4e00\u4e0b TCP \u62a5\u6587\u5c31\u4f1a\u53d1\u73b0\u6240\u6709\u6570\u636e\u5728\u4e00\u4e2a\u8fde\u63a5\u4e0a\u53d1\u9001\uff0c\u5230\u540e\u9762 TCP \u5305\u4f1a\u51fa\u73b0\u5404\u79cd\u95ee\u9898\uff0c\u4e22\u5305\u3001\u91cd\u4f20\u3001\u5931\u5e8f\u3001\u91cd\u5305\u7b49\u7b49\uff0c\u4e0d\u6e05\u695a Safari \u662f\u5426\u4e5f\u662f\u8fd9\u6837\uff0c\u56e0\u4e3a wireshark \u53ea\u80fd\u89e3 chrome \u7684\u5305\u89e3\u4e0d\u4e86 Safari \u7684\u5305<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LWFhYTZkNmIyYjNjM2MxNGQucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvMTIwMC9mb3JtYXQvd2VicA?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<blockquote><p>\u300aweb \u6027\u80fd\u6743\u5a01\u6307\u5357\u300b\u4e2d\u63d0\u53ca HTTP\/2 \u4e2d\u4e00\u4e2a TCP \u53ef\u80fd\u4f1a\u9020\u6210\u7684\u95ee\u9898:<br \/>\n\u867d\u7136\u6d88\u9664\u4e86 HTTP \u961f\u9996\u963b\u585e\u73b0\u8c61\uff0c\u4f46 TCP \u5c42\u6b21\u4e0a\u4ecd\u5b58\u5728\u961f\u9996\u963b\u585e\u95ee\u9898\uff1b\u5982\u679c TCP \u7a97\u53e3\u7f29\u653e\u88ab\u7981\u7528\uff0c\u90a3<a href=\"https:\/\/zh.wikipedia.org\/wiki\/%E5%B8%A6%E5%AE%BD%E6%97%B6%E5%BB%B6%E4%B9%98%E7%A7%AF\" target=\"_blank\" rel=\"noopener\">\u5e26\u5bbd\u5ef6\u8fdf\u79ef\u6548\u5e94<\/a>\u53ef\u80fd\u4f1a\u9650\u5236\u8fde\u63a5\u7684\u541e\u5410\u91cf\uff1b\u4e22\u5305\u65f6 TCP \u62e5\u585e\u7a97\u53e3\u4f1a\u7f29\u5c0f\uff1b<\/p><\/blockquote>\n<p>TCP \u662f\u4e00\u65b9\u9762\u539f\u56e0\uff0c\u8fd8\u6709\u53e6\u4e00\u65b9\u9762\u5e94\u8be5\u662f\u6d4f\u89c8\u5668\u7b56\u7565\u95ee\u9898\uff0c\u4f30\u8ba1\u4e5f\u662f chrome bug\uff0c\u5bf9\u6bd4\u4e24\u5f20\u52a8\u56fe\u4f60\u4f1a\u53d1\u73b0\uff0csafari \u63a5\u6536\u8d1f\u8f7d\u662f\u8f6e\u6d41\u63a5\u6536\uff0c\u6211\u4eec\u51e0\u4e2a\u63a5\u6536\u4e00\u70b9\u7136\u540e\u6362\u51e0\u4e2a\u4eba\u63a5\u6536\uff0c\u76f4\u5230\u6240\u6709\u90fd\u63a5\u53d7\u5b8c\uff1b\u800c chrome \u5219\u662f\u6309\u987a\u5e8f\u63a5\u6536\uff0c\u8fd9\u4e2a\u63a5\u6536\u5b8c\u624d\u8f6e\u5230\u4e0b\u4e00\u4e2a\u63a5\u6536\uff0c\u7ed3\u679c\u540e\u9762\u7684\u56fe\u7247\u53ef\u80fd\u957f\u65f6\u95f4\u672a\u54cd\u5e94\u5c31\u6302\u4e86\u3002<\/p>\n<p>\u4f7f\u7528\u6e10\u8fdb\u5f0f\u56fe\u7247<\/p>\n<p>\u6e10\u8fdb\u5f0f jpg \u4ee3\u66ff\u666e\u901a jpg \u6709\u5229\u4e8e\u63d0\u9ad8\u89c6\u89c9\u5b8c\u6210\u5ea6\uff0c\u800c\u4e14\u6587\u4ef6\u66f4\u5c0f:<\/p>\n<p>\u8f93\u5165\u00a0<code>convert --version<\/code>\u00a0\u770b\u770b\u662f\u5426\u5df2\u5b89\u88c5\u00a0<a href=\"http:\/\/www.imagemagick.org\/\" target=\"_blank\" rel=\"noopener\">ImageMagic<\/a>\uff0c\u5982\u679c\u6ca1\u6709\u5148\u5b89\u88c5: Mac \u53ef\u4ee5\u7528\u00a0<code>brew install imagemagick<\/code>\uff0cCentos \u53ef\u4ee5\u7528\u00a0<code>yum install imagemagick<\/code><\/p>\n<p>\u68c0\u6d4b\u662f\u5426\u4e3a progressive jpeg\uff0c\u5982\u679c\u8f93\u51fa None \u8bf4\u660e\u4e0d\u662f progressive jpeg\uff1b\u5982\u679c\u8f93\u51fa JPEG \u8bf4\u660e\u662f progressive jpeg:<\/p>\n<pre><code class=\"language-bash hljs\">$ identify -verbose filename.jpg | grep Interlace\r\n<\/code><\/pre>\n<p>\u5c06 basic jpeg \u8f6c\u6362\u6210 progressive jpeg\uff0c<a href=\"https:\/\/www.imagemagick.org\/script\/command-line-options.php#interlace\" target=\"_blank\" rel=\"noopener\">interlace \u53c2\u6570<\/a>:<\/p>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">$ convert -strip -interlace Plane source.jpg destination.jpg \/\/ \u8fd8\u53ef\u4ee5\u6307\u5b9a\u8d28\u91cf -quality 90<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">\/\/ \u6279\u91cf\u5904\u7406<\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">$ <span class=\"hljs-keyword\">for<\/span> i <span class=\"hljs-keyword\">in<\/span> .\/*.jpg; <span class=\"hljs-keyword\">do<\/span> convert -strip -interlace Plane <span class=\"hljs-variable\">$i<\/span> <span class=\"hljs-variable\">$i<\/span>; <span class=\"hljs-keyword\">done<\/span><\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"language-bash hljs\"><\/code><\/pre>\n<p>\u4e5f\u53ef\u4ee5\u8f6c\u6362 PNG \u548c GIF\uff0c\u4f46\u662f\u6211\u8bd5\u8fc7\u00a0<code>convert -strip -interlace Plane source.png destination.png<\/code>\u00a0\u4f46\u8f6c\u6362\u540e\u7684\u56fe\u7247\u5f80\u5f80\u4f1a\u66f4\u5927\uff0c\u4e0d\u63a8\u8350\u8fd9\u4e48\u7528\uff0c\u53ef\u4ee5 convert source.png destination.jpg<\/p>\n<p>ImageMagic \u8fd8\u6709\u5f88\u591a\u5f3a\u5927\u7684\u529f\u80fd<\/p>\n<p>&nbsp;<\/p>\n<pre><code class=\"hljs language-javascript\"><\/code><\/pre>\n<ol class=\"hljs-ln\">\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"1\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-comment\">\/\/ \u56fe\u7247\u7f29\u653e<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"2\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">$ convert -resize <span class=\"hljs-number\">50<\/span>%x50% source.<span class=\"hljs-property\">jpg<\/span> destination.<span class=\"hljs-property\">jpg<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"3\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-comment\">\/\/ \u56fe\u7247\u683c\u5f0f\u8f6c\u6362<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"4\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">$ convert source.<span class=\"hljs-property\">jpg<\/span> destination.<span class=\"hljs-property\">png<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"5\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\"><span class=\"hljs-comment\">\/\/ \u914d\u5408 find \u547d\u4ee4\uff0c\u5c06\u5f53\u524d\u76ee\u5f55\u4e0b\u5927\u4e8e 100kb \u7684\u56fe\u7247\u6309 75% \u8d28\u91cf\u8fdb\u884c\u538b\u7f29<\/span><\/div>\n<\/div>\n<\/li>\n<li>\n<div class=\"hljs-ln-numbers\">\n<div class=\"hljs-ln-line hljs-ln-n\" data-line-number=\"6\"><\/div>\n<\/div>\n<div class=\"hljs-ln-code\">\n<div class=\"hljs-ln-line\">$ find -E . -iregex <span class=\"hljs-string\">&#8216;.*\\.(jpg|png|bmp)&#8217;<\/span> -size +100k -exec convert -strip +profile \u201c*\u201d -quality <span class=\"hljs-number\">75<\/span> {} {} \\;<\/div>\n<\/div>\n<\/li>\n<\/ol>\n<pre><code class=\"hljs language-javascript\"><\/code><\/pre>\n<p>png \u538b\u7f29\u63a8\u8350\u4f7f\u7528\u00a0<a href=\"https:\/\/pngquant.org\/\" target=\"_blank\" rel=\"noopener\">pngquant<\/a><\/p>\n<p>\u53e6\u5916 photoshop \u4fdd\u5b58\u56fe\u7247\u65f6\u4e5f\u53ef\u4ee5\u8bbe\u7f6e\u6e10\u8fdb\u6216\u4ea4\u9519:<\/p>\n<p>\u6e10\u8fdb\u5f0f\u56fe\u7247\uff1a\u9009\u62e9\u56fe\u7247\u683c\u5f0f\u4e3a JPEG =&gt; \u9009\u4e2d\u201c\u8fde\u7eed\u201d<\/p>\n<p>\u4ea4\u9519\u5f0f\u56fe\u7247\uff1a\u9009\u62e9\u56fe\u7247\u683c\u5f0f\u4e3a PNG\/GIF =&gt; \u9009\u4e2d\u201c\u4ea4\u9519\u201d<\/p>\n<h3><a name=\"t15\"><\/a>SPDY \u4e0e HTTP2 \u7684\u5173\u7cfb<\/h3>\n<p><a href=\"https:\/\/zh.wikipedia.org\/wiki\/SPDY\" target=\"_blank\" rel=\"noopener\">SPDY<\/a>\u00a0\u662f HTTP2 \u7684\u524d\u8eab\uff0c\u5927\u90e8\u5206\u7279\u6027\u4e0e HTTP2 \u4fdd\u6301\u4e00\u81f4\uff0c\u5305\u62ec\u670d\u52a1\u5668\u7aef\u63a8\u9001\uff0c\u591a\u8def\u590d\u7528\u548c\u5e27\u4f5c\u4e3a\u4f20\u8f93\u7684\u6700\u5c0f\u5355\u4f4d\u3002\u4f46 SPDY \u4e0e HTTP2 \u4e5f\u6709\u4e00\u4e9b\u5b9e\u73b0\u4e0a\u7684\u4e0d\u540c\uff0c\u6bd4\u5982 SPDY \u7684\u5934\u90e8\u538b\u7f29\u4f7f\u7528\u7684\u662f DEFLATE \u7b97\u6cd5\uff0c\u800c HTTP2 \u4f7f\u7528\u7684\u662f HPACK \u7b97\u6cd5\uff0c\u538b\u7f29\u7387\u66f4\u9ad8\u3002<\/p>\n<h3><a name=\"t16\"><\/a>QUIC \u534f\u8bae<\/h3>\n<p>Google \u7684\u00a0<a href=\"https:\/\/zh.wikipedia.org\/wiki\/%E5%BF%AB%E9%80%9FUDP%E7%BD%91%E7%BB%9C%E8%BF%9E%E6%8E%A5\" target=\"_blank\" rel=\"noopener\">QUIC(Quick UDP Internet Connections)<\/a>\u00a0\u534f\u8bae\uff0c\u7ee7\u627f\u4e86 SPDY \u7684\u7279\u70b9\u3002QUIC \u662f\u4e00\u4e2a UDP \u7248\u7684 TCP + TLS + HTTP\/2 \u66ff\u4ee3\u5b9e\u73b0\u3002<\/p>\n<p>QUIC \u53ef\u4ee5\u521b\u5efa\u66f4\u4f4e\u5ef6\u8fdf\u7684\u8fde\u63a5\uff0c\u5e76\u4e14\u4e5f\u50cf HTTP\/2 \u4e00\u6837\uff0c\u901a\u8fc7\u4ec5\u4ec5\u963b\u585e\u90e8\u5206\u6d41\u89e3\u51b3\u4e86\u5305\u88f9\u4e22\u5931\u8fd9\u4e2a\u95ee\u9898\uff0c\u8ba9\u8fde\u63a5\u5728\u4e0d\u540c\u7f51\u7edc\u4e0a\u5efa\u7acb\u53d8\u5f97\u66f4\u7b80\u5355 \uff0d \u8fd9\u5176\u5b9e\u6b63\u662f\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Multipath_TCP\" target=\"_blank\" rel=\"noopener\">MPTCP<\/a>\u00a0\u60f3\u53bb\u89e3\u51b3\u7684\u95ee\u9898\u3002<\/p>\n<p>QUIC \u73b0\u5728\u8fd8\u53ea\u6709 Google \u7684 Chrome \u548c\u5b83\u540e\u53f0\u670d\u52a1\u5668\u4e0a\u7684\u5b9e\u73b0\uff0c\u867d\u7136\u6709\u7b2c\u4e09\u65b9\u5e93 libquic\uff0c\u4f46\u8fd9\u4e9b\u4ee3\u7801\u4ecd\u7136\u5f88\u96be\u5728\u5176\u4ed6\u5730\u65b9\u88ab\u590d\u7528\u3002\u8be5\u534f\u8bae\u4e5f\u88ab IETF \u901a\u4fe1\u5de5\u4f5c\u7ec4\u5f15\u5165\u4e86\u8349\u6848\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/mholt\/caddy\" target=\"_blank\" rel=\"noopener\">Caddy<\/a>: \u57fa\u4e8e Go \u8bed\u8a00\u5f00\u53d1\u7684 Web Server\uff0c \u5bf9 HTTP\/2 \u548c HTTPS \u6709\u7740\u826f\u597d\u7684\u652f\u6301\uff0c\u4e5f\u5f00\u59cb\u652f\u6301 QUIC \u534f\u8bae (\u8bd5\u9a8c\u6027)<\/p>\n<h3><a name=\"t17\"><\/a>\u63a8\u8350\u5de5\u5177<\/h3>\n<ul>\n<li>Chrome \u63d2\u4ef6:\u00a0<a href=\"https:\/\/chrome.google.com\/webstore\/detail\/http2-and-spdy-indicator\/mpbpobfflnpcgagjijhmgnchggcjblin\" target=\"_blank\" rel=\"noopener\">HTTP\/2 and SPDY indicator<\/a><\/li>\n<\/ul>\n<p>\u5982\u679c\u4f60\u8bbf\u95ee\u7684\u7ad9\u70b9\u5f00\u542f\u4e86 HTTP\/2\uff0c\u56fe\u6807\u4f1a\u4eae\u8d77\uff0c\u800c\u4e14\u70b9\u51fb\u4f1a\u8fdb\u5165 chrome \u5185\u7f6e\u7684 HTTP\/2 \u76d1\u89c6\u5de5\u5177<\/p>\n<ul>\n<li>\u547d\u4ee4\u884c\u5de5\u5177:\u00a0<a href=\"https:\/\/github.com\/nghttp2\/nghttp2\" target=\"_blank\" rel=\"noopener\">nghttp2<\/a><\/li>\n<\/ul>\n<p>C \u8bed\u8a00\u5b9e\u73b0\u7684 HTTP\/2\uff0c\u53ef\u4ee5\u7528\u5b83\u8c03\u8bd5 HTTP\/2 \u8bf7\u6c42<\/p>\n<p>\u76f4\u63a5\u00a0<code>brew install nghttp2<\/code>\u00a0\u5c31\u53ef\u4ee5\u5b89\u88c5\uff0c\u5b89\u88c5\u597d\u540e\u8f93\u5165\u00a0<code>nghttp -nv https:\/\/nghttp2.org<\/code>\u00a0\u5c31\u53ef\u4ee5\u67e5\u770b h2 \u8bf7\u6c42<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/imgconvert.csdnimg.cn\/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81NTc4ODE3LWJlNzUyZTNjNjJjMThmNTEucG5nP2ltYWdlTW9ncjIvYXV0by1vcmllbnQvc3RyaXB8aW1hZ2VWaWV3Mi8yL3cvNTYyL2Zvcm1hdC93ZWJw?x-oss-process=image\/format,png\" alt=\"\" \/><\/p>\n<p>image<\/p>\n<ul>\n<li>\u9664 nghttp2 \u5916\u8fd8\u53ef\u4ee5\u7528 h2i \u6d4b\u8bd5 http2:\u00a0<a href=\"https:\/\/github.com\/golang\/net\/blob\/master\/http2\/h2i\/README.md\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/golang\/net\/blob\/master\/http2\/h2i\/README.md<\/a><\/li>\n<li>\u8fd8\u53ef\u4ee5\u7528 wireshark \u89e3 h2 \u7684\u5305\uff0c\u4e0d\u8fc7\u5f97\u8bbe\u7f6e\u6d4f\u89c8\u5668\u63d0\u4f9b\u7684\u5bf9\u79f0\u534f\u5546\u5bc6\u94a5\u6216\u8005\u670d\u52a1\u5668\u63d0\u4f9b\u7684\u79c1\u94a5\uff0c\u5177\u4f53\u65b9\u6cd5\u770b\u6b64\u6587:\u00a0<a href=\"https:\/\/imququ.com\/post\/http2-traffic-in-wireshark.html\" target=\"_blank\" rel=\"noopener\">\u4f7f\u7528 Wireshark \u8c03\u8bd5 HTTP\/2 \u6d41\u91cf<\/a><\/li>\n<\/ul>\n<p>\u5982\u679c\u65e0\u6cd5\u89e3\u5305\u770b\u4e00\u4e0b sslkeylog.log \u6587\u4ef6\u6709\u6ca1\u6709\u5199\u5165\u6570\u636e\uff0c\u5982\u679c\u6ca1\u6709\u6570\u636e\u8bf4\u660e\u6d4f\u89c8\u5668\u6253\u5f00\u65b9\u5f0f\u4e0d\u5bf9\uff0c\u5f97\u7528\u547d\u4ee4\u884c\u6253\u5f00\u6d4f\u89c8\u5668\uff0c\u8fd9\u6837\u624d\u80fd\u8ba9\u6d4f\u89c8\u5668\u8bfb\u53d6\u73af\u5883\u53d8\u91cf\u7136\u540e\u5411 sslkeylog \u5199\u5165\u5bc6\u94a5\uff0c\u53e6\u5916\u6b64\u65b9\u6cd5\u597d\u50cf\u652f\u6301\u8c37\u6b4c\u6d4f\u89c8\u5668\u548c\u706b\u72d0\uff0c\u5bf9 Safari \u65e0\u6548<\/p>\n<p>\u5982\u679c sslkeylog.log \u6709\u6570\u636e\uff0cwireshark \u8fd8\u662f\u65e0\u6cd5\u89e3\u5305\uff0c\u6253\u5f00\u8bbe\u7f6e\u7684 SSL \u9009\u9879\u91cd\u65b0\u9009\u62e9\u4e00\u4e0b\u6587\u4ef6\u8bd5\u8bd5\uff0c\u5982\u679c\u8fd8\u662f\u4e0d\u884c\u4e5f\u7528\u547d\u4ee4\u884c\u6253\u5f00 Wireshark<\/p>\n<p>\u4e00\u6b21\u4e0d\u884c\u591a\u8bd5\u51e0\u6b21<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/h2o\/h2o\" target=\"_blank\" rel=\"noopener\">h2o<\/a>: \u4f18\u5316\u7684 HTTP Server\uff0c\u5bf9 HTTP\/2 \u7684\u652f\u6301\u6027\u505a\u7684\u6bd4\u8f83\u597d<\/li>\n<\/ul>\n<h2><a name=\"t18\"><\/a>References<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.slideshare.net\/qgy18\/http2-55366951\" target=\"_blank\" rel=\"noopener\">HTTP\/2: \u65b0\u7684\u673a\u9047\u4e0e\u6311\u6218<\/a><\/li>\n<li><a href=\"https:\/\/docs.google.com\/presentation\/d\/1r7QXGYOLCh4fcUq0jDdDwKJWNqWK1o4xMtYpKZCJYjM\/present?slide=id.p19\" target=\"_blank\" rel=\"noopener\">HTTP2 is here, let&#8217;s optimize!<\/a><\/li>\n<li><a href=\"https:\/\/imququ.com\/post\/series.html\" target=\"_blank\" rel=\"noopener\">JerryQu&#8217;s Blog<\/a><\/li>\n<li><a href=\"https:\/\/daniel.haxx.se\/http2\/\" target=\"_blank\" rel=\"noopener\">http2 explained<\/a><\/li>\n<li><a href=\"https:\/\/cdn-1.wp.nginx.com\/wp-content\/uploads\/2015\/09\/NGINX_HTTP2_White_Paper_v4.pdf\" target=\"_blank\" rel=\"noopener\">NGINX HTTP2 White Paper<\/a><\/li>\n<li><a href=\"https:\/\/calendar.perfplanet.com\/2016\/http2-push-the-details\/\" target=\"_blank\" rel=\"noopener\">HTTP\/2 Push: The details<\/a><\/li>\n<li>\u300aweb \u6027\u80fd\u6743\u5a01\u6307\u5357\u300b<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<\/article>\n","protected":false},"excerpt":{"rendered":"<p>\u539f\u6587\u5730\u5740 \u7ef4\u57fa\u767e\u79d1\u5173\u4e8e HTTP\/2 \u7684<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[24],"tags":[121],"class_list":["post-5790","post","type-post","status-publish","format-standard","hentry","category-value_docs","tag-05-"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/5790","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=5790"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/5790\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=5790"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=5790"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=5790"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}