首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么服务器不能在TCP三次握手中发送数据?

为什么服务器不能在TCP三次握手中发送数据?
EN

Network Engineering用户
提问于 2019-06-01 23:59:01
回答 1查看 1.3K关注 0票数 2

在三通握手中,只有从ACK包我们才能发送数据.为什么服务器不能用SYN数据包发送数据?我低估了为什么客户端不能向服务器发送数据(例如,防止恶意客户端的SYN泛滥),但是为什么服务器不能发送数据,例如服务器的认证?

据我所知,这对客户端和服务器都不会有问题。

从客户端的角度来看,在三种方式的握手中,服务器已经知道服务器正在使用SYN数据包,并且它可以没有问题地创建它的连接(这已经发生在三方握手中)。

从服务器视图来看,我们不需要在其内核空间上创建接收缓冲区。如果第二个数据对于所有套接字(例如,认证和服务器的公钥)是常数的话,发送缓冲区也可以有效地减少。

EN

回答 1

Network Engineering用户

回答已采纳

发布于 2019-06-02 05:24:31

理论上,数据可以与SYN一起发送,但在建立连接状态之前不应该将数据传递给应用程序。引用RFC 793第3.4节-“建立连接”的话:

下面是连接启动的几个例子。尽管这些示例不显示使用数据承载段的连接同步,但这是完全合法的,只要接收TCP不向用户传递数据,直到数据清楚无误(即,数据必须在接收方缓冲,直到连接达到既定状态为止)。

这意味着理论上客户端和服务器都可以在SYN中发送数据。但是,客户端数据只应在接收到最终ACK并在服务器端达到建立之后才能传递给服务器应用程序。由于客户端状态是在接收到SYN+ACK后建立的,因此可以立即将来自SYN+ACK内服务器的数据传递给客户端,从从RFC获取的示例中可以看到:

代码语言:javascript
复制
      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在服务器端进行握手,两者都不能接受要在握手中传递的任何数据。

票数 6
EN
页面原文内容由Network Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://networkengineering.stackexchange.com/questions/59546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档