Language agnostic connect()与TCP的行为
我在客户端上调用connect()。客户端进入SYN_发送状态并发送SYN。现在它得到一个没有ACK的SYN,因此客户端进入SYN_RCVD状态 connect()是否在此点返回?从技术上讲,您有足够的信息可以在套接字上调用send()和recv()。RFC本身表示,如果您在SYN_RCVD状态的套接字上调用SEND,则:Language agnostic connect()与TCP的行为,language-agnostic,networking,tcp,network-protocols,Language Agnostic,Networking,Tcp,Network Protocols,我在客户端上调用connect()。客户端进入SYN_发送状态并发送SYN。现在它得到一个没有ACK的SYN,因此客户端进入SYN_RCVD状态 connect()是否在此点返回?从技术上讲,您有足够的信息可以在套接字上调用send()和recv()。RFC本身表示,如果您在SYN_RCVD状态的套接字上调用SEND,则: SYN-RECEIVED STATE Queue the data for transmission after entering ESTABLISHED state.
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()本身是否会被阻止,直到连接完全建立?作为参考点,在中执行
connect()
将被阻止,直到连接完全建立(如果connect()
呼叫设置为阻塞)。在同时连接的情况下,客户端将只接收不带ACK的SYN。更常见的事件序列,使用普通的阻塞套接字:
- 客户端应用程序调用
,客户端发送connect()
并进入状态SYN
SYN-SENT
- 客户端从服务器接收
;客户端发送SYN+ACK
并进入状态ACK
;应用程序对已建立
的调用返回connect()