什么控制是否将TCP段传递给socket传递给accept()或者accept()返回的socket?

时间:2015-04-29 02:06:41

标签: http networking tcp network-programming

在TCP套接字代码中,我们创建了2个套接字。第一个接受新连接,第二个接受来自客户端的数据,并在建立新连接时创建。

TCP标头中的哪个控制位允许服务器知道是将这个段传递给ServerSocket(发送连接请求的那个)还是Socket(建立连接后为通信创建的套接字)? / p>

2 个答案:

答案 0 :(得分:2)

  

TCP标头中的哪个控制位允许服务器知道是将这个段传递给ServerSocket(发送连接请求的那个)还是Socket(建立连接后为通信创建的套接字)? / p>

除了SYN之外,没有这样的控制位。如果TCP数据包到达并且与该4元组 {源IP,源端口,目标IP,目标端口} 建立了TCP连接,则将其传递到该连接的本地套接字。如果不是,则可能是对SYN-ACK的ACK,如果有一个未完成的序列号,则导致半成形连接被放置在监听积压队列上。否则它是一个错误并导致发出RST。

答案 1 :(得分:0)

以非常简化的方式:

来自TCP客户端的连接请求消息被标识为SYN数据包。这有SYN位设置。在此类数据包上,控件将由listen上的acceptlisten_sd电话接管;该过程以新套接字结束 - conn_sd

conn_sd由本地IP标识:端口和远程IP:端口(仅listen_sd本地IP:端口)

没有设置SYN位的其他数据包(数据消息或控制信令消息,如ACK(将设置确认位))将发往conn_sd

编辑:@EJP在评论中指出,来自服务器的SYN数据包的ACK已传递到listen_fd

进一步阅读:

How does the socket API accept() function work?