那么,无论协议是什么,TCP握手包的应用层都是空的吗?
当TCP握手的第一个包(第一阶段)到达服务器时,如果该数据包中没有应用层,并且基本上没有消息,那么服务器将该数据包交给哪个进程呢?我的意思是这个过程会用一个空的信息做什么?你们能详细解释一下吗?(例如,如果O.S处理3路握手数据包,那么它是如何发生的,以及哪个进程得到了数据包?)
发布于 2018-07-25 17:00:33
TCP段中不需要有任何有效负载数据。该段只能包含TCP报头中所指示的控制信息。如果一个段到达时没有有效负载数据,则接收TCP不需要向应用程序发送任何内容,除非控制信息要求它(例如,标志表示FIN或RST,TCP需要向应用程序发送信号)。
有趣的是,在三方握手期间,没有什么能阻止TCP在TCP有效负载中发送应用程序数据。如果TCP在完成三方握手之前接收有效负载数据,则必须缓冲数据,在握手完成和连接处于已建立状态之前,不将数据传递到应用程序。
来自RFC 793:
尽管这些示例不显示使用数据承载段的连接同步,但这是完全合法的,只要接收TCP不向用户传递数据,直到数据清楚无误(即,数据必须在接收方缓冲,直到连接达到既定状态为止)。这种三方握手减少了错误连接的可能性。它是在内存和消息之间进行权衡的实现,以便为此检查提供信息。
还有一个名为that (RFC 7413)的扩展,它对于短暂的连接非常有用,并且允许在特定条件下,在三方握手完成之前将数据发送到应用程序。
因此,要回答您的问题,这取决于实现和应用程序是否有任何数据要发送在三方握手。有些连接在握手段的有效负载中没有应用程序数据,而其他连接则没有。
对于每个TCP连接,总是有一个应用程序要将数据传递给它(除非它试图连接到未打开的端口)。一方的应用程序启动连接(通过TCP),另一方的应用程序打开端口并监听该端口(通过TCP)。如果段没有有效负载数据,则TCP不需要向应用程序发送任何内容。如果是这样的话,它可以在建立连接后发送它,或者在快速打开之前发送它。
https://networkengineering.stackexchange.com/questions/52031
复制相似问题