三路握手阶段的应用层内部有什么东西吗?

网络工程 tcp
2022-02-06 04:17:12

那么不管是什么协议,TCP握手包的应用层都是空的吗?

当 TCP 握手的第一个数据包(阶段 1)到达服务器时,如果该数据包中没有应用层且基本上没有消息,服务器会将数据包交给哪个进程?我的意思是该过程将如何处理一条空消息?你们能详细解释一下吗?(例如,如果操作系统处理 3 次握手数据包,那么它究竟是如何发生的以及哪个进程获取数据包?)

1个回答

TCP 段中不必有任何有效负载数据。该段只能包含在 TCP 标头中发出的控制信息。如果一个段到达时没有有效载荷数据,则接收 TCP 不必向应用程序发送任何内容,除非控制信息需要它(例如,标志发出 FIN 或 RST 信号,而 TCP 需要向应用程序发出信号)。

有趣的是,在三次握手期间,没有什么能阻止 TCP 在 TCP 有效负载中发送应用程序数据。如果 TCP 在三次握手完成之前接收到有效负载数据,它必须缓冲数据并且在握手完成并且连接处于 ESTABLISHED 状态之前不会将其传递给应用程序。

来自 RFC 793:

尽管这些示例没有显示使用携带数据的段进行连接同步,但这是完全合法的,只要接收 TCP 不将数据传递给用户,直到明确数据有效(即,数据必须被缓冲)直到连接达到 ESTABLISHED 状态)。三向握手减少了错误连接的可能性。它是在内存和消息之间进行权衡的实现,以提供用于此检查的信息。

还有一个名为 TCP Fast Open (RFC 7413) 的扩展,它对短期连接很有用,并允许在特定条件下,在三次握手完成之前将数据发送到应用程序。

因此,要回答您的问题,这取决于实现以及应用程序在三次握手期间是否有任何数据要发送。有些连接在握手段的有效负载中没有应用程序数据,有些则有。

对于每个 TCP 连接,总是有一个应用程序要向其传递数据(除非它试图连接到未打开的端口)。一侧的应用程序启动了连接(通过 TCP),另一侧的另一个应用程序打开了一个端口并正在侦听该端口(通过 TCP)。如果该段没有有效负载数据,则 TCP 不需要向应用程序发送任何内容。如果是这样,它可以在连接建立后发送它或更早使用快速打开