qbe3wckrmjo64078510254.gif
% |7 b7 b7 j' A3 h M4 t
点击上方蓝色字体,关注我们) ?- O& A" d" o. C
2 r& Z8 L7 \) W2 _先说结论,如果某个 TCP 段丢失并且重传失败,整个 HTTP 请求都无法被应用层读取。
5 E' I& ]; Y4 [ G
& o4 X6 v: h; m$ K& ^
q005flc4ip164078510355.png
w/ I' q) I, T' [3 g
' J1 M; e; G1 {6 o9 w2 o应用层只能在 TCP 层确保数据完整并交付后,才能处理这个请求。$ W& s! \2 R0 e) @, P o# ^
1+ o% y! a( i m) T
HTTP 请求的传输过程
; T# N/ x) v1 ^" C2 o3 U8 A7 {, `) wHTTP 协议位于应用层,而 TCP 位于传输层。当应用层(如浏览器或 HTTP 客户端)发出一个 HTTP 请求时,HTTP 报文会先传递到传输层(TCP),在这里会被划分成更小的段(TCP segments),每段会添加 TCP 头,形成 TCP 报文段。TCP 使用这些段来确保传输的可靠性。
. x3 w) R1 u2 H6 m1 Y- h6 @
0 b$ b: S- e3 ?. H* j9 y& J) I7 T在传输层,TCP 会将 HTTP 数据切分为多个段,每个 TCP 段的大小根据传输网络的 MTU(最大传输单元)来决定。" Q( M2 H; \3 d# `/ n( k
! E6 D# m' i" z: p& m8 p( u& E
在 IP 网络中,通常 MTU 大小为 1500 字节,因此一个大的 HTTP 报文会被分割为多个 TCP 报文段,以适应网络传输的要求。
2 m6 M# ]# A$ g1 A1 H% H2, _4 J! q% l- q6 Z0 F4 ~
TCP 的可靠性与重传机制
' ]- p; P r9 f( w5 jTCP 是一种可靠传输协议,它通过以下机制保证数据完整性:, @5 G; h% z/ ~+ R
序列号:每个 TCP 段都有一个唯一的序列号,接收端通过序列号确保数据的顺序。确认机制:接收端收到 TCP 段后会发送 ACK 确认。重传机制:如果发送端未在特定时间内收到 ACK,便会重传该 TCP 段。
5 _$ k: N) h; W& ~
" @* i8 W9 R2 C3 m, c如果某个 TCP 段丢失(例如网络问题导致的丢包),TCP 协议会尝试重传。2 r8 w4 e$ x7 F- a3 p% l
0 D L' P9 n/ A- _# Y+ c0 \
一般情况下,通过重传机制能够成功传送丢失的数据段,从而让接收端获得完整的 HTTP 报文。
- w; I# r# Z! D' {4 H) A3
6 h& A+ l) E; `2 ]% Y. |丢包未能成功重传时会发生什么?) Q% a5 H1 D# u! B; m% ~1 v
假设某个 TCP 段丢失了,并且多次重传都失败,这种情况下会导致 TCP 连接的中断。: C# N* m7 K2 E7 X d! u; D) Z3 U! y
+ |% I2 o5 h- h, ITCP 在多次重传失败后会认为网络不稳定,通常会中断连接并返回错误(比如 TCP 超时)。! ]8 u. W. e5 z! `# J# {5 d
* a6 b4 t0 M( F, n. G% a一旦 TCP 连接中断,HTTP 请求的数据便无法完整到达应用层,整个 HTTP 请求也就无法被应用层读取。
6 d1 | R% |: d) _; _! d49 p% A; {" m% D* D
应用层的数据读取
: L' F7 K# `; Y# T应用层不会直接读取 TCP 段。数据到达接收端后,TCP 会在内核中将各个 TCP 段重新组装成完整的数据流,只有当完整的数据流被组装好后,应用层才会读取。8 o- t+ J; o' R1 ]4 p
; r$ ?. X/ e. g3 D% k
因此,如果某个 TCP 段无法成功传输,数据流无法完成组装,应用层也就无法获取到这个 HTTP 请求。6 a5 ^! A) }2 j# i' V5 B) D3 w
+ P* }% n, z, B, D6 d
在 Linux 等操作系统中,这个过程是由内核的 TCP/IP 栈完成的。TCP 栈在处理 HTTP 报文时,确保报文的完整性后才会交给应用层。$ b7 ]) p0 U+ m
7 n: a r5 E/ d如果分段未能完全接收,则 TCP 栈不会将数据上交,应用层也就不会读取到部分数据。
8 q5 K) e2 E9 t, b5 K" N4 H! r* C1 x) h- }5 \
因此,如果某个 TCP 段丢失并且重传失败,整个 HTTP 请求都无法被应用层读取。应用层只能在 TCP 层确保数据完整并交付后,才能处理这个请求。5 g4 X* F' _' y% o
3 n2 }# v, F d$ g! `
值得一提的是,HTTP/2 和 HTTP/3 都试图减少 TCP 的传输影响。; l% ?1 ~ a0 l7 ^4 Z3 t1 E
! ^/ F6 e9 o6 e+ b9 K: K Y
HTTP/2:在同一个 TCP 连接上通过多路复用(Multiplexing)实现多个并行请求和响应,但依然依赖 TCP 的可靠传输。$ v) [& x: o, e8 A% C& T$ y
. s5 e( p1 x, a tHTTP/3:基于 QUIC 协议,放弃了 TCP 的可靠传输,转而使用 UDP,应用层直接管理重传、流控制等。0 G9 O0 @3 |6 O4 T, o6 r3 _
! Q/ _9 G, d7 F8 c
这样做的好处是,即便个别数据包丢失,也不影响其他数据包的传递。这种设计更适合现代网络环境,减少了丢包对整体传输的影响。) q) C t) N1 U; `% z# B* G# }
em3czcoskjj64078510455.jpg
3 @# q) {8 N. f4 c
vgtiseboe0g64078510555.gif
4 j S, H v) z6 i% q) c/ u
点击阅读原文,更精彩~ |