|
qbe3wckrmjo64078510254.gif (60.41 KB, 下載次數(shù): 0)
下載附件
保存到相冊
qbe3wckrmjo64078510254.gif
2024-12-8 21:46 上傳
+ }, M; n8 k) u7 `
點擊上方藍(lán)色字體,關(guān)注我們
: ]2 h$ s4 u2 e- O1 \
0 N$ }- n/ Y# _5 ?先說結(jié)論,如果某個 TCP 段丟失并且重傳失敗,整個 HTTP 請求都無法被應(yīng)用層讀取。5 K/ ~, G# H9 j; R, p
3 z7 R) q; R* E2 C" d
q005flc4ip164078510355.png (957.24 KB, 下載次數(shù): 0)
下載附件
保存到相冊
q005flc4ip164078510355.png
2024-12-8 21:46 上傳
4 \. N: t& X1 G! A6 d. w9 O7 i
e4 t: J, |3 Z$ V應(yīng)用層只能在 TCP 層確保數(shù)據(jù)完整并交付后,才能處理這個請求。
9 i6 `' e6 e. ]. [) g' s1 h$ A- F3 o& l
HTTP 請求的傳輸過程
6 x1 z( h; S2 m1 r9 eHTTP 協(xié)議位于應(yīng)用層,而 TCP 位于傳輸層。當(dāng)應(yīng)用層(如瀏覽器或 HTTP 客戶端)發(fā)出一個 HTTP 請求時,HTTP 報文會先傳遞到傳輸層(TCP),在這里會被劃分成更小的段(TCP segments),每段會添加 TCP 頭,形成 TCP 報文段。TCP 使用這些段來確保傳輸?shù)目煽啃浴?br />
0 d& Z: M# ^. N& h G# Y& Q# i
1 S/ n- v+ E* B/ k7 P' u" S9 E" z在傳輸層,TCP 會將 HTTP 數(shù)據(jù)切分為多個段,每個 TCP 段的大小根據(jù)傳輸網(wǎng)絡(luò)的 MTU(最大傳輸單元)來決定。
# P- A1 d* C; ?2 O+ K* Y' `6 i3 t8 U
, t9 Z2 \* u; J& c0 B9 n在 IP 網(wǎng)絡(luò)中,通常 MTU 大小為 1500 字節(jié),因此一個大的 HTTP 報文會被分割為多個 TCP 報文段,以適應(yīng)網(wǎng)絡(luò)傳輸?shù)囊蟆?br />
3 }0 s, T3 w, w: ]; u* t2
4 f4 K, s Q" Y4 z! a$ B6 zTCP 的可靠性與重傳機制
) v/ Q z1 _2 Z6 r2 Z& J8 A( J- j% ^' ]7 RTCP 是一種可靠傳輸協(xié)議,它通過以下機制保證數(shù)據(jù)完整性:
1 n- j! V( Z2 q9 H6 S/ j% L% q# j* x序列號:每個 TCP 段都有一個唯一的序列號,接收端通過序列號確保數(shù)據(jù)的順序。確認(rèn)機制:接收端收到 TCP 段后會發(fā)送 ACK 確認(rèn)。重傳機制:如果發(fā)送端未在特定時間內(nèi)收到 ACK,便會重傳該 TCP 段。
4 {. n( `( Q. F, K+ H- ]+ Q F5 U8 o8 o( Q. @9 v6 C, h
如果某個 TCP 段丟失(例如網(wǎng)絡(luò)問題導(dǎo)致的丟包),TCP 協(xié)議會嘗試重傳。% \* a* a( V; C' S1 |" R. |$ x" a
# E3 i: p% H$ K. {' m* J3 N4 Z) X
一般情況下,通過重傳機制能夠成功傳送丟失的數(shù)據(jù)段,從而讓接收端獲得完整的 HTTP 報文。
' I! _3 h" m0 R37 g& ~; x8 V. y! C6 l
丟包未能成功重傳時會發(fā)生什么?$ i7 p$ L+ m! ]1 Y& Y9 F. _# ?
假設(shè)某個 TCP 段丟失了,并且多次重傳都失敗,這種情況下會導(dǎo)致 TCP 連接的中斷。$ a$ ?3 ?# }5 ~ m5 C
3 T, g$ H3 F9 Z+ B! P& }' gTCP 在多次重傳失敗后會認(rèn)為網(wǎng)絡(luò)不穩(wěn)定,通常會中斷連接并返回錯誤(比如 TCP 超時)。
5 l; a5 X. z4 W* e6 ^! M; W% [$ M
一旦 TCP 連接中斷,HTTP 請求的數(shù)據(jù)便無法完整到達(dá)應(yīng)用層,整個 HTTP 請求也就無法被應(yīng)用層讀取。6 x' ~( O1 Z8 ?; s( D8 e
4+ n4 ^6 R- s- y1 f4 z- T/ p" P
應(yīng)用層的數(shù)據(jù)讀取
- R/ X* k( z* o8 l7 V6 o. K6 A應(yīng)用層不會直接讀取 TCP 段。數(shù)據(jù)到達(dá)接收端后,TCP 會在內(nèi)核中將各個 TCP 段重新組裝成完整的數(shù)據(jù)流,只有當(dāng)完整的數(shù)據(jù)流被組裝好后,應(yīng)用層才會讀取。0 H( \. D# P4 B- H8 N9 i, a D3 Y- B/ V
) W- X$ [6 x/ o* N+ {) R因此,如果某個 TCP 段無法成功傳輸,數(shù)據(jù)流無法完成組裝,應(yīng)用層也就無法獲取到這個 HTTP 請求。7 t4 c: j3 }9 g' }1 u" O; V
2 b+ H3 J3 r9 ?在 Linux 等操作系統(tǒng)中,這個過程是由內(nèi)核的 TCP/IP 棧完成的。TCP 棧在處理 HTTP 報文時,確保報文的完整性后才會交給應(yīng)用層。0 \2 i5 S; H# w! F0 D8 [! p. s: P, N
7 N2 Z3 h( S! x" E9 z
如果分段未能完全接收,則 TCP 棧不會將數(shù)據(jù)上交,應(yīng)用層也就不會讀取到部分?jǐn)?shù)據(jù)。 X/ Z$ |# L% {7 a2 ?+ K
4 K* e& T3 L) O+ `; J6 S
因此,如果某個 TCP 段丟失并且重傳失敗,整個 HTTP 請求都無法被應(yīng)用層讀取。應(yīng)用層只能在 TCP 層確保數(shù)據(jù)完整并交付后,才能處理這個請求。; B+ R4 f! N8 [" R
/ G8 B- Z1 M, y V! n
值得一提的是,HTTP/2 和 HTTP/3 都試圖減少 TCP 的傳輸影響。
3 Y& Y- i8 L1 M1 s/ x
, i6 w3 X& F. W! O. a6 U" u) b& FHTTP/2:在同一個 TCP 連接上通過多路復(fù)用(Multiplexing)實現(xiàn)多個并行請求和響應(yīng),但依然依賴 TCP 的可靠傳輸。. [; I. } F7 w K# X6 o4 c+ D+ ~
' L0 Z5 D' v, K7 a: V3 Q* p$ J
HTTP/3:基于 QUIC 協(xié)議,放棄了 TCP 的可靠傳輸,轉(zhuǎn)而使用 UDP,應(yīng)用層直接管理重傳、流控制等。
& |( _" `' N* V( `, I9 F% w5 y3 _
這樣做的好處是,即便個別數(shù)據(jù)包丟失,也不影響其他數(shù)據(jù)包的傳遞。這種設(shè)計更適合現(xiàn)代網(wǎng)絡(luò)環(huán)境,減少了丟包對整體傳輸?shù)挠绊憽?br />
0 H: t. M4 D' t0 X9 G
em3czcoskjj64078510455.jpg (71.14 KB, 下載次數(shù): 0)
下載附件
保存到相冊
em3czcoskjj64078510455.jpg
2024-12-8 21:46 上傳
2 B4 {3 S: ?; e; V
vgtiseboe0g64078510555.gif (45.46 KB, 下載次數(shù): 0)
下載附件
保存到相冊
vgtiseboe0g64078510555.gif
2024-12-8 21:46 上傳
7 _' d6 g5 Q) A& S3 @
點擊閱讀原文,更精彩~ |
|