每一个socket
在执行listen
时候,内核都会自动创建一个半连接队列,和全连接队列。
服务端收到第一次🤝后,会将这个sock
加入到这个队列中,队列内的sock
都处于SYN_RECV
的状态。
本质上是一个队列,但队列里都是不完整的连接,等待着第三次握手的到来,需要依次遍历找到IP和端口对应的连接。整个过程算法复杂度是O(n)
。
服务端收到第三次🤝后,会将半连接队列的sock
取出,放到全连接队列中。队列的sock
都处于ESTABLISHED
状态。这里面的连接,等着服务端执行accept()
后取出。
本质上是一个链表,里面存放了已经建立完成的链接,服务端不用关心具体是哪个连接,所以整个过程算法复杂度为O(1)
。
<aside> 📌 第三次握手前,TCP连接会被放置在半连接队列中,直到第三次🤝到来,才会被放置全连接队列。
</aside>
<aside> 📌
accept方法只是为了全连接队列中获取一条连接,与三次🤝没有关系。
</aside>