TCP 연결 설정
우리는 웹을 검색하거나 이메일을 보내거나 온라인 게임을 할 때 그 뒤에 숨어 있는 복잡한 네트워크 연결에 대해 생각하지 않는 경우가 많습니다. 그러나 이러한 작은 단계들이 당사와 서버 사이의 안정적인 통신을 보장합니다. 가장 중요한 단계 중 하나는 TCP 연결 설정이며, 그 핵심은 3방향 핸드셰이크입니다.
이 기사에서는 3방향 핸드셰이크의 원리, 프로세스 및 중요성에 대해 자세히 설명합니다. 3방향 핸드셰이크가 필요한 이유, 연결 안정성과 신뢰성을 보장하는 방법, 데이터 전송에 있어 이것이 얼마나 중요한지 단계별로 설명하겠습니다. 3방향 핸드셰이크에 대한 더 깊은 이해를 통해 네트워크 통신의 기본 메커니즘을 더 잘 이해하고 TCP 연결의 신뢰성에 대한 더 명확한 시각을 얻을 수 있습니다.
TCP 3방향 핸드셰이크 프로세스 및 상태 전환
TCP는 연결 지향 전송 프로토콜로, 데이터 전송 전에 연결 설정이 필요합니다. 이 연결 설정 프로세스는 3방향 핸드셰이크를 통해 수행됩니다.
각 연결에서 전송되는 TCP 패킷을 자세히 살펴보겠습니다.
처음에는 클라이언트와 서버가 모두 닫혀 있습니다. 첫째, 서버는 포트에서 적극적으로 수신 대기하며 LISTEN 상태에 있습니다. 이는 서버를 시작해야 함을 의미합니다. 다음으로 클라이언트는 웹페이지에 액세스할 준비가 되었습니다. 서버와의 연결을 설정해야 합니다. 첫 번째 연결 패킷의 형식은 다음과 같습니다.
클라이언트가 연결을 시작하면 임의의 초기 시퀀스 번호(client_isn)가 생성되어 TCP 헤더의 "시퀀스 번호" 필드에 배치됩니다. 동시에 클라이언트는 나가는 패킷이 SYN 패킷임을 나타내기 위해 SYN 플래그 위치를 1로 설정합니다. 클라이언트는 첫 번째 SYN 패킷을 서버에 보냄으로써 서버와의 연결을 설정하고자 함을 나타냅니다. 이 패킷에는 애플리케이션 계층 데이터(즉, 전송된 데이터)가 포함되어 있지 않습니다. 이 시점에서 클라이언트 상태는 SYN-SENT로 표시됩니다.
서버가 클라이언트로부터 SYN 패킷을 받으면 자체 일련 번호(server_isn)를 무작위로 초기화한 다음 해당 번호를 TCP 헤더의 "일련 번호" 필드에 넣습니다. 다음으로, 서버는 "승인 번호" 필드에 client_isn + 1을 입력하고 SYN 및 ACK 비트를 모두 1로 설정합니다. 마지막으로 서버는 응용 프로그램 계층 데이터(및 서버에 대한 데이터)가 포함되지 않은 패킷을 클라이언트에 보냅니다. 보내기 위해). 이때 서버는 SYN-RCVD 상태입니다.
클라이언트가 서버로부터 패킷을 수신하면 최종 응답 패킷에 응답하기 위해 다음 최적화를 수행해야 합니다. 먼저 클라이언트는 응답 패킷의 TCP 헤더에 있는 ACK 비트를 1로 설정합니다. 둘째, 클라이언트는 "응답 번호 확인" 필드에 server_isn + 1 값을 입력합니다. 마지막으로 클라이언트는 패킷을 서버로 보냅니다. 이 패킷은 클라이언트에서 서버로 데이터를 전달할 수 있습니다. 이러한 작업이 완료되면 클라이언트는 ESTABLISHED 상태로 들어갑니다.
서버가 클라이언트로부터 응답 패킷을 수신하면 ESTABLISHED 상태로 전환됩니다.
위의 과정에서 볼 수 있듯이, 3방향 핸드셰이크를 수행할 때 세 번째 핸드셰이크에서는 데이터 전달이 허용되지만 처음 두 핸드셰이크에서는 데이터 전달이 허용되지 않습니다. 면접에서 자주 묻는 질문입니다. 3방향 핸드셰이크가 완료되면 양 당사자는 연결이 성공적으로 설정되었음을 나타내는 ESTABLISHED 상태가 되며, 이 시점에서 클라이언트와 서버는 서로 데이터를 보내기 시작할 수 있습니다.
왜 세 번의 악수를 해야 할까요? 두번도 아니고 네번?
일반적인 대답은 "3방향 핸드셰이크가 수신 및 송신 기능을 보장하기 때문입니다."입니다. 이 답변은 정확하지만 표면적인 이유일 뿐 주된 이유를 제시하지는 않습니다. 다음에서는 이 문제에 대한 이해를 심화하기 위해 트리플 핸드셰이크가 발생한 이유를 세 가지 측면에서 분석해 보겠습니다.
3방향 핸드셰이크는 역사적으로 반복되는 연결의 초기화를 효과적으로 피할 수 있습니다(주요 이유).
3방향 핸드셰이크는 양 당사자가 신뢰할 수 있는 초기 시퀀스 번호를 수신했음을 보장합니다.
3방향 핸드셰이크는 리소스 낭비를 방지합니다.
이유 1: 기록 중복 조인 방지
간단히 말해서, 3방향 핸드셰이크를 하는 주된 이유는 오래된 중복 연결 초기화로 인한 혼란을 피하기 위해서입니다. 복잡한 네트워크 환경에서는 데이터 패킷의 전송이 지정된 시간에 맞춰 항상 목적지 호스트로 전송되지 않으며, 네트워크 혼잡 등의 이유로 오래된 데이터 패킷이 목적지 호스트에 먼저 도착할 수 있습니다. 이를 방지하기 위해 TCP는 3방향 핸드셰이크를 사용하여 연결을 설정합니다.
네트워크 정체와 같은 상황에서 클라이언트가 여러 SYN 연결 설정 패킷을 연속적으로 보내는 경우 다음이 발생할 수 있습니다.
1- 이전 SYN 패킷은 최신 SYN 패킷보다 먼저 서버에 도착합니다.
2- 서버는 이전 SYN 패킷을 수신한 후 클라이언트에 SYN + ACK 패킷을 응답합니다.
3- 클라이언트가 SYN + ACK 패킷을 수신하면 자체 컨텍스트에 따라 연결이 기록 연결(시퀀스 번호 만료 또는 시간 초과)인지 확인한 다음 RST 패킷을 서버로 보내 연결을 중단합니다.
두 핸드셰이크 연결을 사용하면 현재 연결이 기록 연결인지 확인할 수 있는 방법이 없습니다. 3방향 핸드셰이크를 사용하면 클라이언트는 세 번째 패킷을 보낼 준비가 되었을 때 컨텍스트를 기반으로 현재 연결이 기록 연결인지 여부를 확인할 수 있습니다.
1- 기록 연결(시퀀스 번호 만료 또는 시간 초과)인 경우 세 번째 핸드셰이크에서 보낸 패킷은 기록 연결을 중단하기 위한 RST 패킷입니다.
2- 과거 연결이 아닌 경우 세 번째로 전송된 패킷은 ACK 패킷이며 두 통신 당사자가 성공적으로 연결을 설정합니다.
따라서 TCP가 3방향 핸드셰이크를 사용하는 주된 이유는 기록 연결을 방지하기 위해 연결을 초기화하기 때문입니다.
이유 2: 양 당사자의 초기 시퀀스 번호를 동기화하기 위해
TCP 프로토콜의 양쪽에서는 안정적인 전송을 보장하는 핵심 요소인 시퀀스 번호를 유지해야 합니다. 시퀀스 번호는 TCP 연결에서 중요한 역할을 합니다. 시퀀스 번호는 다음을 수행합니다.
수신기는 중복 데이터를 제거하고 데이터의 정확성을 보장할 수 있습니다.
수신자는 데이터의 무결성을 보장하기 위해 시퀀스 번호 순서대로 패킷을 수신할 수 있습니다.
● 시퀀스 번호를 통해 상대방이 수신한 데이터 패킷을 식별할 수 있어 안정적인 데이터 전송이 가능합니다.
따라서 TCP 연결이 설정되면 클라이언트는 초기 시퀀스 번호와 함께 SYN 패킷을 보내고 서버는 클라이언트의 SYN 패킷이 성공적으로 수신되었음을 나타내는 ACK 패킷으로 응답하도록 요구합니다. 그런 다음 서버는 초기 시퀀스 번호가 포함된 SYN 패킷을 클라이언트에 보내고 클라이언트가 응답할 때까지 기다립니다. 이를 통해 초기 시퀀스 번호가 안정적으로 동기화되었는지 확인합니다.
양 당사자의 초기 시퀀스 번호를 안정적으로 동기화하기 위해 4방향 핸드셰이크도 가능하지만 두 번째와 세 번째 단계를 단일 단계로 결합하여 3방향 핸드셰이크가 가능합니다. 그러나 두 번의 핸드쉐이크는 한쪽 당사자의 초기 시퀀스 번호를 상대방이 성공적으로 수신했다는 것만 보장할 수 있을 뿐, 양쪽 당사자의 초기 시퀀스 번호를 확인할 수 있다는 보장은 없습니다. 따라서 TCP 연결의 안정성과 신뢰성을 보장하기 위해서는 3방향 핸드셰이크가 최선의 선택입니다.
이유 3: 자원 낭비 방지
"two-handshake"만 있는 경우 클라이언트 SYN 요청이 네트워크에서 차단되면 클라이언트는 서버에서 보낸 ACK 패킷을 수신할 수 없으므로 SYN이 다시 전송됩니다. 그러나 세 번째 핸드셰이크가 없기 때문에 서버는 클라이언트가 연결 설정을 위한 ACK 승인을 받았는지 확인할 수 없습니다. 따라서 서버는 각 SYN 요청을 받은 후에만 사전에 연결을 설정할 수 있습니다. 이로 인해 다음이 발생합니다.
리소스 낭비: 클라이언트의 SYN 요청이 차단되어 여러 SYN 패킷이 반복적으로 전송되는 경우 서버는 요청을 받은 후 여러 개의 중복된 잘못된 연결을 설정합니다. 이로 인해 서버 리소스가 불필요하게 낭비됩니다.
메시지 보존: 세 번째 핸드셰이크가 없기 때문에 서버는 클라이언트가 연결을 설정하기 위한 ACK 승인을 올바르게 수신했는지 여부를 알 수 없습니다. 결과적으로 메시지가 네트워크에 정체되면 클라이언트는 계속해서 SYN 요청을 보내게 되고, 이로 인해 서버는 지속적으로 새로운 연결을 설정하게 됩니다. 이로 인해 네트워크 정체 및 지연이 증가하고 전체 네트워크 성능에 부정적인 영향을 미칩니다.
따라서 네트워크 연결의 안정성과 신뢰성을 보장하기 위해 TCP는 이러한 문제의 발생을 피하기 위해 3방향 핸드셰이크를 사용하여 연결을 설정합니다.
요약
그만큼네트워크 패킷 브로커TCP 연결 설정은 3방향 핸드셰이크를 통해 이루어집니다. 3방향 핸드셰이크 중에 클라이언트는 먼저 SYN 플래그가 포함된 패킷을 서버에 보내 연결을 설정하려고 함을 나타냅니다. 클라이언트로부터 요청을 받은 후 서버는 연결 요청이 수락되었음을 나타내는 SYN 및 ACK 플래그가 포함된 패킷을 클라이언트에 응답하고 자체 초기 시퀀스 번호를 보냅니다. 마지막으로 클라이언트는 연결이 성공적으로 설정되었음을 나타내는 ACK 플래그로 서버에 응답합니다. 따라서 두 당사자는 ESTABLISHED 상태에 있으며 서로에게 데이터 전송을 시작할 수 있습니다.
일반적으로 TCP 연결 설정을 위한 3방향 핸드셰이크 프로세스는 연결 안정성과 신뢰성을 보장하고, 기록 연결에 대한 혼란과 리소스 낭비를 방지하며, 양 당사자가 데이터를 주고받을 수 있도록 설계되었습니다.
게시 시간: 2025년 1월 8일