|
qbe3wckrmjo64078510254.gif (60.41 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
qbe3wckrmjo64078510254.gif
2024-12-8 21:46 上傳
) V: h$ v. r* E/ ^+ q1 T
點(diǎn)擊上方藍(lán)色字體,關(guān)注我們 s8 X* U5 V, S1 U3 C2 g$ \4 I7 o
+ J( k. Z8 o- b b8 }8 h5 M% ^/ k8 |先說結(jié)論,如果某個(gè) TCP 段丟失并且重傳失敗,整個(gè) HTTP 請(qǐng)求都無法被應(yīng)用層讀取。" I2 m. Y9 L# F% N) |9 s6 T9 u
7 ?) t7 s0 J6 p0 t0 ^4 R
q005flc4ip164078510355.png (957.24 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
q005flc4ip164078510355.png
2024-12-8 21:46 上傳
+ q6 J0 F1 i* ~1 D& w
; u& ^- ~* ?( f$ f- J7 f應(yīng)用層只能在 TCP 層確保數(shù)據(jù)完整并交付后,才能處理這個(gè)請(qǐng)求。6 [: z3 Y# H$ N g0 D
1
1 }3 _- r/ `+ D+ `7 Z; B7 ZHTTP 請(qǐng)求的傳輸過程, N/ v. }* F/ A, t) c; [
HTTP 協(xié)議位于應(yīng)用層,而 TCP 位于傳輸層。當(dāng)應(yīng)用層(如瀏覽器或 HTTP 客戶端)發(fā)出一個(gè) HTTP 請(qǐng)求時(shí),HTTP 報(bào)文會(huì)先傳遞到傳輸層(TCP),在這里會(huì)被劃分成更小的段(TCP segments),每段會(huì)添加 TCP 頭,形成 TCP 報(bào)文段。TCP 使用這些段來確保傳輸?shù)目煽啃浴?br />
. s Y6 P& j2 a) w. u
7 C G6 Y. D9 ]7 b在傳輸層,TCP 會(huì)將 HTTP 數(shù)據(jù)切分為多個(gè)段,每個(gè) TCP 段的大小根據(jù)傳輸網(wǎng)絡(luò)的 MTU(最大傳輸單元)來決定。& k2 k* ?8 e& T; v( r- G3 g8 R4 z" D% L
3 k+ j' p. q5 w2 b/ l
在 IP 網(wǎng)絡(luò)中,通常 MTU 大小為 1500 字節(jié),因此一個(gè)大的 HTTP 報(bào)文會(huì)被分割為多個(gè) TCP 報(bào)文段,以適應(yīng)網(wǎng)絡(luò)傳輸?shù)囊蟆?br />
9 A5 |3 w) a$ J2+ y: y9 S* d; w+ c Y1 C$ ?
TCP 的可靠性與重傳機(jī)制" i4 e- q. n, p- [! Q1 _ l* o
TCP 是一種可靠傳輸協(xié)議,它通過以下機(jī)制保證數(shù)據(jù)完整性:* g" [: n+ e$ f9 f5 ~3 B! d
序列號(hào):每個(gè) TCP 段都有一個(gè)唯一的序列號(hào),接收端通過序列號(hào)確保數(shù)據(jù)的順序。確認(rèn)機(jī)制:接收端收到 TCP 段后會(huì)發(fā)送 ACK 確認(rèn)。重傳機(jī)制:如果發(fā)送端未在特定時(shí)間內(nèi)收到 ACK,便會(huì)重傳該 TCP 段。
' l% d \& t4 k& O
* U" n |7 `" w! I4 i) z' d& r如果某個(gè) TCP 段丟失(例如網(wǎng)絡(luò)問題導(dǎo)致的丟包),TCP 協(xié)議會(huì)嘗試重傳。- G2 R+ ]9 X0 r
! X. H7 H( d+ V4 [# h5 Q/ T; @
一般情況下,通過重傳機(jī)制能夠成功傳送丟失的數(shù)據(jù)段,從而讓接收端獲得完整的 HTTP 報(bào)文。: t5 Y+ Z; O- M6 g/ b8 `
3& o v. k! N' j* U! c
丟包未能成功重傳時(shí)會(huì)發(fā)生什么?$ |* x( x3 @' Z
假設(shè)某個(gè) TCP 段丟失了,并且多次重傳都失敗,這種情況下會(huì)導(dǎo)致 TCP 連接的中斷。% H8 L- K! w' G1 z: v0 L3 ]5 B+ R$ W
1 E b. Y! T" v+ X7 ]" _* t& A
TCP 在多次重傳失敗后會(huì)認(rèn)為網(wǎng)絡(luò)不穩(wěn)定,通常會(huì)中斷連接并返回錯(cuò)誤(比如 TCP 超時(shí))。& K- f' e- }2 d- \1 K
- d# n/ w; n$ @, U' I) h$ ]
一旦 TCP 連接中斷,HTTP 請(qǐng)求的數(shù)據(jù)便無法完整到達(dá)應(yīng)用層,整個(gè) HTTP 請(qǐng)求也就無法被應(yīng)用層讀取。
9 _4 t4 @( Z i4 v2 t9 w# v3 b4
. z9 v6 z7 L1 o2 y- ]/ c應(yīng)用層的數(shù)據(jù)讀取
: C8 H& `1 i% Y! B4 r- u; }應(yīng)用層不會(huì)直接讀取 TCP 段。數(shù)據(jù)到達(dá)接收端后,TCP 會(huì)在內(nèi)核中將各個(gè) TCP 段重新組裝成完整的數(shù)據(jù)流,只有當(dāng)完整的數(shù)據(jù)流被組裝好后,應(yīng)用層才會(huì)讀取。
: z, l# J; { B" ^( K6 R
; f* _. D8 S1 u* l因此,如果某個(gè) TCP 段無法成功傳輸,數(shù)據(jù)流無法完成組裝,應(yīng)用層也就無法獲取到這個(gè) HTTP 請(qǐng)求。( `- t0 X$ w8 A+ s9 P" y
0 E4 d8 j4 U' S8 z8 |8 h& k1 ]
在 Linux 等操作系統(tǒng)中,這個(gè)過程是由內(nèi)核的 TCP/IP 棧完成的。TCP 棧在處理 HTTP 報(bào)文時(shí),確保報(bào)文的完整性后才會(huì)交給應(yīng)用層。
6 C& K% ^$ r! C- p) e8 |
7 z" ~/ x& Q4 a7 M3 M5 k. d如果分段未能完全接收,則 TCP 棧不會(huì)將數(shù)據(jù)上交,應(yīng)用層也就不會(huì)讀取到部分?jǐn)?shù)據(jù)。( Z% B" Z2 E. ?& a& e
+ c" k) E- U s0 Q" {5 t% M
因此,如果某個(gè) TCP 段丟失并且重傳失敗,整個(gè) HTTP 請(qǐng)求都無法被應(yīng)用層讀取。應(yīng)用層只能在 TCP 層確保數(shù)據(jù)完整并交付后,才能處理這個(gè)請(qǐng)求。8 ^ c; l% M( ?3 J1 |
/ H/ Y0 `7 q( _- |2 D值得一提的是,HTTP/2 和 HTTP/3 都試圖減少 TCP 的傳輸影響。
' W. K% O# o+ y
) \4 p. G/ X1 iHTTP/2:在同一個(gè) TCP 連接上通過多路復(fù)用(Multiplexing)實(shí)現(xiàn)多個(gè)并行請(qǐng)求和響應(yīng),但依然依賴 TCP 的可靠傳輸。
, m: {: z, U( B4 j; s* @/ S. s7 p1 w" _0 X7 s0 Y* R
HTTP/3:基于 QUIC 協(xié)議,放棄了 TCP 的可靠傳輸,轉(zhuǎn)而使用 UDP,應(yīng)用層直接管理重傳、流控制等。
* g* e n) _& _) [& N, [+ ]9 l. T& n+ I/ S j }- l
這樣做的好處是,即便個(gè)別數(shù)據(jù)包丟失,也不影響其他數(shù)據(jù)包的傳遞。這種設(shè)計(jì)更適合現(xiàn)代網(wǎng)絡(luò)環(huán)境,減少了丟包對(duì)整體傳輸?shù)挠绊憽?font class="jammer">- F- O5 @9 ~) o" E6 G. w6 \& P
em3czcoskjj64078510455.jpg (71.14 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
em3czcoskjj64078510455.jpg
2024-12-8 21:46 上傳
9 z# R F8 g. T
vgtiseboe0g64078510555.gif (45.46 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
vgtiseboe0g64078510555.gif
2024-12-8 21:46 上傳
; Y/ m, m' J* L! o6 B& `" V! V5 l6 \點(diǎn)擊閱讀原文,更精彩~ |
|