Linux의 TCP 수락 대기열이 선입선출인지, 후입선출인지, 아니면 다른 유형의 대기열인지 알고 싶습니다.
다른 각도에서 동일한 질문을 해보세요. accept()
연결이 호스트에 도착하는 순서와 동일한 순서로 생성됩니까?
답변1
인용하다 man 2 accept
:
보류 중인 연결 대기열에서 첫 번째 연결 요청을 가져옵니다.
따라서 선입선출 원칙이 적용됩니다."큐"는 실제로 이렇게 말합니다.;이 용어는 항상 FIFO 데이터 구조를 나타냅니다(우체국의 대기열과 같이 서비스를 받으려면 먼저 거기에 있어야 합니다).
연결이 호스트에 도착하는 순서와 동일합니까?
연결이 "도착"되지 않았습니다! 이것이 바로 이 진술의 문제이자 모호성의 근원이다.
단순화된 내용을 살펴보자TCP 상태 머신 보기:
작성자: 스킬 100,원천, CC-BY-SA 3.0
이제 대기열에서 누가 "첫 번째"가 되어야 하는지 직관적으로 명확하지 않습니다. 즉, SYN을 받는 첫 번째 사람이 될 것입니다. SYN-ACK를 보낼 수 있는 첫 번째 대상은 무엇입니까? 아니면 가장 먼저 확인을 받은 사람인가요?
그러나 생각해 보십시오. accept
커널이 소켓이 무언가를 반환할 준비가 되었음을 아는 순간은 그것을 수신하는 순간입니다 ACK
. 이것이 수락 대기열에 삽입되는 순서입니다.
그러나 이것은 매우 무작위적이라는 점에 유의하십시오. 양쪽 끝이 SYN, SYN-ACK 패킷에 얼마나 빨리 반응하는지, 그리고 이러한 패킷을 전송하는 데 걸리는 시간에 따라 달라집니다.
일반적으로 승인 대기열의 첫 번째 항목이 연결을 시작한 첫 번째 클라이언트라고 가정할 수 없습니다.이는 과거에 많은 네트워크 프로토콜 설계자들에게 문제가 되었으며 릴레이 메시지에 연결하기 위해 여러 당사자가 필요한 상황에서 피하는 것이 가장 중요합니다(실제로 나중에 연결된 노드에 대해 메시지를 저장해야 하는지 여부를 알 수 있는 방법이 없습니다. 논리가 있어야 함)늦게 합류하는 사람질문).
이 답변유서 깊은 고전이며 아마도 당신이 알고 싶은 것보다 더 많은 내부를 가지고 있을 것입니다.