Linux의 TCP 승인 대기열(FIFO/LIFO/기타)은 어떤 유형의 대기열입니까?

Linux의 TCP 승인 대기열(FIFO/LIFO/기타)은 어떤 유형의 대기열입니까?

Linux의 TCP 수락 대기열이 선입선출인지, 후입선출인지, 아니면 다른 유형의 대기열인지 알고 싶습니다.

다른 각도에서 동일한 질문을 해보세요. accept()연결이 호스트에 도착하는 순서와 동일한 순서로 생성됩니까?

답변1

인용하다 man 2 accept:

보류 중인 연결 대기열에서 첫 번째 연결 요청을 가져옵니다.

따라서 선입선출 원칙이 적용됩니다."큐"는 실제로 이렇게 말합니다.;이 용어는 항상 FIFO 데이터 구조를 나타냅니다(우체국의 대기열과 같이 서비스를 받으려면 먼저 거기에 있어야 합니다).

연결이 호스트에 도착하는 순서와 동일합니까?

연결이 "도착"되지 않았습니다! 이것이 바로 이 진술의 문제이자 모호성의 근원이다.

단순화된 내용을 살펴보자TCP 상태 머신 보기:

단순화된 TCP 상태 머신
작성자: 스킬 100,원천, CC-BY-SA 3.0

이제 대기열에서 누가 "첫 번째"가 되어야 하는지 직관적으로 명확하지 않습니다. 즉, SYN을 받는 첫 번째 사람이 될 것입니다. SYN-ACK를 보낼 수 있는 첫 번째 대상은 무엇입니까? 아니면 가장 먼저 확인을 받은 사람인가요?

그러나 생각해 보십시오. accept커널이 소켓이 무언가를 반환할 준비가 되었음을 아는 순간은 그것을 수신하는 순간입니다 ACK. 이것이 수락 대기열에 삽입되는 순서입니다.

그러나 이것은 매우 무작위적이라는 점에 유의하십시오. 양쪽 끝이 SYN, SYN-ACK 패킷에 얼마나 빨리 반응하는지, 그리고 이러한 패킷을 전송하는 데 걸리는 시간에 따라 달라집니다.

일반적으로 승인 대기열의 첫 번째 항목이 연결을 시작한 첫 번째 클라이언트라고 가정할 수 없습니다.이는 과거에 많은 네트워크 프로토콜 설계자들에게 문제가 되었으며 릴레이 메시지에 연결하기 위해 여러 당사자가 필요한 상황에서 피하는 것이 가장 중요합니다(실제로 나중에 연결된 노드에 대해 메시지를 저장해야 하는지 여부를 알 수 있는 방법이 없습니다. 논리가 있어야 함)늦게 합류하는 사람질문).


이 답변유서 깊은 고전이며 아마도 당신이 알고 싶은 것보다 더 많은 내부를 가지고 있을 것입니다.

관련 정보