没有listen,能建立TCP连接吗?

答案是:可以。

客户端是可以自己连自己的形成连接(TCP自连接),也可以两个客户端同时向对方发出请求建立连接(TCP同时打开),这两个情况都有个共同点,就是没有服务端参与,也就是没有listen,就能建立连接。

那没有listen,为什么还能建立连接?

我们知道执行listen方法时,会创建半连接队列和全连接队列。

三次握手的过程中会在这两个队列中暂存连接信息。

所以形成连接,前提是你得有个地方存放着,方便握手的时候能根据IP端口等信息找到socket信息。

那么客户端会有半连接队列吗?

显然没有,因为客户端没有执行listen,因为半连接队列和全连接队列都是在执行listen方法时,内核自动创建的。

但内核还有个全局hash表,可以用于存放sock连接的信息。这个全局hash表其实还细分为ehash,bhash和listen_hash等,但因为过于细节,大家理解成有一个全局hash就够了,

在TCP自连接的情况中,客户端在connect方法时,最后会将自己的连接信息放入到这个全局hash表中,然后将信息发出,消息在经过回环地址重新回到TCP传输层的时候,就会根据IP端口信息,再一次从这个全局hash中取出信息。于是握手包一来一回,最后成功建立连接。

TCP同时打开的情况也类似,只不过从一个客户端变成了两个客户端而已。

Guess you like

Origin blog.csdn.net/ThinPikachu/article/details/120615671