TCP 三向握手 - 搭载 ACK
TCP Three way handshake - Piggybacking ACKs
我理解在三次握手中,有时接收端在建立连接时会发送一个SYNACK包(piggybacking),但是什么时候会发送一个SYN然后发送一个ACK包呢?
例如:
->SYN
<-SYN_ACK
->ACK
对比:
->SYN
<-SYN
->SYN_ACK
谢谢!
不,不会 - 这就是
的原因
SYN 通常由 'client'(例如您的浏览器)在想要打开到服务器(例如您的 Web 服务器)的 TCP 连接时发送。服务器无法事先 'knowing' 知道哪个客户端想要打开一个连接(并因此发送一个 SYN)。所以它不能发送未经请求的 SYN。
SYN 和 ACK 是标志,因此来自服务器的 SYN-ACK 是对客户端 SYN(并且它自己的 SYN)的 ACK。从技术上讲,它可以单独发送它们,但是,单独发送 SYN 和 ACK 会增加半个往返。因为这将是四次握手 ((c)SYN -> , <- SYN(s), <-ACK(s), (c)ACK ->) 不会比三次握手更可靠握手优惠。因此,这样做是没有意义的。
话虽如此,理论上您可以设计一个具有 4 次握手的协议,但 TCP 并不是这样设计的。
希望对您有所帮助。
我理解在三次握手中,有时接收端在建立连接时会发送一个SYNACK包(piggybacking),但是什么时候会发送一个SYN然后发送一个ACK包呢?
例如:
->SYN
<-SYN_ACK
->ACK
对比:
->SYN
<-SYN
->SYN_ACK
谢谢!
不,不会 - 这就是
的原因SYN 通常由 'client'(例如您的浏览器)在想要打开到服务器(例如您的 Web 服务器)的 TCP 连接时发送。服务器无法事先 'knowing' 知道哪个客户端想要打开一个连接(并因此发送一个 SYN)。所以它不能发送未经请求的 SYN。
SYN 和 ACK 是标志,因此来自服务器的 SYN-ACK 是对客户端 SYN(并且它自己的 SYN)的 ACK。从技术上讲,它可以单独发送它们,但是,单独发送 SYN 和 ACK 会增加半个往返。因为这将是四次握手 ((c)SYN -> , <- SYN(s), <-ACK(s), (c)ACK ->) 不会比三次握手更可靠握手优惠。因此,这样做是没有意义的。
话虽如此,理论上您可以设计一个具有 4 次握手的协议,但 TCP 并不是这样设计的。
希望对您有所帮助。