電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 47|回復(fù): 0
收起左側(cè)

HTTP請求分割為多個TCP包后,如果一個TCP包丟失,應(yīng)用層會有什么影響?

[復(fù)制鏈接]

660

主題

660

帖子

4567

積分

四級會員

Rank: 4

積分
4567
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-12-8 08:01:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
+ }, 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

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 2 B4 {3 S: ?; e; V
    7 _' d6 g5 Q) A& S3 @
    點擊閱讀原文,更精彩~
  • 回復(fù)

    使用道具 舉報

    發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表