1.SPDYåè®®çç¹ç¹
2.HTTP/3 竟然基于 UDP,协议HTTP 协议这些年都经历了啥?
3.HTTP 2.0çåè®®å
容
4.安卓逆向解决淘系App 天猫 陶特等抓包问题
5.http1ãhttp1.1åhttp2çåºå«
SPDYåè®®çç¹ç¹
SPDY并ä¸æ¯ä¸ç§ç¨äºæ¿ä»£HTTPçåè®®ï¼èæ¯å¯¹HTTPåè®®çå¢å¼ºãæ°åè®®çåè½å æ¬æ°æ®æµçå¤è·¯å¤ç¨ã请æ±ä¼å 级ï¼ä»¥åHTTPå 头å缩ãè°·æå·²ç»å¼åä¸ä¸ªç½ç»æå¡å¨ååæºï¼ä»¥åæ¯æSPDYåè®®çChromeæµè§å¨çæ¬ãããæ ¹æ®è°·æåå¸çSPDYç½ç®ä¹¦ï¼è¯¥é¡¹ç®çç®æ æ¯å°é¡µé¢å è½½æ¶é´åå°%ï¼æå°åé ç½®å¤æ度ï¼å¹¶é¿å ç½ç«ææè 对ç½ç«è¿è¡çè°æ´å½±åSPDYãè°·æå¸æå°ææçå·¥ä½è½¬ç§»è³ç¨æ·ç«¯åç½ç»æå¡å¨ä¸ãéè¿å¼å ¥SPDYï¼è°·æè¿å¸æå¨ä¸ä¸ªTCPä¼è¯ä¸æ¯æå¤ä¸ªå¹¶åçHTTP请æ±ï¼å¹¶ä½¿SLLæ为æ åçä¼ è¾åè®®ãããä¸å 人士认为ï¼æåç½ç»é度åå®å ¨æ§ç¬¦åè°·æçå©çãè°·æå½åæ¨åºChromeæµè§å¨çç®çå°±å¨äºè®©ææå¼åè å ³æ³¨ç½ç»é度ãç¸æ¯Chromeï¼SPDYæ¯ä¸ä¸ªæ´éä¼çç®æ ãéè¿SPDYï¼è°·æå¸æ对äºèç½æåºç¡çåè®®ä¹ä¸è¿è¡æ¹åãHTTP/3 竟然基于 UDP,源码HTTP 协议这些年都经历了啥?
HTTP 协议从第一代到第三代,协议经历了从 HTTP/1 到 HTTP/2 的源码发展,再到现在的协议 HTTP/3。本文将简要介绍 HTTP 协议的源码大学帮源码技术发展过程,并解释为什么最终 HTTP/3 基于 UDP 而不是协议 TCP。从 HTTP/1 的源码局限性开始,到 SPDY 协议的协议引入,再到 HTTP/2 的源码诞生,以及最后 HTTP/3 如何解决 HTTP/2 的协议问题,本文将逐步深入,源码让读者理解这一过程。协议
HTTP/1 在 Web 时代迅速崛起,源码但随着采用量的协议增加,其缺陷逐渐显现。主要存在几个方面的问题,如请求挂起等待域名链接数限制,以及高延迟和带宽浪费。按键操作源码为解决这些问题,谷歌于 年公开了 SPDY 协议,它对 HTTP/1 进行了优化,包括延迟降低、header 压缩等改进,最终带来了 HTTP/2 的诞生。
HTTP/2 是基于 SPDY 协议的改进,专注于性能优化,主要目标是sourcemap看源码通过单个连接传输所有请求数据。它采用二进制传输,减少数据传输的开销,并引入多路复用技术,解决了 HTTP/1 的请求限制问题。在 HTTP/2 中,通过使用二进制分帧,HTTP/2 不再依赖 TCP 连接实现多流并行,从而提高了性能。
为了进一步解决 TCP 协议带来的java源码treeset丢包问题,Google 开发了 QUIC 协议,并将其应用于 HTTP/3。QUIC 协议基于 UDP,通过实现 0RTT 安全握手、原生多路复用、前向纠错等特性,为 HTTP/3 提供了高性能和高安全性的基础。此外,QUIC 的c 字典源码 ID 识别机制使其在移动端表现更好,具有更强的鲁棒性和适应性。
总的来说,HTTP 协议从第一代到第三代的发展,是在不断探索和优化的过程中实现的。HTTP/3 基于 UDP 的设计,展示了在特定场景下,即使 UDP 被认为不适合用于承载上层协议,通过引入适当的机制和改进,仍能实现高性能和高安全性的网络通信。这一过程体现了技术演进的灵活性和创新性。
HTTP 2.0çåè®®å 容
å¼æ¥è¿æ¥å¤è·¯å¤ç¨ï¼å¤´é¨å缩ï¼
请æ±/ååºç®¡çº¿åï¼
ä¿æä¸HTTP 1.1è¯ä¹çååå ¼å®¹æ§ä¹æ¯è¯¥çæ¬çä¸ä¸ªå ³é®ç®æ ãSPDYæ¯ä¸ç§HTTPå ¼å®¹åè®®ï¼ç±Googleåèµ·ï¼ChromeãOperaãFirefox以åAmazon Silkçæµè§å¨åå·²æä¾æ¯æãHTTPå®ç°çç¶é¢ä¹ä¸æ¯å ¶å¹¶åè¦ä¾èµäºå¤éè¿æ¥ãHTTP管线åææ¯å¯ä»¥ç¼è§£è¿ä¸ªé®é¢ï¼ä½ä¹åªè½åå°é¨åå¤è·¯å¤ç¨ãæ¤å¤ï¼å·²ç»è¯å®ï¼ç±äºåå¨ä¸é´å¹²æ°ï¼æµè§å¨æ æ³éç¨ç®¡çº¿åææ¯ãSPDYå¨å个è¿æ¥ä¹ä¸å¢å äºä¸ä¸ªå¸§å±ï¼ç¨ä»¥å¤è·¯å¤ç¨å¤ä¸ªå¹¶åæµã帧å±é对HTTPç±»ç请æ±ååºæµè¿è¡äºä¼åï¼å æ¤è¿è¡å¨HTTPä¹ä¸çåºç¨ï¼å¯¹åºç¨å¼åè èè¨åªè¦å¾å°çä¿®æ¹çè³æ éä¿®æ¹å°±å¯ä»¥è¿è¡å¨SPDYä¹ä¸ãSPDY对å½åçHTTPåè®®æ4个æ¹è¿ï¼
å¤è·¯å¤ç¨è¯·æ±ï¼
对请æ±ååä¼å 级ï¼
å缩HTTP头ï¼
æå¡å¨æ¨éæµï¼å³Server Pushææ¯ï¼ï¼
SPDYè¯å¾ä¿çHTTPçç°æè¯ä¹ï¼æ以cookiesãETagsçç¹æ§é½æ¯å¯ç¨çã èéï¼
1ãè¶ ææ¬ä¼ è¾åè®®ï¼HTTPï¼æ¯ä¸ä¸ªé常æåçåè®®ã ç¶èï¼HTTP/1.1æ¶æ¯æ ¼å¼æ¯å®æ½ç®åæ§åå¯è®¿é®æ§çä¼åï¼èä¸æ¯åºç¨ç¨åºçæ§è½ã å æ¤å®å ·æ对åºç¨ç¨åºçæ§è½äº§çè´é¢å½±åæ»ä½å 个ç¹ç¹ã
ç¹å«æ¯ï¼HTTP/1.0åªå 许ä¸ä¸ªè¯·æ±æ¾ç¼æ¯æ¬¡ä¸ä¸ªç»å®çè¿æ¥ä¸ã HTTP/1.1æµæ°´çº¿åªè½é¨åå°è§£å³äºå¹¶åç请æ±ï¼å¹¶ä»çº¿å¤´çé»å¡åå°å½±åã å æ¤ï¼éè¦è¿è¡å¤æ¬¡è¯·æ±å®¢æ·ç«¯é常使ç¨å¤ä¸ªè¿æ¥å°æå¡å¨ï¼ä»¥åå°çå¾ æ¶é´ã
æ¤å¤ï¼HTTP/1.1çæ¥å¤´å段ç»å¸¸éå¤ååé¿ï¼å ¶ä¸ï¼é¤äºäº§çæ´å¤ææ´å¤§çç½ç»æ°æ®å ï¼å¯è½ä¼å¯¼è´å°çåå§TCPæ¥å¡çªå£æ¥å¿«éå¡«å ã è¿å¯è½ä¼å¯¼è´è¿åº¦ç延è¿ï¼å½å¤ä¸ªè¯·æ±å¨ä¸ä¸ªæ°çTCPè¿æ¥è¿è¡ã
该æéè¿å®ä¹ä¸ä¸ªåºç¡è¿æ¥çHTTPçè¯ä¹ä¼åçæ å°æ¥è§£å³è¿äºé®é¢ã å ·ä½å°ï¼å®å 许对请æ±åååºæ¶æ¯äº¤ç»å¨åä¸è¿æ¥ä¸ï¼å¹¶ä½¿ç¨é«æççç¼ç çHTTPæ¥å¤´å段ã å®è¿å 许请æ±çä¼å 级ï¼è®©æ´å¤çéè¦çè¦æ±æ´å¿«éçå®æï¼è¿ä¸æ¥æé«äºæ§è½ã
æå¾å°çå议被设计为æ´å好çç½ç»ï¼å 为è¾å°çTCPè¿æ¥é½å¯ä»¥ä½¿ç¨ï¼å¨æ¯è¾HTTP/1.xã è¿æå³çä¸å ¶ä»æµåé¿å¯¿å½çè¿æ¥ï¼èè¿å导è´äºæ´ææå°å©ç¨å¯ç¨çç½ç»å®¹éç«äºå°ã
æåï¼è¿ç§å°è£ ä¹å¯ä»¥éè¿ä½¿ç¨äºè¿å¶æ¶æ¯åæ¯ä½¿ä¿¡æ¯æ´å ·æ©å±æ§çå¤çã
1.1æ件ç»ç»ï¼
å¨HTTP/2.0è§è被åæä¸ä¸ªé¨åï¼å¼å§HTTP/2.0ï¼ ç¬¬3è ï¼ï¼å®æ¶µçäºå¦ä½ä¸ä¸ªHTTP/2.0è¿æ¥å¯å¨ï¼æ帧å±ï¼ 第4è ï¼ï¼å ¶ä¸å¤ç¨åä¸çTCPè¿æ¥æå个ç¬ç«ç帧类å«ï¼ä»¥åä¸ä¸ªHTTPå±ï¼ 第8è ï¼ï¼å®æå®äºè¡¨è¾¾æºå¶ä½¿ç¨æ帧å±çHTTP交äºã è½ç¶ä¸äºæ帧å±æ¦å¿µæ¯ä»HTTPçé离ï¼å»ºç«ä¸ä¸ªéç¨æ帧å±ä¸ç´æ²¡æä¸ä¸ªç®æ ã æ帧å±æ¯é对HTTPåè®®åæå¡å¨æ¨éçéæ±ã
1.2约å®åæ¯è¯ï¼
ä¸çå ³é®åâå¿ é¡»âï¼âå¿ é¡»ä¸âï¼âè¦æ±âï¼âåºâï¼âä¸åºâï¼âåºè¯¥âï¼âä¸åºè¯¥âï¼â建议âï¼âæ许âï¼è¯¥æ件ä¸âå¯éâå¦ä¸è§£éRFC [RFC]ã
æææ°å¼é½æ¯ä»¥ç½ç»åè顺åºã å¼æ¯æ 符å·ï¼é¤éå¦æ说æã æä¾å¨åè¿å¶æåå è¿å¶æ该å¼ï¼å¦éç¨ï¼ã åå è¿å¶æåçåç¼ä¸º0Xä»åè¿å¶ææ¬åºåå¼æ¥ã
æ¯è¯ï¼
客æ·ç«¯ï¼ç«¯ç¹åèµ·HTTPè¿æ¥ã
è¿æ¥ï¼ä¸¤ä¸ªç«¯ç¹ä¹é´ä¼ è¾çº§è¿æ¥ã
è¿æ¥é误ï¼å¯¹HTTP/2.0çè¿æ¥é误ã
端ç¹ï¼è¿æ¥ç客æ·ç«¯ææå¡å¨ã
æ¡æ¶ï¼éä¿¡çHTTP/2.0è¿æ¥ä¸çæå°åå ï¼å æ¬æ ¹æ®å¸§ç±»åç»æçåèçæ¥å¤´åå¯åé¿åº¦çåºåã
åè¡ï¼ä¸ä¸ªç«¯ç¹ã å½è®¨è®ºä¸ä¸ªç¹å®ç端ç¹ï¼â对çâæçæ¯é¥æ§å¨æ¥è®¨è®ºçé¦è¦è®®é¢ç«¯ç¹ã
æ¥æ¶å¨ï¼æ£å¨æ¥æ¶å¸§ç端ç¹ã
å件人ï¼è¢«åéç帧ç端ç¹ã
æå¡å¨ï¼ç«¯ç¹è没æ主å¨çHTTPè¿æ¥ã
æµï¼å¸§å¨è·¨è¶ä¸ä¸ªèæééçååæµå¨çHTTP/2.0è¿æ¥å ã
æµé误ï¼ä¸ªå«HTTP/2.0æµä¸çä¸ä¸ªé误ã
2ï¼ HTTP/2.0åè®®ä»ç»ï¼
HTTP/2.0æä¾çHTTPè¯ä¹ä¼åçè¿è¾ã
ä¸ä¸ªHTTP/2.0è¿æ¥éè¿ä¸ä¸ªTCPè¿æ¥ï¼ä¸é¢è¿è¡çåºç¨ç¨åºçº§åè®®[TCP] ï¼ã 客æ·ç«¯æ¯TCPè¿æ¥åèµ·è ã
该ææ¡£æè¿°äºä½¿ç¨ç±ä¸ä¸ªé¨åç»æçé»è¾ç»æçHTTP/2.0åè®®ï¼æ帧ï¼æºªæµï¼ååºç¨ç¨åºæ å°ã è¿ç§ç»ææä¾äºä¸»è¦ä½ä¸ºä¸ç§è¾ å©æ段ï¼è§èï¼å®ç°å¯ä»¥èªç±ä»è¯¥ç»æåæ£æ¯å¿ è¦çã
2.1çHTTPæ¡æ¶ï¼HTTP/2.0æä¾HTTPè¯ä¹çææåºååã HTTP请æ±åååºç¼ç 为é¿åº¦åç¼ç帧ï¼è§ç¬¬4.1è ï¼ã
HTTPæ 头å段被å缩æä¸ç³»åå å«å¤´åç¢ç帧ï¼åè§4.3è ï¼ã
2.2 HTTPå¤ç¨ï¼HTTP/2.0æä¾äºå¨å个è¿æ¥ä¸å¤ç¨HTTP请æ±åååºçè½åã å¤ä¸ªè¯·æ±æååºå¯ä»¥åæ¶å¨ä¸ä¸ªè¿æ¥ä¸ä½¿ç¨æµï¼åé第5è ï¼ã 为äºä¿æç¬ç«çæµï¼æµæ§å¶åä¼å 级æ¯å¿ è¦çã
2.3çHTTPè¯ä¹ï¼HTTP/2.0å®ä¹HTTP请æ±åååºå¦ä½æ å°å°æµï¼åè§8.1è ï¼ï¼å¹¶å¼å ¥äºæ°çäºå¨æ¨¡å¼ï¼æå¡å¨æ¨éï¼ç¬¬8.2è ï¼ã
3ï¼ å¯å¨HTTP/2.0ï¼HTTP/2.0使ç¨ç¸åçâment.1 ï¼ç¼è 注ï¼è¯·ç§»é¤æ¬èä¹åï¼è¿ä»½æ件çæç»ç该åå¸çå ¶ä½é¨å]
æåï¼å ¬å¸çRFCåªæå®ç°å¯ä»¥è®¤åèªå·±æ¯âHTTP/2.0âã
å®æ½ä¾åææ¬è´¯ç©¿è¯¥ææ¡£çå ¶ä½é¨å使ç¨âHTTP/2.0âä½ä¸ºå¯ä¸çç¼è¾ä¾¿å©çé®é¢ã è稿çæ¬çå®ç°å¿ é¡»ä¸è¯å«ä½¿ç¨è¿ä¸ªå符串ã å¯ä¸çä¾å¤è§åæ¯å å«å¨è¿æ¥å¤´ä¸çå符串建ç«HTTP/2.0è¿æ¥åï¼ç«å³éè¿å®¢æ·ç«¯åéçï¼åè§3.5è ï¼ï¼çå «ä½è¿ä¸ªåºå®é¿åº¦çåºåä¸åçååã
çæ¬çåè®®èæ¡çå®ç°å¿ é¡»å符串â - è稿âåç¸åºçèæ¡å·ç æ·»å å°æ è¯ç¬¦åé符ä¹åï¼'/'ï¼ã ä¾å¦ï¼èæ¡ï¼IETF-httpbis-http2-使ç¨çæ¯å符串âHTTP-draft-/2.0âæ è¯ã
è¿æ¯åºäºè¿äºçæ¬çèæ¡ä¸å ¼å®¹çå®éªï¼èä¸æ¯å¿ é¡»ç¨ä¸åçæ è¯ç¬¦æ¿æ¢å符串âèæ¡âã ä¾å¦ï¼ä¸ä¸ªå®éªå®æ½åç»åºäºå¿æ çç¼ç åºäºèæ¡-IETF-httpbis-http2-å¯è½å°èªèº«æ è¯ä¸ºâHTTP-emo-/2.0âã请注æï¼ä»»ä½æ ç¾å¿ 须符åæå®ä¹çâ令çâè¯æ³ç¬¬3.2.6èç[HTTP-P1] ã
3.2 å¯å¨HTTP/2.0为âhttpâçURIï¼å¦æ客æ·ç«¯ååºè¯·æ±å°ä¸ä¸ªâhttpâçURIï¼æ²¡æå ³äºå¯¹HTTP/2.0çæ¯æå éªç¥è¯ä½¿ç¨HTTPå级æºå¶ï¼ç¬¬6.7èç[HTTP-P1] ï¼ã 客æ·ç«¯ååºï¼å ¶ä¸å æ¬ä¸ä¸ªUpgrade头åè¯å«HTTP/2.0 HTTP/1.1请æ±ã å¨HTTP/1.1请æ±å¿ é¡»å å«æ£å¥½ä¸ä¸ªHTTP2 -è®¾ç½®ï¼ ç¬¬3.2.1è ï¼å¤´å段ã
ä¾å¦ï¼GET / default.htmçHTTP/1.1
è¿æ¥æ¹å¼ï¼å级ï¼HTTP2 - 设置
å级ï¼HTTP/2.0
HTTP2-设置ï¼HTTP/2.0设置ç<baseurlç¼ç payload>
å å«ä¸ä¸ªå®ä½æ£æç请æ±å¿ é¡»å¨å ¶å ¨é¨è¢«åéä¹åï¼å®¢æ·ç«¯å¯ä»¥åéHTTP/2.0帧ã è¿æå³ç大é请æ±å®ä½å¯ä»¥é»æ¢ä½¿ç¨çè¿æ¥ï¼ç´å°å®è¢«å®å ¨åéã
å¦ææåç»è¯·æ±çåå§è¯·æ±ç并åæ§æ¯å¾éè¦çï¼ä¸ä¸ªå°å°ç请æ±å¯ä»¥è¢«ç¨æ¥æ§è¡å级å°HTTP/2.0ï¼éæ¯ä»é¢å¤çå¾è¿è´¹ç¨ã
ä¸æ¯æHTTP/2.0çæå¡å¨å¯ä»¥ååºè¯·æ±ï¼å°±å¥½åUpgrade头å缺å¸ï¼
HTTP/1.1 OK
å 容é¿åº¦ï¼
Content-Typeï¼text / htmlç±»å
æ¯æHTTP/2.0çæå¡å¨å¯ä»¥æ¥åä¸ä¸ªï¼åæ¢åè®®ï¼ååºå级ã å æ¤ç»æ¢äºååºç空è¡åï¼æå¡å¨å°±å¯ä»¥å¼å§åéHTTP/2.0帧ã è¿äºæ¡æ¶å¿ é¡»å æ¬åèµ·å级请æ±çååºã
HTTP/1.1 交æ¢åè®®
è¿æ¥æ¹å¼ï¼å级
å级ï¼HTTP/2.0
[HTTP/2.0è¿æ¥...
ç±æå¡å¨åéç第ä¸ä¸ªHTTP/2.0帧æ¯ä¸ä¸ªè®¾ç½®æ¡ï¼ 6.5è ï¼ã å¨æ¶å°ååºï¼å®¢æ·ç«¯åéä¸ä¸ªè¿æ¥å¤´ï¼ 3.5è ï¼ï¼å ¶ä¸å æ¬ä¸ä¸ªè®¾ç½®æ¡ã
å¨å级ä¹åï¼åéçHTTP/1.1请æ±åé æµæ è¯ç¬¦1并åé å°½å¯è½é«çä¼å 级ã æµ1åéå¼ä»å°éåæå¡å¨ç客æ·ç«¯ï¼å 为该请æ±è¢«å®æHTTP/1.1请æ±ã èµ·çHTTP/2.0è¿æ¥åï¼æµ1被ç¨äºååºã
3.2.1 HTTP2 -设置头å段ï¼å³ä»å级å°HTTP/1.1 HTTP/2.0请æ±å¿ é¡»å®å ¨å æ¬ä¸ä¸ªHTTP2ï¼è®¾ç½®å¤´å段ã 该HTTP2 -设置æ 头æ ä½æ¯å æ¬è®¾ç½®æ¯é çHTTP/2.0è¿æ¥ï¼ç±äºé¢æ该æå¡å¨æ¥æ¶å°å级çè¦æ±æä¾é跳头å段ã æå¡å¨å¿ é¡»æç»å°è¯å级ï¼å¦æè¿ä¸ªå¤´åä¸åå¨ã
HTTP2 -设置= token
该HTTP2-设置æ 头å段çå 容æ¯ä¸ä¸ªææè½½è·è®¾ç½®å¸§ï¼ 第6.5è ï¼ï¼ç¼ç 为baseurlå符串ï¼å³ï¼å¨ææè¿°çURLåæ件åå®å ¨Baseç¼ç 第5èç[RFC] ï¼ä¸ä»»ä½å°¾é'='å符çç¥ï¼ã 该ABNF[RFC]ç产tokenæ¯å®ä¹å¨2.1èç[HTTP-P7] ã
客æ·ç«¯å¿ é¡»å å«å¼ä»¥ä¸è®¾ç½®ï¼ 第6.5.1è ï¼ï¼
SETTINGS_MAX_CONCURRENT_STREAMS
SETTINGS_INITIAL_WINDOW_SIZEä½ä¸ºä¸ä¸ªé跳头åï¼ è¿æ¥å¤´åå¿ é¡»å æ¬HTTP2 -设置çå¼é¤äºå级å°HTTP/2.0ä½æ¶å级 ã
æå¡å¨è§£ç å解éè¿äºå¼ï¼å 为å®ä¼ä»»ä½å ¶ä»è®¾ç½®æ¡ã å¨å级è¦æ±æä¾è¿äºå¼ç¡®ä¿åè®®ä¸éè¦è¿è¡ä¸è¿°è®¾ç½®çé»è®¤å¼ï¼å¹¶ç»åºäºä¸ä¸ªå®¢æ·ç«¯ä¸ä¸ªæºä¼ï¼ä¹åæ¥åä»»ä½å¸§ä»æå¡å¨æä¾çå ¶ä»è®¾ç½®ã
3.3 å¯å¨HTTP/2.0为âhttpsâå¼å¤´çURIï¼
å¦æ客æ·ç«¯ååºè¯·æ±å°ä¸ä¸ªâhttpsâå¼å¤´çURI没æå ³äºå¯¹HTTP/2.0çæ¯æå éªç¥è¯éç¨TLS [TLS]ä¸åºç¨å±åè®®ååçæ©å± [TLSALPN]ã
ä¸æ¦TLSååå®æåï¼å®¢æ·ç«¯åæå¡å¨åéä¸ä¸ªè¿æ¥å¤´ï¼ 3.5è ï¼ã
3.4 å¼å§HTTP/2.0ä¸åç½®ç¥è¯ï¼
客æ·ç«¯å¯ä»¥ç¥éæ个ç¹å®çæå¡å¨éè¿å ¶ä»æ¹å¼æ¯æHTTP/2.0ã 客æ·ç«¯å¯ä»¥ç«å³åéHTTP/2.0帧è³å·²ç¥æ¯æHTTP/2.0æå¡å¨ï¼è¿æ¥å¤´ï¼å第3.5è ï¼ã è¿æ¢å½±åäºâhttpâçURIçå辨çï¼æ¯æHTTP/2.0çæå¡å¨é½å¿ é¡»æ¯æçåè®®è°å¤ä¸çTLS [TLSALPN]为âhttpsâå¼å¤´çURIã
对äºHTTP/2.0çæ¯æä¹åæ¯ä¸æ¯ä¸ä¸ªå¼ºççä¿¡å·ï¼ä¸ä¸ªç»å®çæå¡å¨å°æ¯æHTTP/2.0为å°æ¥çè¿æ¥ãè¿æ¯å¯è½çæå¡å¨çé ç½®æ¥æ¹åæé ç½®ï¼ä»¥å¨ç¾¤éçæå¡å¨å®ä¾ä¹é´çå·®å¼ã æ¦æªä»£çï¼ååâéæâç代çï¼æ¯ååçå¦ä¸ä¸ªæ¥æºã
3.5 HTTP/2.0è¿æ¥æ¥å¤´ï¼å½å»ºç«ä¸ä¸ªTCPè¿æ¥åå³å¿HTTP/2.0å°ä½¿ç¨ä¸¤ä¸ªå¯¹ççï¼æ¯ä¸ªç«¯ç¹å¿ é¡»åéä¸ä¸ªè¿æ¥å¤´ä¸ºæç»ç¡®è®¤ï¼å¹¶å»ºç«äºHTTP/2.0è¿æ¥çåå§è®¾ç½®ã
客æ·ç«¯è¿æ¥å¤´å¼å§ç个åèï¼è¿å¨åå è¿å¶è¡¨ç¤ºæ³æ¯ä¸ä¸ªåºåï¼
afed0a0d0ad0d0a0d0a
ï¼å符串PRI * HTTP/2.0 \ r \n \ r \ NSM \ r \ n \ r \ nï¼ç ã 该åºååè·ä¸ä¸ªè®¾ç½®æ¡ï¼6.5è ï¼ã 客æ·ç«¯ç«å³æ¶å°çåæ¢ååºåè®®ï¼è¡¨ç¤ºæåå级ï¼ï¼æä½ä¸ºä¸ä¸ªTLSè¿æ¥ç第ä¸ä¸ªåºç¨ç¨åºæ°æ®å «ä½ä½ç»åé客æ·ç«¯çè¿æ¥å¤´ã å¦æå¼å§å¯¹åè®®çæå¡å¨æ¯æå éªç¥è¯çHTTP/2.0è¿æ¥ï¼å®¢æ·ç«¯è¿æ¥å¤´å¨è¿æ¥å»ºç«åéã
·客æ·ç«¯è¿æ¥å¤´æ¯è¿æ ·éæ©çHTTP/1.1æHTTP/1.0æå¡å¨åä¸ä»æºæçå¾å¤§æ¯ä¾å¹¶ä¸è¯å¾è¿ä¸æ¥å¤çæ¡æ¶ã 请注æï¼è¿å¹¶ä¸è§£å³æå ³æ³¨çé®é¢ ã
æå¡å¨è¿æ¥å¤´åªå å«ä¸ä¸ªç设置æ¡ï¼ 6.5è ï¼ï¼å¿ é¡»å¨æå¡å¨åæ¥çHTTP/2.0è¿æ¥ç第ä¸å¸§ã
为äºé¿å ä¸å¿ è¦ççå¾ æ¶é´ï¼å 许客æ·ç«¯åé客æ·ç«¯çè¿æ¥å¤´ï¼æ éçå¾ æ¥æ¶æå¡å¨çè¿æ¥å¤´ä¹åç«å³åéé¢å¤ç帧å°æå¡å¨ã ä½æ¯è¦æ³¨æï¼è¯¥æå¡å¨è¿æ¥å¤´æ¯å¾éè¦ç设置æ¡æ¶å¯è½å æ¬åæ°å¿ ç¶æ¹åäºå®¢æ·ç«¯å¦ä½ææä¸æå¡å¨è¿è¡éä¿¡ã å¨æ¶å°è®¾ç½®æ¡ï¼å¨å®¢æ·ç«¯ææå ç°å»ºç«çä»»ä½åæ°ã
客æ·ç«¯åæå¡å¨å¿ é¡»ç»æ¢TCPè¿æ¥ï¼å¦æä¸æ¯åè¡ä¸ä»¥ä¸ä¸ªææçè¿æ¥å¤´ã ä¸ä¸ªGOAWAYæ¡æ¶ï¼ 第6.8è ï¼å¦æå®æ¯æ确表示ï¼å¯¹ä¸ä½¿ç¨HTTP/2.0ï¼å¯ä»¥çç¥ã
4ï¼ HTTPæ¡æ¶ï¼
ä¸æ¦HTTP/2.0建ç«è¿æ¥ï¼ç«¯ç¹å°±å¯ä»¥å¼å§äº¤æ¢å¸§ã
4.1 å¸§æ ¼å¼ï¼ææçæ¡æ¶å¼å§ä¸ä¸ª8åèç头ï¼ç´§è·çç0å.ä¸ªå «ä½ä½ç»ä¹é´çææè½½è·ã
对äºä¿çç2ä½å段ã è¿äºä½çè¯ä¹æ¯ä¸ç¡®å®çååéæ¶è¯¥ä½å¿ é¡»ä¿ææªè®¾ç½®ï¼0ï¼åæ¥æ¶æ¶å¿ 须被忽ç¥ã
é¿åº¦ï¼å¸§ææè½½è·çé¿åº¦è¡¨ç¤ºä¸ºä¸ä¸ªæ 符å·ä½æ´æ°ã ç8个åèç帧头ä¸ä¸å å«è¿ä¸ªå¼ã
ç±»åï¼8ä½ç±»åçæ¡æ¶ã 帧类åå³å®äºå¸§å¤´åææè½½è·çå ¶ä½é¨å被解éã å®ç°å¿ 须忽ç¥ä¸åæ¯æææ æ³è¯å«ç±»åç帧ã
æ å¿ï¼ä¸ä¸ª8ä½å段ä¿ç帧类åç¹å®çå¸å°æ å¿ã
æ被åé å°ç¹å®ç表示帧类åè¯ä¹ã é£äºæ²¡æå®ä¹çè¯ä¹ä¸ºç¹å®å¸§ç±»åæ å¿å¿ 须被忽ç¥ï¼å¹¶ä¸åéæ¶å¿ é¡»ä¿ææªè®¾ç½®ï¼0ï¼ã
è®°ï¼å¯¹äºä¿çç1ä½å段ã 该ä½çè¯ä¹æ¯ä¸ç¡®å®çï¼åéåæ¥æ¶æ¶å¿ 须被忽ç¥æ¶ï¼è¯¥ä½å¿ é¡»ä¿ææªè®¾ç½®ç¶æï¼0ï¼ã
æµæ è¯ç¬¦ï¼A -bitæµæ è¯ç¬¦ï¼è§ç¬¬5.1.1è ï¼ã å¼0被ç¨äºä¸è¯¥è¿æ¥ä½ä¸ºä¸ä¸ªæ´ä½ç¸èï¼èä¸æ¯ä¸ä¸ªåç¬çæµç帧ä¿çã
帧ææè½½è·çç»æåå 容æ¯å®å ¨ä¾èµå¸§ç±»åã
4.2 帧大å°ï¼ä¸å¸§çææè½½è·çæ大尺寸ç±å¸§ç±»åä¸åèä¸åã ä¸å¸§çç»å¯¹æ大大å°ä¸º2 -1ï¼.ï¼åèã ææçå®ç°åºè½æ¥æ¶åå¤ççæå°å¸§æªè³æ大尺寸ã
æäºå¸§ç±»åï¼å¦ä¸å½å¹³å® ï¼åè§6.7è ï¼ï¼æ½å å 许çææè½½è·æ°æ®éçé¢å¤éå¶ã åæ ·ï¼å¦å¤ç大å°éå¶å¯ä»¥éè¿ç¹å®çåºç¨ç¨åºçç¨éè¿è¡è®¾ç½®ï¼è§ç¬¬9è ï¼ã
å¦æ帧大å°è¶ è¿ä»»ä½å·²å®ä¹çéå¶ï¼æè æ¯å¤ªå°ï¼æ æ³å å«å¼ºå¶æ§ç帧æ°æ®ï¼ç«¯ç¹å¿ é¡»åéä¸ä¸ªFRAME_SIZE_ERRORé误ã å¨å½±åè¿æ¥çº§ç¶æ帧帧大å°éè¯¯å¿ é¡»è¢«è§ä¸ºä¸ä¸ªè¿æ¥éè¯¯ï¼ ç¬¬5.4.1èï¼ã
4.3 æ¥å¤´å缩å解åï¼å¨HTTP/2.0æ 头å段æ¯ä¸ä¸ªå称 - å¼å¯¹ä¸ä¸ä¸ªæå¤ä¸ªç¸å ³èçå¼ã ä»ä»¬æ¯å¨HTTP请æ±åååºæ¶æ¯ï¼ä»¥åæå¡å¨æ¨éæä½ä¸ä½¿ç¨ï¼åè§8.2è ï¼ã
头å表æ¯æåºçæåï¼å¨åºç¨å±çé¶ä¸ªæå¤ä¸ªå¤´é¨å段çéåã å½å¨ä¸ä¸ªè¿æ¥ä¸ä¼ è¾ï¼ä¸ä¸ªå¤´å表åºåå为使ç¨æ é¢åçHTTPæ¥å¤´å缩 [å缩]ã åºååç头å被åæä¸ä¸ªæå¤ä¸ªåèçåºåï¼ç§°ä¸ºå¤´åç¢çï¼åæ 头ï¼ææè½½è·å ä¼ è¾6.2è ï¼ï¼PUSH_PROMISEï¼ 6.6è ï¼æ延ç»ï¼ 第6.è ï¼å¸§ã
该Cookieé¦é¨å段 [COOKIE]æ¯ç±HTTPæ å°ç¹æ®å¤çï¼è¯·åé 第8.1.3.3 ã
ä¸ç§æ¥æ¶ç»ç«¯éè¿è¿æ¥å个ç段éæ°ç»åç头åï¼ç¶å解å缩åæ¥éææ¥å¤´ç»ã
ä¸ä¸ªå®æ´ç头åç»æä¹ä¸ï¼
·åæéæPUSH_PROMISEæ¯ä¸ªåå«ä¸END_HEADERSæEND_PUSH_PROMISEæ å¿è®¾ç½®æ¡ï¼æ
·ä¸æéæPUSH_PROMISE帧ä¸END_HEADERSæEND_PUSH_PROMISEæ å¿æ¸ é¶åä¸ä¸ªæå¤ä¸ªç¹è¿ç»ç帧ï¼å ¶ä¸æåå»¶å¸§å ·æEND_HEADERæ å¿éã
头åå¿ é¡»è¢«åéä½ä¸ºå¸§çè¿ç»åºåï¼ä»¥åä»»ä½å ¶ä»ç±»åï¼æè éè¿ä»»ä½å ¶ä»æµçæ 交æ帧ã å¨åºåçæåä¸å¸§æ¥éæå»¶å¸§å¿ é¡»æEND_HEADERSæ å¿è®¾ç½®ã å¨åºåçæåä¸å¸§PUSH_PROMISEæå»¶å¸§å¿ é¡»æEND_PUSH_PROMISEæEND_HEADERSæ å¿è®¾ç½®ï¼åå«ï¼ã
头åç¢çåªè½ä½ä¸ºä¼ éçææè½½è·HEADERS ï¼ PUSH_PROMISEæåç»ç帧ã æé ï¼ PUSH_PROMISEåå»¶å¸§ä¼ è¾æ°æ®ï¼å¯ä»¥éè¿ä¿®æ¹ä¸ä¸ªæ¥æ¶å¨ä¿æå缩ä¸ä¸æã ä¸ä¸ªç«¯ç¹æ¥æ¶æ¥é ï¼ PUSH_PROMISEæå»¶å¸§å¿ é¡»éæ°è£ é 头ååæ§è¡è§£å缩ï¼å³ä½¿å¸§å°è¢«ä¸¢å¼ã æ¥æ¶å¨å¿ é¡»ç»æ¢ä¸è¿æ¥é误ï¼è¿æ¥ç¬¬5.4.1èç±»åï¼ COMPRESSION_ERROR ï¼å¦æå®æ²¡æ解å缩ä¸ä¸ªå¤´åã
安卓逆向解决淘系App 天猫 陶特等抓包问题
对于安卓平台上的淘系应用,如天猫和陶特,当我们试图使用像Fiddler或Charles这样的抓包工具进行网络数据监控时,可能会遇到难题。问题的根源在于这些应用并非采用常规的HTTP协议进行通信,而是采用了自定义的Spdy私有协议。
要解决这个问题,首先需要对应用进行逆向工程,找到判断是否使用Spdy协议的代码段。可供选择的手段有frida或xp hook技术,这里我选择了Xposed框架来进行操作。
针对天猫应用,逆向后的处理步骤是针对性的,通过Xposed模块对特定函数进行hook,以实现对Spdy协议的拦截和分析。
对于陶特应用,同样需要类似的逆向和修改过程,以适应其独特的Spdy通信机制。
在成功逆向并实现hook后,抓包工具就能捕捉到这些淘系App的私有协议数据,从而揭示其内部网络通信的细节。通过这种方式,我们可以深入理解并可能模拟或解析这些应用的通信内容。
如果你对这个过程或抓包模块有进一步的兴趣,可以通过关注爬虫逆向小林哥的微信公众号,获取更多相关教程和资源。
http1ãhttp1.1åhttp2çåºå«
å½±åä¸ä¸ªHTTPç½ç»è¯·æ±çå ç´ ä¸»è¦æ2个ï¼å¸¦å®½å延è¿ä¸»è¦åºå«ä½ç°å¨ç¼åå¤çï¼
1⃣️ç¼åå¤çã
å¨http1.0ä¸ä¸»è¦ä½¿ç¨headerçif-modified-since/expiresæ¥åç¼åçå¤æä¾æ®ã
http1.1å¼å ¥äºæ´å¤çç¼åçç¥æ§å¶çç¥ãæ¯å¦Entity tagï¼If-Unmodified-Sinceï¼If-matchï¼If-None-Matchçæ´å¤å¯ä¾éæ©çç¼å头æ¥æ§å¶ç¼åã
2⃣️带宽ä¼ååç½ç»è¿æ¥ç使ç¨ã
HTTP1.0ä¸åå¨ä¸äºæµªè´¹å¸¦å®½çç°è±¡ãä¾å¦å®¢æ·ç«¯åªéè¦æ个对象ä¸çä¸é¨åï¼æå¡å¨ç«¯å´ææ´ä¸ªå¯¹è±¡éè¿æ¥äºï¼å¹¶ä¸ä¸è½æ¯ææç¹ç»ä¼ çåè½ã
HTTP1.1å¨è¯·æ±å¤´ä¸å¼å ¥äºrange头åï¼å®å 许åªè¯·æ±èµæºä¸çæä¸é¨åï¼å³è¿åç æ¯ï¼partial contentï¼ãæ¹ä¾¿å¼åè çèªç±éæ©ãèç带宽ã
3⃣️é误éç¥ç管çã
å¨HTTP1.1ä¸æ°å¢äºä¸ªé误ç¶æååºç ãå¦ï¼conflictï¼è¡¨ç¤ºè¯·æ±çèµæºä¸èµæºå½åçç¶æåçå²çªï¼ï¼goneï¼è¡¨ç¤ºæå¡å¨ä¸çèµæºè¢«æ°¸ä¹ çå é¤ã
4⃣️host头å¤çã
å¨HTTP1.0ä¸è®¤ä¸ºæ¯ä¸ä¸ªæå¡å¨é½ç»å®ä¸ä¸ªipå°åï¼å æ¤è¯·æ±æ¶æ¯å¤´ä¸å¹¶æ²¡æä¼ é主æºåï¼hostnameï¼ã
ä½æ¯éçèæ主æºææ¯çåå±ï¼å¨ä¸å°ç©çæå¡å¨ä¸å¯ä»¥åå¨å¤å°èæ主æºï¼å¹¶ä¸ä»ä»¬å ±äº«ä¸ä¸ªipå°åã
HTTP1.1ä¸è¯·æ±åååºé½æ¯æhost头åï¼ä¸è¯·æ±æ¶æ¯ä¸å¦æ没æhost头åä¼æ¥éï¼bad requestï¼
5⃣️é¿é¾æ¥
HTTP1.1æ¯æé¿é¾æ¥å请æ±çæµæ°´çº¿å¤çï¼å¨ä¸ä¸ªTCPè¿æ¥ä¸å¯ä»¥ä¼ éå¤ä¸ªHTTP请æ±åååºï¼åå°äºå»ºç«å¤ä¸ªè¿æ¥çæ¶èå延è¿ãå¨HTTP1.1ä¸é»è®¤æå¼onnection:keep-aliveï¼å¨ä¸å®ç¨åº¦ä¸å¼¥è¡¥äºhttp1.0æ¯æ¬¡è¯·æ±é½è¦éæ°è¿æ¥ç缺é·ã
SPDYä¼åäºHTTP1.xç请æ±å»¶è¿ï¼è§£å³äºHTTP1.xçå®å ¨æ§
SPDYçææå¾
SPDYä½äºHTTPä¹ä¸ï¼TCPåSSLä¹ä¸ï¼è¿æ ·å°±å¯ä»¥è½»æ¾å ¼å®¹èçæ¬çHTTPåè®®ï¼åæ¶å¯ä»¥ä½¿ç¨å·²æçSSLåè½
HTTP2çæ§è½æ¯HTTP1.1好å¾å¤ï¼è¿éæ¯Akamaiå ¬å¸çä¸ä¸ª å®æ¹æ¼ç¤º
HTTP2.0å¯ä»¥è¯´æ¯SPDYçå级çï¼åæ¬ä¹æ¯åºäºSPDY设计çï¼ï¼ä½æ¯ä¸¤è è¿æ¯æä¸äºåºå«ï¼
æå¡å¨æ¨éè½æ客æ·ç«¯æéè¦çèµæºä¼´éindex.htmlä¸èµ·åéå°å®¢æ·ç«¯ï¼çå»äºå®¢æ·ç«¯éå¤è¯·æ±çæ¥éª¤ãæ£å 为没æå起请æ±ï¼å»ºç«è¿æ¥çæä½ï¼æ以éæèµæºéè¿æå¡å¨æ¨éçæ¹å¼å¯ä»¥æ大å°æåé度ã
åå®ä¸ä¸ªé¡µé¢æ个èµæºéè¦å è½½ï¼æ¯ä¸æ¬¡è¯·æ±é½æ1kbçæ¶æ¯å¤´ï¼åè³å°éè¦æ¶èkbæ¥è·åè¿äºè¯·æ±å¤´ãHTTP2.0ç»´æ¤ä¸ä¸ªåå ¸ï¼å·®éæ´æ°HTTP头é¨ï¼å¤§å¤§éä½å 头é¨ä¼ è¾äº§ççæµéã
HTTPä¼åçæ§è½å¹¶ä¸å¨äºé«å¸¦å®½ï¼èæ¯ä½å»¶è¿ãTCPè¿æ¥ä¼éçæ¶é´è¿è¡èªæè°è°ï¼èµ·åä¼éå¶è¿æ¥çæ大é度ï¼å¦ææ°æ®ä¼ è¾æåï¼ä¼éçæ¶é´çæ¨ç§»æé«ä¼ è¾çé度ãè¿ç§è°è°å«åTCPçæ ¢å¯å¨ãç±äºè¿ç§åå ï¼è®©åæ¬å°±å ·æçªåæ§åçæ¶æ§çHTTPè¿æ¥åå¾ååä½æã
HTTP/2让ææçæ°æ®æµå ±ç¨åä¸ä¸ªè¿æ¥ï¼å¯ä»¥æ´ææå°ä½¿ç¨TCPè¿æ¥ï¼è®©é«å¸¦å®½ä¹è½çæ£çæå¡äºHTTPçæ§è½æåã