每一个socket在执行listen时候,内核都会自动创建一个半连接队列,和全连接队列

Untitled

半连接(SYN队列)

服务端收到第一次🤝后,会将这个sock加入到这个队列中,队列内的sock都处于SYN_RECV的状态。

本质上是一个队列,但队列里都是不完整的连接,等待着第三次握手的到来,需要依次遍历找到IP和端口对应的连接。整个过程算法复杂度是O(n)

全连接(ACCEPT队列)

服务端收到第三次🤝后,会将半连接队列的sock取出,放到全连接队列中。队列的sock都处于ESTABLISHED状态。这里面的连接,等着服务端执行accept()后取出。

本质上是一个链表,里面存放了已经建立完成的链接,服务端不用关心具体是哪个连接,所以整个过程算法复杂度为O(1)

三次握手细节

Untitled

Summary

<aside> 📌 第三次握手前,TCP连接会被放置在半连接队列中,直到第三次🤝到来,才会被放置全连接队列。

</aside>

<aside> 📌

accept方法只是为了全连接队列中获取一条连接,与三次🤝没有关系。

</aside>

🔗 Ref

动图图解!没有accept,能建立TCP连接吗?