TCP握手:在哪一点连接被认为是建立的,数据可以被发送?

TCP握手:在哪一点连接被认为是建立的,数据可以被发送?,tcp,Tcp,TCP 3路握手由SYN、SYN-ACK和ACK数据包组成 我的问题是:服务器(即接受连接的服务器)是否可以在发送SYN-ACK之后立即发送数据,或者在接收第一个ACK之前不发送任何内容 换句话说,如果服务器在接受连接后立即在套接字上发送数据,那么客户端需要多少次往返才能开始接收数据。是否只有1次往返(即来自客户端的SYN和来自服务器的SYN-ACK+数据包)?或者至少两次往返?在最终确认之前,服务器无法发送任何内容,因为在此之前,服务器没有可接受的套接字accept()在握手完成之前不会返回。

TCP 3路握手由SYN、SYN-ACK和ACK数据包组成

我的问题是:服务器(即接受连接的服务器)是否可以在发送SYN-ACK之后立即发送数据,或者在接收第一个ACK之前不发送任何内容


换句话说,如果服务器在接受连接后立即在套接字上发送数据,那么客户端需要多少次往返才能开始接收数据。是否只有1次往返(即来自客户端的SYN和来自服务器的SYN-ACK+数据包)?或者至少两次往返?

在最终确认之前,服务器无法发送任何内容,因为在此之前,服务器没有可接受的套接字
accept()
在握手完成之前不会返回。

服务器在最终确认之前无法发送任何内容,因为在此之前它没有接受的套接字
accept()
直到握手完成后才会返回。

接受的答案并不完全正确。它未能解决两个问题

第一种是TCP快速打开。这在RFC 7413中有定义。它专门设计用于允许服务器开始处理在SYN上发送的数据,甚至在SYN ACK中发送响应数据,而不需要三向握手的最终ACK


第二,TCP的RFC793实际上允许SYN上的数据;但是,在连接完成之前,不会处理此数据(fast open除外)。如果连接从未完成,数据显然会丢失。

接受的答案并不完全正确。它未能解决两个问题

第一种是TCP快速打开。这在RFC 7413中有定义。它专门设计用于允许服务器开始处理在SYN上发送的数据,甚至在SYN ACK中发送响应数据,而不需要三向握手的最终ACK


第二,TCP的RFC793实际上允许SYN上的数据;但是,在连接完成之前,不会处理此数据(fast open除外)。如果连接从未完成,数据显然会被丢弃。

当客户端发送第一个syn数据包时,客户端将处于syn_SENT状态,并等待来自服务器的syn/ACK。 服务器将继续侦听套接字。当接收到SYN时,服务器进入SYN_REVD状态。现在,它向客户端发送SYN/ACK,并分配缓冲区和设置变量,如congwin、threshold等。当客户端接收到SYN/ACK时,它将进入已建立状态,并用ACK确认服务器。现在客户端可以发送ack段中的数据,也可以不发送。服务器收到ack后,它将进入已建立状态。 现在,客户端和服务器都处于已建立状态,可以交换数据

当客户端接收到SYN/ACk时,它将在其一侧分配缓冲区和变量,然后向服务器发送ACk


要了解这些状态,请尝试在linux中使用netstat命令,您可以看到套接字的状态。当客户端发送第一个syn数据包时,客户端将处于syn_发送状态,并等待来自服务器的syn/ACK。 服务器将继续侦听套接字。当接收到SYN时,服务器进入SYN_REVD状态。现在,它向客户端发送SYN/ACK,并分配缓冲区和设置变量,如congwin、threshold等。当客户端接收到SYN/ACK时,它将进入已建立状态,并用ACK确认服务器。现在客户端可以发送ack段中的数据,也可以不发送。服务器收到ack后,它将进入已建立状态。 现在,客户端和服务器都处于已建立状态,可以交换数据

当客户端接收到SYN/ACk时,它将在其一侧分配缓冲区和变量,然后向服务器发送ACk


要了解这些状态,请尝试在linux中使用netstat命令,您可以看到套接字的状态

谢谢,在我看来也是这样,但我不确定。你确定吗?如果我不确定,我就不会把它贴出来了。有一件事让我很恼火,那就是被要求确认或重申我已经说过的事情。那么请你指出是什么让你对这件事充满信心?我知道理论上,在发送SYN+ACK后,TCP状态机进入SYN_接收状态。然而,实际上,向应用程序报告已接受的连接并立即发送数据似乎没有问题。这实际上是有道理的,为了尽量减少延迟。你的答案是不完整的。RFC允许SYN上的数据。阅读我的补充答案。谢谢,我也这么认为,但我不确定。你确定吗?如果我不确定,我就不会把它贴出来了。有一件事让我很恼火,那就是被要求确认或重申我已经说过的事情。那么请你指出是什么让你对这件事充满信心?我知道理论上,在发送SYN+ACK后,TCP状态机进入SYN_接收状态。然而,实际上,向应用程序报告已接受的连接并立即发送数据似乎没有问题。这实际上是有道理的,为了尽量减少延迟。你的答案是不完整的。RFC允许SYN上的数据。阅读我的补充答案。谢谢你的完整答案。我的目标是在TCP上设计一个延迟最小的协议。我想T/TCP不适用于我的情况,因为数据实际上并没有传递到服务器。你知道TFO的可用性是什么吗?目前的ios/android平台支持吗?谢谢你的完整回答。我的目标是在TCP上设计一个延迟最小的协议。我想T/TCP不适用于我的情况,因为数据实际上并没有传递到服务器。你知道TFO的可用性是什么吗?当前的ios/android平台是否支持它?