|
qbe3wckrmjo64078510254.gif (60.41 KB, 下載次數(shù): 0)
下載附件
保存到相冊
qbe3wckrmjo64078510254.gif
2024-12-8 21:46 上傳
~+ `: S- K F" ]+ h點擊上方藍(lán)色字體,關(guān)注我們
6 e, O/ r# ]1 y- L0 M) _3 l2 \; z
先說結(jié)論,如果某個 TCP 段丟失并且重傳失敗,整個 HTTP 請求都無法被應(yīng)用層讀取。
. g$ Z, u/ w: n5 M: S7 t- m! `1 l5 e7 G8 ~7 U' X
q005flc4ip164078510355.png (957.24 KB, 下載次數(shù): 0)
下載附件
保存到相冊
q005flc4ip164078510355.png
2024-12-8 21:46 上傳
$ ?$ x7 k/ D( m. k! M
6 V, W+ e9 E* V應(yīng)用層只能在 TCP 層確保數(shù)據(jù)完整并交付后,才能處理這個請求。0 b7 ~0 y: a0 w6 R: @3 c% n8 F9 M
1
: R" v; O! V0 C5 Q3 t5 rHTTP 請求的傳輸過程
5 w. c4 }8 u( P. THTTP 協(xié)議位于應(yīng)用層,而 TCP 位于傳輸層。當(dāng)應(yīng)用層(如瀏覽器或 HTTP 客戶端)發(fā)出一個 HTTP 請求時,HTTP 報文會先傳遞到傳輸層(TCP),在這里會被劃分成更小的段(TCP segments),每段會添加 TCP 頭,形成 TCP 報文段。TCP 使用這些段來確保傳輸?shù)目煽啃浴?font class="jammer">8 x- a2 k! `5 a( n' {& @
K& J: y% N8 Z+ r6 p1 M
在傳輸層,TCP 會將 HTTP 數(shù)據(jù)切分為多個段,每個 TCP 段的大小根據(jù)傳輸網(wǎng)絡(luò)的 MTU(最大傳輸單元)來決定。6 u+ i. A+ q- s5 P. j
7 p' }) X2 W x* ]& i
在 IP 網(wǎng)絡(luò)中,通常 MTU 大小為 1500 字節(jié),因此一個大的 HTTP 報文會被分割為多個 TCP 報文段,以適應(yīng)網(wǎng)絡(luò)傳輸?shù)囊蟆?br />
. @" C6 Z- B; M- T* k2! B) N/ _- Q& C) }, Q6 J
TCP 的可靠性與重傳機制5 I! w6 h5 @% q' @# L3 O- `2 X
TCP 是一種可靠傳輸協(xié)議,它通過以下機制保證數(shù)據(jù)完整性:
" d3 v" c+ N$ t$ E! B( m( P序列號:每個 TCP 段都有一個唯一的序列號,接收端通過序列號確保數(shù)據(jù)的順序。確認(rèn)機制:接收端收到 TCP 段后會發(fā)送 ACK 確認(rèn)。重傳機制:如果發(fā)送端未在特定時間內(nèi)收到 ACK,便會重傳該 TCP 段。" K5 M( A6 J/ E6 @8 r8 h
8 X9 T( b5 V% v" @
如果某個 TCP 段丟失(例如網(wǎng)絡(luò)問題導(dǎo)致的丟包),TCP 協(xié)議會嘗試重傳。 I# l# l/ x6 b+ l
: @0 s- w% q( T- ^
一般情況下,通過重傳機制能夠成功傳送丟失的數(shù)據(jù)段,從而讓接收端獲得完整的 HTTP 報文。8 P1 |, h% ~, Y
3
9 U. F0 @' c* c9 n$ ?# l( _丟包未能成功重傳時會發(fā)生什么?
D- v# N; H; ~5 I0 `假設(shè)某個 TCP 段丟失了,并且多次重傳都失敗,這種情況下會導(dǎo)致 TCP 連接的中斷。
, C7 V/ c* z/ z6 L- T
6 j, m7 j; \1 _% N, ETCP 在多次重傳失敗后會認(rèn)為網(wǎng)絡(luò)不穩(wěn)定,通常會中斷連接并返回錯誤(比如 TCP 超時)。
9 g* D9 B5 u0 o
' R2 E9 P c$ c一旦 TCP 連接中斷,HTTP 請求的數(shù)據(jù)便無法完整到達(dá)應(yīng)用層,整個 HTTP 請求也就無法被應(yīng)用層讀取。
' d* {) ] y! ?4 a8 ]0 B/ \! l4
+ C, |: Q! f' ?: Y4 b! ?4 U4 ?應(yīng)用層的數(shù)據(jù)讀取
/ Q2 k5 ~% P5 Y F5 Y" M應(yīng)用層不會直接讀取 TCP 段。數(shù)據(jù)到達(dá)接收端后,TCP 會在內(nèi)核中將各個 TCP 段重新組裝成完整的數(shù)據(jù)流,只有當(dāng)完整的數(shù)據(jù)流被組裝好后,應(yīng)用層才會讀取。
# u$ y" C" o& A. r6 |* c; ?8 j, Y8 [8 B: h
因此,如果某個 TCP 段無法成功傳輸,數(shù)據(jù)流無法完成組裝,應(yīng)用層也就無法獲取到這個 HTTP 請求。
1 v3 b5 Y* Y3 C# C* d5 S5 {/ n5 V0 U7 U6 x: Y+ V6 R. X
在 Linux 等操作系統(tǒng)中,這個過程是由內(nèi)核的 TCP/IP 棧完成的。TCP 棧在處理 HTTP 報文時,確保報文的完整性后才會交給應(yīng)用層。0 e5 c+ F4 x6 A9 [7 Z7 G( B; q
2 J' ~! t4 r: g如果分段未能完全接收,則 TCP 棧不會將數(shù)據(jù)上交,應(yīng)用層也就不會讀取到部分?jǐn)?shù)據(jù)。4 d, z% K3 h4 r$ j! x9 G1 G
; Q! I7 I* q, N h) n
因此,如果某個 TCP 段丟失并且重傳失敗,整個 HTTP 請求都無法被應(yīng)用層讀取。應(yīng)用層只能在 TCP 層確保數(shù)據(jù)完整并交付后,才能處理這個請求。4 K o9 y1 ]! T- u; ^* l. d
0 b' y8 O9 B# H" x7 ^% s# T' @
值得一提的是,HTTP/2 和 HTTP/3 都試圖減少 TCP 的傳輸影響。
( Q# |: Q7 `/ t7 @# F. ]0 r) E! S. ]* f
' J+ B& G8 A4 q7 b% UHTTP/2:在同一個 TCP 連接上通過多路復(fù)用(Multiplexing)實現(xiàn)多個并行請求和響應(yīng),但依然依賴 TCP 的可靠傳輸。% p" P+ `+ Y( F
; j- U9 q- S6 D$ z$ B7 z: SHTTP/3:基于 QUIC 協(xié)議,放棄了 TCP 的可靠傳輸,轉(zhuǎn)而使用 UDP,應(yīng)用層直接管理重傳、流控制等。, \% x$ }8 l6 B5 Y* m/ P# M
* {) u5 ^ h- p- u4 ~
這樣做的好處是,即便個別數(shù)據(jù)包丟失,也不影響其他數(shù)據(jù)包的傳遞。這種設(shè)計更適合現(xiàn)代網(wǎng)絡(luò)環(huán)境,減少了丟包對整體傳輸?shù)挠绊憽?font class="jammer">) e- t3 }! R |. u, g: j
em3czcoskjj64078510455.jpg (71.14 KB, 下載次數(shù): 0)
下載附件
保存到相冊
em3czcoskjj64078510455.jpg
2024-12-8 21:46 上傳
; s9 ~* m0 K" P; P( |
vgtiseboe0g64078510555.gif (45.46 KB, 下載次數(shù): 0)
下載附件
保存到相冊
vgtiseboe0g64078510555.gif
2024-12-8 21:46 上傳
4 M) ~2 Y* g. z" ]0 e& P" f點擊閱讀原文,更精彩~ |
|