在三通握手中,只有从ACK包我们才能发送数据.为什么服务器不能用SYN数据包发送数据?我低估了为什么客户端不能向服务器发送数据(例如,防止恶意客户端的SYN泛滥),但是为什么服务器不能发送数据,例如服务器的认证?
据我所知,这对客户端和服务器都不会有问题。
从客户端的角度来看,在三种方式的握手中,服务器已经知道服务器正在使用SYN数据包,并且它可以没有问题地创建它的连接(这已经发生在三方握手中)。
从服务器视图来看,我们不需要在其内核空间上创建接收缓冲区。如果第二个数据对于所有套接字(例如,认证和服务器的公钥)是常数的话,发送缓冲区也可以有效地减少。
发布于 2019-06-02 05:24:31
理论上,数据可以与SYN一起发送,但在建立连接状态之前不应该将数据传递给应用程序。引用RFC 793第3.4节-“建立连接”的话:
下面是连接启动的几个例子。尽管这些示例不显示使用数据承载段的连接同步,但这是完全合法的,只要接收TCP不向用户传递数据,直到数据清楚无误(即,数据必须在接收方缓冲,直到连接达到既定状态为止)。
这意味着理论上客户端和服务器都可以在SYN中发送数据。但是,客户端数据只应在接收到最终ACK并在服务器端达到建立之后才能传递给服务器应用程序。由于客户端状态是在接收到SYN+ACK后建立的,因此可以立即将来自SYN+ACK内服务器的数据传递给客户端,从从RFC获取的示例中可以看到:
TCP A TCP B
1. CLOSED LISTEN
2. SYN-SENT --> <SEQ=100><CTL=SYN> --> SYN-RECEIVED
3. ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED
4. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK> --> ESTABLISHED
5. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK><DATA> --> ESTABLISHED使用TCP,在某些情况下甚至可以消除客户端的限制。
但是通常TCP握手中不包含数据,因为默认的套接字API不支持这种用例:只有一个connect在客户端进行握手,而一个accept在服务器端进行握手,两者都不能接受要在握手中传递的任何数据。
https://networkengineering.stackexchange.com/questions/59546
复制相似问题