|
qbe3wckrmjo64078510254.gif (60.41 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
qbe3wckrmjo64078510254.gif
2024-12-8 21:46 上傳
# R" K% L4 S0 V/ Z3 |* E點(diǎn)擊上方藍(lán)色字體,關(guān)注我們, D! V$ @5 ~* T N9 f6 o* j8 F
. ^) P3 f- h; m' r% E4 V先說(shuō)結(jié)論,如果某個(gè) TCP 段丟失并且重傳失敗,整個(gè) HTTP 請(qǐng)求都無(wú)法被應(yīng)用層讀取。) i0 j: K/ K2 r5 m/ N
" _* G! h7 b ]% ?
q005flc4ip164078510355.png (957.24 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
q005flc4ip164078510355.png
2024-12-8 21:46 上傳
5 q, n: n2 S9 v' n8 Q" c) |9 f
! N& h3 n0 o% k ~6 C
應(yīng)用層只能在 TCP 層確保數(shù)據(jù)完整并交付后,才能處理這個(gè)請(qǐng)求。" C' F1 W h- S% H3 G: C7 @
1, C1 T# y7 ^- z8 [" | X
HTTP 請(qǐng)求的傳輸過(guò)程3 k: }/ \- t" ~) p: h
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 使用這些段來(lái)確保傳輸?shù)目煽啃浴?br />
/ ?; k' U4 g3 ]. B0 z. c3 Z; f+ b3 \4 L8 I
在傳輸層,TCP 會(huì)將 HTTP 數(shù)據(jù)切分為多個(gè)段,每個(gè) TCP 段的大小根據(jù)傳輸網(wǎng)絡(luò)的 MTU(最大傳輸單元)來(lái)決定。' {& u) }. \8 y3 c% f
# }1 Y5 e9 ?1 m% ]$ m在 IP 網(wǎng)絡(luò)中,通常 MTU 大小為 1500 字節(jié),因此一個(gè)大的 HTTP 報(bào)文會(huì)被分割為多個(gè) TCP 報(bào)文段,以適應(yīng)網(wǎng)絡(luò)傳輸?shù)囊蟆?font class="jammer">9 }- \, ~* R* J% p5 ]3 E6 v* M
2
# \# [* v1 o/ `" ]TCP 的可靠性與重傳機(jī)制
* O9 @6 R1 f- v8 W2 b+ [ l5 JTCP 是一種可靠傳輸協(xié)議,它通過(guò)以下機(jī)制保證數(shù)據(jù)完整性: K) W, N. @" W B1 N4 B
序列號(hào):每個(gè) TCP 段都有一個(gè)唯一的序列號(hào),接收端通過(guò)序列號(hào)確保數(shù)據(jù)的順序。確認(rèn)機(jī)制:接收端收到 TCP 段后會(huì)發(fā)送 ACK 確認(rèn)。重傳機(jī)制:如果發(fā)送端未在特定時(shí)間內(nèi)收到 ACK,便會(huì)重傳該 TCP 段。
, U8 }7 c. g1 _
7 }; X, r+ {- d如果某個(gè) TCP 段丟失(例如網(wǎng)絡(luò)問(wèn)題導(dǎo)致的丟包),TCP 協(xié)議會(huì)嘗試重傳。
8 ~; U7 T, n+ W/ m9 @
1 p8 y7 l- P! A( L, E一般情況下,通過(guò)重傳機(jī)制能夠成功傳送丟失的數(shù)據(jù)段,從而讓接收端獲得完整的 HTTP 報(bào)文。/ G- ^5 a+ I5 n
3
) D$ T' |! N/ y3 W+ ~; h) f& k丟包未能成功重傳時(shí)會(huì)發(fā)生什么?# F/ r0 C9 ?; K& ?5 U0 Q
假設(shè)某個(gè) TCP 段丟失了,并且多次重傳都失敗,這種情況下會(huì)導(dǎo)致 TCP 連接的中斷。
* Z0 a$ l4 M$ z* P) G
/ @ e: T+ H/ n5 ^; oTCP 在多次重傳失敗后會(huì)認(rèn)為網(wǎng)絡(luò)不穩(wěn)定,通常會(huì)中斷連接并返回錯(cuò)誤(比如 TCP 超時(shí))。0 @- l8 n. F2 s
- _( U7 l9 H/ }: A" D4 f
一旦 TCP 連接中斷,HTTP 請(qǐng)求的數(shù)據(jù)便無(wú)法完整到達(dá)應(yīng)用層,整個(gè) HTTP 請(qǐng)求也就無(wú)法被應(yīng)用層讀取。
) h! L) i( k+ m) u# H4% K( G% ]/ X& X) q
應(yīng)用層的數(shù)據(jù)讀取
" _; z( |( M4 N: l* X7 H應(yīng)用層不會(huì)直接讀取 TCP 段。數(shù)據(jù)到達(dá)接收端后,TCP 會(huì)在內(nèi)核中將各個(gè) TCP 段重新組裝成完整的數(shù)據(jù)流,只有當(dāng)完整的數(shù)據(jù)流被組裝好后,應(yīng)用層才會(huì)讀取。
5 y4 _& `: A$ g6 R
Q6 V+ [1 d% k$ m7 Z8 v6 U$ A! \5 b因此,如果某個(gè) TCP 段無(wú)法成功傳輸,數(shù)據(jù)流無(wú)法完成組裝,應(yīng)用層也就無(wú)法獲取到這個(gè) HTTP 請(qǐng)求。
4 ] W U, R3 p& l/ Q2 B' R! p- f6 _$ Y2 N/ E7 T
在 Linux 等操作系統(tǒng)中,這個(gè)過(guò)程是由內(nèi)核的 TCP/IP 棧完成的。TCP 棧在處理 HTTP 報(bào)文時(shí),確保報(bào)文的完整性后才會(huì)交給應(yīng)用層。
N! g. A$ m2 Q+ o" m- [5 H! Z% L" e- `3 v# x) p$ d* Y/ k$ f
如果分段未能完全接收,則 TCP 棧不會(huì)將數(shù)據(jù)上交,應(yīng)用層也就不會(huì)讀取到部分?jǐn)?shù)據(jù)。* L) ^/ n+ a8 _1 B) Q
0 H) R" m, b+ D% s6 {% R4 L2 C9 A( X因此,如果某個(gè) TCP 段丟失并且重傳失敗,整個(gè) HTTP 請(qǐng)求都無(wú)法被應(yīng)用層讀取。應(yīng)用層只能在 TCP 層確保數(shù)據(jù)完整并交付后,才能處理這個(gè)請(qǐng)求。
- r5 h) v; t0 f: N* v
. ?9 l% }6 N9 b/ o2 G值得一提的是,HTTP/2 和 HTTP/3 都試圖減少 TCP 的傳輸影響。
4 W- @8 T- f) r! a
" w4 r; o, S: |HTTP/2:在同一個(gè) TCP 連接上通過(guò)多路復(fù)用(Multiplexing)實(shí)現(xiàn)多個(gè)并行請(qǐng)求和響應(yīng),但依然依賴 TCP 的可靠傳輸。/ r, i7 Y5 a+ Z2 C
8 \4 f# C7 d/ a- F7 X' O" v; U: k
HTTP/3:基于 QUIC 協(xié)議,放棄了 TCP 的可靠傳輸,轉(zhuǎn)而使用 UDP,應(yīng)用層直接管理重傳、流控制等。
% v7 T8 g3 l7 m7 z
* J7 a4 V0 H2 [8 C% S+ @這樣做的好處是,即便個(gè)別數(shù)據(jù)包丟失,也不影響其他數(shù)據(jù)包的傳遞。這種設(shè)計(jì)更適合現(xiàn)代網(wǎng)絡(luò)環(huán)境,減少了丟包對(duì)整體傳輸?shù)挠绊憽?font class="jammer">. E5 m0 H, h+ G
em3czcoskjj64078510455.jpg (71.14 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
em3czcoskjj64078510455.jpg
2024-12-8 21:46 上傳
9 W/ {/ l8 h; N! W+ z
vgtiseboe0g64078510555.gif (45.46 KB, 下載次數(shù): 2)
下載附件
保存到相冊(cè)
vgtiseboe0g64078510555.gif
2024-12-8 21:46 上傳
) E* i8 J- o/ @6 e8 U) {點(diǎn)擊閱讀原文,更精彩~ |
|