|
qbe3wckrmjo64078510254.gif (60.41 KB, 下載次數(shù): 0)
下載附件
保存到相冊
qbe3wckrmjo64078510254.gif
2024-12-8 21:46 上傳
( i& q; u& I3 y: u7 \4 v7 K點擊上方藍色字體,關(guān)注我們
/ l$ J1 }' E0 y0 }* m: m7 F; X- V; b
& b N: t4 T# D, a! X, s1 E4 g先說結(jié)論,如果某個 TCP 段丟失并且重傳失敗,整個 HTTP 請求都無法被應(yīng)用層讀取。& l6 r3 P% J( y9 `: d
+ ^- Z3 U" T3 @' {4 k# w
q005flc4ip164078510355.png (957.24 KB, 下載次數(shù): 0)
下載附件
保存到相冊
q005flc4ip164078510355.png
2024-12-8 21:46 上傳
+ u7 ?+ o4 u) @$ N' a4 b. h6 p
8 y- y) g, ]5 X: {4 |' |5 B應(yīng)用層只能在 TCP 層確保數(shù)據(jù)完整并交付后,才能處理這個請求。& a7 y! s( d% }5 w8 u7 ]
1/ a4 e! ^8 z! v; `6 U% g
HTTP 請求的傳輸過程8 d! A7 ?; o& E1 B9 g0 i
HTTP 協(xié)議位于應(yīng)用層,而 TCP 位于傳輸層。當應(yīng)用層(如瀏覽器或 HTTP 客戶端)發(fā)出一個 HTTP 請求時,HTTP 報文會先傳遞到傳輸層(TCP),在這里會被劃分成更小的段(TCP segments),每段會添加 TCP 頭,形成 TCP 報文段。TCP 使用這些段來確保傳輸?shù)目煽啃浴?font class="jammer">7 h# o# P1 u3 f$ `, g
9 ]! @$ O! ?1 Z: U$ F
在傳輸層,TCP 會將 HTTP 數(shù)據(jù)切分為多個段,每個 TCP 段的大小根據(jù)傳輸網(wǎng)絡(luò)的 MTU(最大傳輸單元)來決定。- D) F( \4 D$ [3 c0 X
$ I, B9 G# N4 L, W( X5 y% @& Q: J在 IP 網(wǎng)絡(luò)中,通常 MTU 大小為 1500 字節(jié),因此一個大的 HTTP 報文會被分割為多個 TCP 報文段,以適應(yīng)網(wǎng)絡(luò)傳輸?shù)囊蟆?br />
7 x: C9 E0 T' l6 n2
9 v7 Z1 t5 R6 b( o& ^& I' l ]TCP 的可靠性與重傳機制; |0 J4 u2 ^* C, Y; n/ Y
TCP 是一種可靠傳輸協(xié)議,它通過以下機制保證數(shù)據(jù)完整性:
, n6 ~8 g2 s. j序列號:每個 TCP 段都有一個唯一的序列號,接收端通過序列號確保數(shù)據(jù)的順序。確認機制:接收端收到 TCP 段后會發(fā)送 ACK 確認。重傳機制:如果發(fā)送端未在特定時間內(nèi)收到 ACK,便會重傳該 TCP 段。: H) l. h, q% a
, g# M. k1 h8 h$ l; K7 ]# H
如果某個 TCP 段丟失(例如網(wǎng)絡(luò)問題導(dǎo)致的丟包),TCP 協(xié)議會嘗試重傳。
# n! Q! G* f; V# |, o! `8 d/ f) R$ ]5 ]
一般情況下,通過重傳機制能夠成功傳送丟失的數(shù)據(jù)段,從而讓接收端獲得完整的 HTTP 報文。0 V- i0 A2 v: z Z- ]- I( T9 [& [* m
3) @# ?7 K0 |1 g) v
丟包未能成功重傳時會發(fā)生什么?
( W$ n+ w/ Q" d3 x! q- W假設(shè)某個 TCP 段丟失了,并且多次重傳都失敗,這種情況下會導(dǎo)致 TCP 連接的中斷。/ G m8 P0 t6 {% t/ h( {& M
u$ ^8 J9 G: G" a: |3 L- s
TCP 在多次重傳失敗后會認為網(wǎng)絡(luò)不穩(wěn)定,通常會中斷連接并返回錯誤(比如 TCP 超時)。5 o, |3 K( J+ X0 M. l* Q4 |4 R
( g6 D) }, ?4 D9 B1 u* P
一旦 TCP 連接中斷,HTTP 請求的數(shù)據(jù)便無法完整到達應(yīng)用層,整個 HTTP 請求也就無法被應(yīng)用層讀取。3 D3 l7 q# z/ S+ e9 m
4
( V& k k. J4 ^: V應(yīng)用層的數(shù)據(jù)讀取
0 s/ _9 M8 Q- @應(yīng)用層不會直接讀取 TCP 段。數(shù)據(jù)到達接收端后,TCP 會在內(nèi)核中將各個 TCP 段重新組裝成完整的數(shù)據(jù)流,只有當完整的數(shù)據(jù)流被組裝好后,應(yīng)用層才會讀取。
3 E6 n. W" j$ b% o% |3 R* d* o6 u" g' J9 \# p
因此,如果某個 TCP 段無法成功傳輸,數(shù)據(jù)流無法完成組裝,應(yīng)用層也就無法獲取到這個 HTTP 請求。% A, r: S1 g; T. Q6 B
! G: h9 g, v/ Y6 x$ g* O+ ^, m在 Linux 等操作系統(tǒng)中,這個過程是由內(nèi)核的 TCP/IP 棧完成的。TCP 棧在處理 HTTP 報文時,確保報文的完整性后才會交給應(yīng)用層。
5 Y* J; ]$ s$ ~/ l3 W2 p
8 ~( O; _0 N& t# b8 q# R如果分段未能完全接收,則 TCP 棧不會將數(shù)據(jù)上交,應(yīng)用層也就不會讀取到部分數(shù)據(jù)。
0 i) u" X# [$ V4 w/ b$ X$ i: n2 T0 ^' X* D2 u
因此,如果某個 TCP 段丟失并且重傳失敗,整個 HTTP 請求都無法被應(yīng)用層讀取。應(yīng)用層只能在 TCP 層確保數(shù)據(jù)完整并交付后,才能處理這個請求。
4 c; d% v3 a0 [* P+ S0 \, l1 t' c& L& I. P# }/ B- u
值得一提的是,HTTP/2 和 HTTP/3 都試圖減少 TCP 的傳輸影響。
, `- e, v& _0 ?
, x/ P% F" Z, i* RHTTP/2:在同一個 TCP 連接上通過多路復(fù)用(Multiplexing)實現(xiàn)多個并行請求和響應(yīng),但依然依賴 TCP 的可靠傳輸。
( \! l+ ], K5 }) b- [
1 e: y0 f$ P" _5 kHTTP/3:基于 QUIC 協(xié)議,放棄了 TCP 的可靠傳輸,轉(zhuǎn)而使用 UDP,應(yīng)用層直接管理重傳、流控制等。9 x+ K0 Z0 j6 A% \
3 W* ?" x' J r$ h* @& d
這樣做的好處是,即便個別數(shù)據(jù)包丟失,也不影響其他數(shù)據(jù)包的傳遞。這種設(shè)計更適合現(xiàn)代網(wǎng)絡(luò)環(huán)境,減少了丟包對整體傳輸?shù)挠绊憽?br />
2 x4 I% Q+ J7 v6 @8 s z3 S
em3czcoskjj64078510455.jpg (71.14 KB, 下載次數(shù): 0)
下載附件
保存到相冊
em3czcoskjj64078510455.jpg
2024-12-8 21:46 上傳
6 q- y8 L N* i- S
vgtiseboe0g64078510555.gif (45.46 KB, 下載次數(shù): 0)
下載附件
保存到相冊
vgtiseboe0g64078510555.gif
2024-12-8 21:46 上傳
( y. j$ n% v+ e1 c3 S
點擊閱讀原文,更精彩~ |
|