요약

  • TCP 동시 오픈은 양쪽 엔드포인트가 같은 연결을 능동적으로 열고 두 SYN 세그먼트가 양쪽 모두 SYN-SENT 상태에 있을 때 교차하는 현상입니다.
  • 각 엔드포인트는 상대방의 시퀀스 공간을 확인하고(acknowledge), SYN-RECEIVED를 거쳐 ESTABLISHED에 도달합니다. 이 교환은 연결 두 개가 아니라 하나를 만듭니다.
  • RFC 9293은 이 경로의 지원을 요구하며, 구현체가 SYN-RECEIVED가 능동 오픈에서 왔는지 수동 오픈에서 왔는지를 기억하도록 요구합니다.
  • 이 메커니즘은 TCP 연결 설정이 프로토콜 수준에서 대칭적임을 증명하지만, NAT, 방화벽, 소켓 API, 애플리케이션이 패킷의 만남을 허용한다는 보장은 아닙니다.

역할 앞선 핸드셰이크

TCP는 흔히 서로 다른 당사자 간의 대화로 가르쳐집니다. 클라이언트가 SYN을 보내고, 대기 중인 서버가 SYN+ACK으로 응답하며, 클라이언트가 확인하면 연결이 존재합니다. 이 순서는 맞지만, 이러한 레이블은 애플리케이션 관례를 전송 계층 규칙처럼 보이게 만들 수 있습니다.

RFC 793은 3-way 핸드셰이크를 더 일반적으로 연결 동기화라는 틀로 설명했습니다. 한 TCP가 보통 발기하고 다른 하나가 응답한다고 말한 뒤, 이 절차는 두 TCP 엔드포인트가 동시에 발기할 때에도 동작한다고 즉시 덧붙였습니다. 중요한 것은 클라이언트와 서버 역할이 아니라, 어느 쪽도 들어오는 데이터를 새 연결에 속한 것으로 취급하기 전에 서로 확인되어야 하는 두 개의 독립적으로 선택된 시퀀스 공간입니다.

SYN이 교차할 때

피어 A와 피어 B가 같은 소켓 쌍에 대해 능동적 OPEN을 동시에 수행한다고 가정해 봅시다. A는 자신의 초기 시퀀스 번호를 선택해 SYN을 보내고, B도 마찬가지입니다. 어느 쪽의 SYN도 답변을 받기 전에 두 세그먼트가 네트워크에서 교차합니다.

이제 각 피어는 SYN을 포함하되 확인 응답이 없는 세그먼트를 수신한 상태, 즉 SYN-SENT 상태에 있습니다. 아무도 수신 대기하지 않았다는 이유로 세그먼트를 거부하는 대신, 동시 오픈 경로는 이를 동기화의 상대편 절반으로 처리합니다. 각 엔드포인트는 상대의 초기 시퀀스 번호를 기록하고 SYN-RECEIVED로 들어가 SYN+ACK을 보냅니다.

확인 응답이 1만큼 진행되는 이유는 SYN 자체가 TCP의 시퀀스 공간에서 한 자리를 차지하기 때문입니다. A가 B의 유효한 SYN+ACK을 받으면 B가 A의 SYN을 받았음을 알고, B도 A의 SYN+ACK에서 같은 결론에 도달합니다. 양쪽 모두 ESTABLISHED에 진입합니다. 두 능동 오픈은 같은 엔드포인트 쌍으로 식별되는 하나의 양방향 연결로 수렴합니다.

대칭성에도 기억이 필요하다

이 경로는 와이어상으로는 대칭이지만 무상태(stateless)가 아닙니다. 각 엔드포인트는 자신이 선택한 시퀀스 번호, 상대가 알린 시퀀스 번호, 무엇이 확인되었는지, 그리고 어떻게 SYN-RECEIVED에 도달했는지를 기억해야 합니다.

RFC 9293은 이 마지막 사실을 명시적으로 요구합니다. 구현체가 동시 오픈을 지원해야 한다는 요구 사항과 함께, SYN-RECEIVED가 수동 OPEN에서 비롯되었는지 능동 OPEN에서 비롯되었는지를 추적하도록 요구합니다. 이 구분은 나중에 중요해집니다. 재설정(reset)과 오류 처리에서 수동 오픈은 LISTEN으로 돌아갈 수 있지만, 능동 오픈은 사용자에게 실패를 보고해야 합니다. 따라서 동일한 가시 상태가 그 기원에 따라 다른 복구 의미를 지닙니다.

이는 미묘한 공학적 포인트입니다. 프로토콜 대칭성이 모든 로컬 이력이 호환 가능하다는 뜻은 아닙니다. 양쪽 엔드포인트가 동일한 상태 머신을 실행하면서도 올바른 다음 전이를 선택하기에 충분한 로컬 이력을 유지할 수 있다는 뜻입니다.

노크처럼 보이는 중복 세그먼트

RFC 793은 오래된 중복 SYN이 동시 초기화가 진행 중인 것처럼 보이게 만들 수 있다고 경고했습니다. 이 가능성이 핸드셰이크가 단순히 처음 보는 동기화 세그먼트를 수용하는 대신 세 단계를 거치는 이유 중 하나입니다.

엔드포인트는 SYN이 도착했는지뿐 아니라 확인 응답과 시퀀스 번호가 일관된 현재 교환을 기술하는지도 판단해야 합니다. 재설정 처리는 한쪽에 일치하는 상태가 없을 때 겉보기 연결을 거부하는 방법을 제공합니다. 따라서 동시 오픈 기능은 TCP의 연결 세대를 혼동하지 않기 위한 더 넓은 방어 체계 안에 자리하며, 그 방어를 우회하는 지름길이 아닙니다.

표준이 약속하지 않는 것

전송 계층에서 어느 쪽 엔드포인트도 영구적인 수신자일 필요는 없습니다. 그러나 배포 계층에서는 여전히 많은 조건이 남아 있습니다. 패킷에는 경로가 필요하고, 방화벽에는 이 교환을 허용하는 규칙이 필요하며, 주소 변환기에는 호환되는 매핑이 필요할 수 있습니다. 소켓 API와 애플리케이션은 양쪽에서 능동 오픈 동작을 노출하거나 실행해야 합니다.

두 표준은 현재 사용량에 대한 측정값이나 미들박스 통과에 대한 보장을 제공하지 않습니다. 따라서 동시 오픈은 임의의 피어가 어떤 네트워크 경계든 뚫을 수 있다는 증거가 아닙니다. 더 정확하고 좁은 주장입니다. 즉, 짝이 맞는 SYN이 올바른 상태에 있는 두 TCP 엔드포인트에 도달하면, 표준화된 상태 머신이 그들을 동기화하는 방법을 알고 있다는 것입니다.

출처