1

我在客户端调用 connect()。客户端进入 SYN_SENT 状态并发送一个 SYN。现在它得到一个没有 ACK 的 SYN,所以客户端进入 SYN_RCVD 状态。

此时 connect() 是否返回?从技术上讲,您有足够的信息可以在套接字上调用 send() 和 recv()。RFC 本身说,如果您在 SYN_RCVD 状态的套接字上调用 SEND,则:

SYN-RECEIVED STATE

  Queue the data for transmission after entering ESTABLISHED state.

而且,如果您致电 RECEIVE:

LISTEN STATE
SYN-SENT STATE
SYN-RECEIVED STATE

  Queue for processing after entering ESTABLISHED state.  If there
  is no room to queue this request, respond with "error:
  insufficient resources".

所以我的问题是:connect() 在获得 SYN 后是否返回,然后对 recv() 的调用会阻塞,还是 connect() 本身会阻塞,直到连接完全建立?

4

2 回答 2

3

作为参考, Wright 和 Stevensconnect()TCP/IP Illustrated, Volume 2中的实现将阻塞,直到连接完全建立(如果connect()调用设置为阻塞)。

于 2009-04-06T07:27:31.597 回答
0

在同时连接的情况下,客户端只会收到没有 ACK 的 SYN。更常见的事件序列,具有正常的阻塞套接字:

  • 客户端应用程序调用connect(),客户端发送SYN并进入状态SYN-SENT
  • 客户端SYN+ACK从服务器接收;客户端发送ACK并进入状态ESTABLISHED;应用程序的调用connect()返回。
于 2009-04-06T07:41:04.530 回答