TCP
1. 개요
1. 개요
TCP(Transmission Control Protocol)는 인터넷 프로토콜 스위트(TCP/IP)의 핵심 프로토콜 중 하나로, IP(Internet Protocol)와 함께 동작하여 네트워크를 통해 데이터를 신뢰성 있게 전송하는 역할을 담당합니다. IP가 패킷의 주소 지정과 라우팅을 처리하는 비연결형 프로토콜이라면, TCP는 그 위에서 연결 지향성과 신뢰성 있는 데이터 전송 서비스를 제공합니다. 이는 웹 브라우징, 이메일, 파일 전송 등 대부분의 인터넷 응용 프로그램이 데이터 손실 없이 정확한 순서로 정보를 교환할 수 있게 하는 기반이 됩니다.
TCP의 주요 기능은 크게 세 가지로 요약할 수 있습니다. 첫째, 3-way 핸드셰이크를 통한 연결 설정과 4-way 핸드셰이크를 통한 연결 종료로, 통신 시작 전에 논리적인 연결 경로를 수립합니다. 둘째, 흐름 제어를 통해 수신자의 처리 능력을 고려하여 데이터 전송 속도를 조절하며, 패킷 손실 시 재전송 메커니즘을 통해 데이터의 완전한 전달을 보장합니다. 셋째, 혼잡 제어를 통해 네트워크의 혼잡 상태를 감지하고 전송 속도를 동적으로 조정하여 네트워크 전체의 안정성을 유지합니다.
이 프로토콜은 전송 계층에서 동작하며, 상위 계층의 응용 프로그램(예: HTTP, FTP, SMTP)으로부터 데이터 스트림을 받아 세그먼트라는 단위로 나눈 후, 각 세그먼트에 TCP 헤더를 추가하여 하위 계층인 IP에 전달합니다. TCP 헤더에는 송수신 포트 번호, 시퀀스 번호, 확인 응답 번호, 체크섬 등 연결 상태와 데이터 무결성을 관리하는 데 필요한 다양한 제어 정보가 포함되어 있습니다.
따라서 TCP는 단순한 데이터 전달을 넘어, 오류 제어, 순서 보장, 혼잡 관리 등의 복잡한 제어 기능을 통합한 종단 간 신뢰성 프로토콜로 정의될 수 있습니다. 이는 불안정한 네트워크 환경에서도 안정적인 통신 채널을 구축할 수 있게 하여 현대 인터넷의 근간을 이루는 역할을 하고 있습니다.
2. 역사와 배경
2. 역사와 배경
TCP(Transmission Control Protocol)는 인터넷 프로토콜 스위트의 핵심 프로토콜 중 하나로, IP(Internet Protocol)와 함께 TCP/IP 모델의 근간을 이룹니다. 이 프로토콜의 개발은 1970년대 초반 미국 국방부의 연구 기관인 DARPA(Defense Advanced Research Projects Agency)의 지원 아래 진행된 ARPANET 프로젝트에서 시작되었습니다. 당시의 네트워크는 데이터그램 패킷 교환 방식을 사용했으나, 신뢰적인 데이터 전송을 보장하는 메커니즘이 부족했습니다. 이러한 필요성에 따라 빈트 서프와 밥 칸은 1974년 논문 "A Protocol for Packet Network Intercommunication"에서 처음으로 TCP의 개념을 제안하였습니다[1].
초기 설계에서는 TCP가 IP의 기능을 모두 포함하는 단일 프로토콜이었습니다. 그러나 1970년대 후반, 존 포스텔과 데이비드 클락 등을 중심으로 한 연구자들은 프로토콜의 기능을 분리하는 것이 더 효율적임을 발견했습니다. 이에 따라 신뢰적인 연결 지향 전송을 담당하는 TCP와 비연결형 패킷 전달을 담당하는 IP로 계층이 분리되었습니다. 이 구조적 분리는 1981년 9월 RFC 793 "Transmission Control Protocol" 문서로 표준화되면서 확정되었습니다. 이 문서는 TCP의 기본 명세를 정의하며, 오늘날까지도 그 근간을 이루고 있습니다.
연도 | 주요 사건 | 관련 인물/문서 |
|---|---|---|
1974 | TCP 개념 최초 제안 | |
1970년대 후반 | TCP와 IP의 기능적 분리 | |
1981 | RFC 793으로 표준화 | IETF(Internet Engineering Task Force) |
TCP/IP 스위트는 1983년 1월 1일, ARPANET이 NCP(Network Control Protocol)에서 TCP/IP로 공식적으로 전환한 "플래그 데이"(Flag Day)를 기점으로 본격적으로 채택되기 시작했습니다. 이 전환은 현대 인터넷의 탄생을 알리는 결정적 사건이었습니다. 이후 TCP는 월드 와이드 웹(WWW), 이메일, 파일 전송 등 수많은 응용 서비스의 기반이 되었으며, 지속적인 연구와 RFC(Request for Comments)를 통한 확장을 거쳐 현재의 형태로 진화해 왔습니다.
3. 핵심 원리와 특징
3. 핵심 원리와 특징
TCP는 인터넷 프로토콜 스위트의 핵심 프로토콜 중 하나로, IP가 제공하는 비연결형 패킷 전송 서비스 위에 신뢰성 있는 연결 지향형 통신 서비스를 구축합니다. 이는 데이터가 순서대로, 오류 없이 목적지에 전달되도록 보장하는 것을 목표로 합니다. TCP의 핵심 원리는 크게 연결 지향성, 신뢰성 있는 데이터 전송, 흐름 제어, 그리고 혼잡 제어로 요약할 수 있습니다.
TCP는 통신을 시작하기 전에 3-way 핸드셰이크 과정을 통해 양단 간의 논리적 연결을 수립합니다. 이 연결을 기반으로 데이터는 세그먼트라는 단위로 나누어 전송됩니다. 각 세그먼트에는 시퀀스 번호와 확인 응답 번호가 포함되어 있어, 데이터의 순서와 누락을 파악할 수 있습니다. 수신 측은 성공적으로 받은 데이터의 시퀀스 번호에 대한 ACK 패킷을 송신 측에 보냅니다. 송신 측은 ACK를 받지 못한 데이터에 대해 타이머가 만료되면 재전송함으로써 전송 신뢰성을 확보합니다.
또한 TCP는 송신자와 수신자 간의 데이터 처리 속도 차이를 조절하기 위한 흐름 제어 메커니즘을 갖추고 있습니다. 주로 슬라이딩 윈도우 프로토콜을 사용하며, 수신 측은 자신의 수신 윈도우 크기를 공지하여 송신 측이 한 번에 보낼 수 있는 데이터 양을 제한합니다. 이는 수신 측의 버퍼 오버플로를 방지합니다. 네트워크 자체의 혼잡을 관리하기 위한 혼잡 제어는 별도의 메커니즘으로 동작합니다. 초기에는 슬로 스타트 방식으로 전송 속도를 점진적으로 높이다가 패킷 손실을 감지하면 전송 속도를 급격히 낮추는 방식으로 네트워크의 정체를 완화합니다.
특징 | 설명 |
|---|---|
연결 지향성 | 통신 전 논리적 연결을 수립(3-way 핸드셰이크)합니다. |
신뢰성 전송 | |
흐름 제어 | 수신자의 처리 능력을 고려하여 송신 속도를 조절합니다(주로 슬라이딩 윈도우 사용). |
혼잡 제어 | 네트워크의 혼잡을 감지하고 송신 속도를 조절하여 전체 네트워크의 안정성을 높입니다. |
전이중 통신 | 하나의 연결에서 양방향으로 동시에 데이터를 전송할 수 있습니다. |
3.1. 연결 지향성과 신뢰성
3.1. 연결 지향성과 신뢰성
TCP는 IP와 함께 인터넷의 핵심 프로토콜로, 연결 지향 방식과 신뢰성 있는 데이터 전송을 보장하는 특징을 가집니다. 연결 지향성은 데이터를 교환하기 전에 송신자와 수신자 사이에 논리적인 연결 경로를 설정하는 것을 의미합니다. 이 과정은 3-way 핸드셰이크로 알려진 절차를 통해 이루어지며, 연결이 성립된 후에만 본격적인 데이터 전송이 시작됩니다. 이는 우편물을 보내기 전에 수신자에게 연락하여 받을 준비가 되었는지 확인하는 것과 유사합니다.
신뢰성은 TCP의 또 다른 근본적인 특성으로, 데이터가 순서대로, 오류 없이, 중복 없이 목적지에 전달되도록 보장합니다. 이를 위해 TCP는 확인응답, 재전송, 체크섬, 순서 번호 등의 메커니즘을 사용합니다. 송신 측은 전송한 각 세그먼트에 대해 수신 측으로부터 확인응답을 받아야 합니다. 확인응답을 받지 못하거나 데이터가 손상된 것으로 판단되면, 해당 세그먼트를 재전송합니다. 또한, 패킷이 네트워크 경로 상에서 서로 다른 경로를 통해 전송되어 도착 순서가 뒤섞일 수 있기 때문에, 각 세그먼트에 부여된 순서 번호를 통해 수신 측에서 원래의 순서대로 데이터를 재조립합니다.
이러한 연결 지향성과 신뢰성 보장은 특정 응용 프로그램에 필수적입니다. 예를 들어, 웹 페이지를 로드하거나 이메일을 보내거나 파일을 다운로드할 때는 데이터의 일부가 누락되거나 순서가 바뀌어서는 안 됩니다. TCP는 이러한 요구사항을 충족시키기 위해 설계되었습니다. 그러나 연결 설정 및 유지, 오류 검사 및 복구 과정에서 발생하는 오버헤드로 인해 실시간 통신이나 온라인 게임과 같이 낮은 지연 시간이 중요한 경우에는 적합하지 않을 수 있습니다[2]] 프로토콜이 사용됩니다].
3.2. 흐름 제어
3.2. 흐름 제어
흐름 제어는 데이터를 보내는 송신자와 데이터를 받는 수신자 간의 처리 속도 차이를 조절하여, 수신자의 버퍼 오버플로우를 방지하는 메커니즘입니다. 수신자가 처리할 수 있는 속도보다 빠르게 데이터가 도착하면, 도착한 데이터는 버퍼에 일시 저장됩니다. 그러나 버퍼 용량을 초과하는 데이터는 손실될 수 있습니다. TCP는 이를 방지하기 위해 수신자의 처리 능력에 맞춰 송신자의 데이터 전송 속도를 동적으로 조절합니다.
이 메커니즘의 핵심은 슬라이딩 윈도우 프로토콜과 수신 윈도우 필드입니다. 수신자는 자신의 TCP 헤더에 있는 수신 윈도우 필드를 통해 현재 사용 가능한 버퍼 공간의 크기(바이트 단위)를 송신자에게 알립니다. 송신자는 이 값을 확인하고, 아직 확인 응답을 받지 않은 데이터의 양이 이 윈도우 크기를 넘지 않도록 전송량을 제한합니다. 이는 마치 수신자가 송신자에게 "지금은 이만큼만 보내도 괜찮다"는 신호를 지속적으로 보내는 것과 같습니다.
흐름 제어의 동작을 보다 구체적으로 설명하면 다음과 같습니다. 수신자는 확인 응답 세그먼트를 보낼 때마다 현재의 수신 윈도우 크기를 포함시킵니다. 송신자는 이를 바탕으로 자신의 송신 윈도우 크기를 조정합니다. 만약 수신자의 버퍼가 가득 차 수신 윈도우 크기가 0이 되면, 송신자는 전송을 중지합니다. 이후 수신자가 버퍼를 정리하고 새로운 수신 윈도우 크기(0보다 큰 값)를 담은 세그먼트를 보내면, 송신자는 전송을 재개합니다. 이 과정을 통해 데이터 손실 없이 효율적인 전송이 이루어집니다.
3.3. 혼잡 제어
3.3. 혼잡 제어
혼잡 제어는 TCP가 네트워크의 과부하를 방지하고 공정한 대역폭 공유를 유도하기 위한 핵심 메커니즘입니다. 네트워크 경로 상의 라우터나 스위치 같은 중간 노드에는 처리 능력에 한계가 있는 버퍼가 존재합니다. 송신자가 너무 빠른 속도로 데이터를 전송하면 이 버퍼가 가득 차 패킷 손실이 발생하게 됩니다. 혼잡 제어의 목표는 이러한 패킷 손실을 사전에 예방하거나 최소화하면서, 네트워크가 수용할 수 있는 최적의 전송 속도를 동적으로 탐색하고 유지하는 것입니다. 이는 단순히 송수신자 간의 처리 속도를 맞추는 흐름 제어와는 구별되는 개념입니다.
혼잡 제어는 주로 혼잡 윈도우라는 변수를 통해 구현됩니다. 이 윈도우는 네트워크 상태에 따라 송신자가 한 번에 전송할 수 있는 데이터 양을 결정합니다. 초기에는 슬로우 스타트 단계에서 윈도우 크기를 지수적으로 빠르게 증가시켜 사용 가능한 대역폭을 탐색합니다. 사전에 설정된 임계값에 도달하거나 패킷 손실이 감지되면, 혼잡 회피 단계로 전환되어 윈도우 크기를 선형적으로만 증가시켜 네트워크를 포화 상태에 가깝게 유지하면서도 과부하를 피하려고 합니다.
패킷 손실은 네트워크 혼잡의 주요 지표로 간주됩니다. 손실이 감지되면 TCP는 즉시 전송 속도를 크게 낮춥니다. 구체적인 동작 방식은 사용하는 알고리즘에 따라 다릅니다. 예를 들어, 전통적인 TCP Tahoe는 손실 발생 시 혼잡 윈도우를 1로 줄이고 슬로우 스타트부터 다시 시작합니다. 보다 발전된 TCP Reno는 빠른 회복 기법을 도입하여 윈도우를 반으로 줄이고 선형 증가 단계로 바로 진입함으로써 성능 저하를 완화합니다. 현대적으로 널리 쓰이는 TCP CUBIC 알고리즘은 윈도우 크기를 시간의 3차 함수로 증가시켜 장거리 고대역폭 네트워크에서 더 공정하고 효율적으로 대역폭을 점유합니다.
4. 헤더 구조와 세그먼트
4. 헤더 구조와 세그먼트
TCP 세그먼트는 IP 패킷의 페이로드에 캡슐화되어 전송되는 기본 데이터 단위입니다. 각 세그먼트는 데이터를 운반하는 부분과 연결 및 전송 제어 정보를 담은 TCP 헤더로 구성됩니다. 헤더는 일반적으로 20바이트의 고정 길이를 가지며, 옵션 필드가 포함될 경우 최대 60바이트까지 확장될 수 있습니다.
TCP 헤더의 주요 필드는 다음과 같습니다.
필드 | 크기(비트) | 설명 |
|---|---|---|
송신 포트 | 16 | 데이터를 보내는 애플리케이션의 포트 번호 |
수신 포트 | 16 | 데이터를 받는 애플리케이션의 포트 번호 |
시퀀스 번호 | 32 | 전송 중인 데이터 바이트 스트림 내 위치를 식별[3]. 3-way 핸드셰이크 시 초기 값(ISN)은 무작위로 설정됨. |
확인 응답 번호 | 32 | 수신 측이 다음으로 기대하는 시퀀스 번호. 이는 상대방으로부터 성공적으로 수신한 데이터에 대한 확인 응답(ACK)을 의미함. |
데이터 오프셋 | 4 | TCP 헤더의 길이를 32비트 워드 단위로 표시(헤더 시작부터 데이터 시작까지의 거리). |
예약 필드 | 6 | 미래 사용을 위해 예약됨, 0으로 설정. |
제어 비트 | 6 | |
윈도우 크기 | 16 | 수신자의 수신 윈도우 크기. 자신이 현재 수용할 수 있는 데이터 양을 바이트 단위로 알려 흐름 제어에 사용됨. |
체크섬 | 16 | 헤더, 데이터, 의사 헤더(Pseudo-header)의 오류 검출을 위해 사용. |
긴급 포인터 | 16 | URG 플래그가 설정된 경우, 긴급 데이터의 위치를 가리킴. |
옵션 | 가변 | 최대 세그먼트 크기(MSS) 협상, 선택적 확인응답(SACK), 윈도우 스케일 확장 등 다양한 확장 기능을 지원. |
세그먼트는 헤더의 제어 비트에 따라 그 역할이 결정됩니다. 예를 들어, SYN과 ACK 비트가 설정된 세그먼트는 연결 설정 과정에서 사용되고, FIN 비트가 설정된 세그먼트는 연결 종료를 신호합니다. 데이터를 실어 나르는 일반 세그먼트에는 ACK 비트가 거의 항상 설정되어 있습니다. 옵션 필드를 통해 MSS를 협상하거나 더 큰 윈도우 크기를 사용할 수 있도록 스케일 인자를 교환하는 등, 기본 프로토콜의 성능과 기능을 향상시킬 수 있습니다.
5. 연결 관리
5. 연결 관리
연결 관리는 TCP가 데이터 교환을 시작하기 전에 논리적인 연결을 수립하고, 데이터 전송이 완료된 후에는 이 연결을 정상적으로 종료하는 과정을 의미합니다. 이 과정은 3-way 핸드셰이크와 4-way 핸드셰이크라는 두 가지 핵심 절차로 구성됩니다.
연결 수립은 3-way 핸드셰이크를 통해 이루어집니다. 먼저, 클라이언트가 서버에게 SYN 플래그가 설정된 패킷을 보냅니다. 서버는 이 요청을 수락하며 SYN과 ACK 플래그가 모두 설정된 패킷으로 응답합니다. 마지막으로 클라이언트가 ACK 패킷을 보내면, 양측 모두 연결이 준비되었다고 인식하고 데이터 전송을 시작할 수 있습니다. 이 과정에서 초기 순서 번호를 교환하여 데이터의 순서를 보장하는 기반을 마련합니다.
연결 종료는 일반적으로 4-way 핸드셰이크를 통해 이루어집니다. 연결을 종료하려는 측(보통 클라이언트)이 FIN 플래그를 설정한 패킷을 보냅니다. 수신측은 이에 대해 ACK로 응답한 후, 자신도 데이터 전송을 마치고 FIN 패킷을 보냅니다. 최종적으로 첫 번째 종료 요청자는 이 FIN에 대한 ACK를 보내 연결을 완전히 닫습니다. 양측이 모두 FIN과 ACK를 교환함으로써 안전하게 연결을 해제합니다.
단계 | 송신자 | 수신자 | 전송되는 플래그/패킷 | 목적 |
|---|---|---|---|---|
1 | 클라이언트 | 서버 | 연결 요청 및 초기 순서 번호 통지 | |
2 | 서버 | 클라이언트 | 연결 수락 및 자신의 초기 순서 번호 통지 | |
3 | 클라이언트 | 서버 | 연결 수립 확인, 데이터 전송 시작 | |
4 (종료 시작) | 호스트 A | 호스트 B | 연결 종료 요청 | |
5 | 호스트 B | 호스트 A | 종료 요청 확인 | |
6 | 호스트 B | 호스트 A | 자신의 연결 종료 요청 | |
7 | 호스트 A | 호스트 B | 종료 확인, 연결 완전 해제 |
이러한 연결 관리 메커니즘은 TCP의 핵심 특성인 연결 지향성과 신뢰성을 실현하는 기반이 됩니다. 또한, 타임 웨이트 상태와 같은 절차를 통해 지연된 패킷이 새 연결에 영향을 미치지 않도록 방지합니다.
5.1. 3-way 핸드셰이크
5.1. 3-way 핸드셰이크
TCP 연결을 성립하기 위한 과정으로, 클라이언트와 서버 간에 세 개의 패킷이 교환됩니다. 이 절차는 데이터 전송을 시작하기 전에 양측이 서로의 존재를 확인하고 초기 파라미터를 협상하는 데 목적이 있습니다. 신뢰성 있는 연결의 기초를 제공하는 핵심 메커니즘입니다.
3-way 핸드셰이크는 다음과 같은 세 단계로 진행됩니다.
단계 | 송신자 | 플래그 | 주요 정보 |
|---|---|---|---|
1 | 클라이언트 | 클라이언트의 초기 시퀀스 번호 포함 | |
2 | 서버 | 서버의 초기 시퀀스 번호와 클라이언트의 시퀀스 번호+1에 대한 확인 응답 | |
3 | 클라이언트 | 서버의 시퀀스 번호+1에 대한 확인 응답 |
첫 번째 단계에서 클라이언트는 연결 요청을 의미하는 SYN 플래그가 설정된 세그먼트를 서버로 보냅니다. 이 세그먼트에는 클라이언트가 임의로 생성한 초기 시퀀스 번호가 담겨 있어 데이터 스트림의 시작점을 정의합니다. 서버는 이 SYN을 수신하면 두 번째 단계로 응답합니다. 서버는 자신의 SYN 플래그와 클라이언트의 요청을 정상적으로 받았다는 ACK 플래그를 함께 설정한 세그먼트를 회신합니다. 이때, 서버도 자신의 초기 시퀀스 번호를 포함하며, 확인 응답 번호는 클라이언트의 시퀀스 번호에 1을 더한 값으로 설정합니다.
마지막으로 클라이언트는 서버의 SYN+ACK 세그먼트에 대한 확인 응답으로 ACK 플래그가 설정된 세그먼트를 보냅니다. 이 세그먼트의 확인 응답 번호는 서버의 시퀀스 번호에 1을 더한 값입니다. 이 세 번째 패킷이 서버에 도달하면, 양측 모두 상대방의 수신 능력과 전송 의사를 확인했으며, 초기 시퀀스 번호를 교환 완료한 상태가 됩니다. 이로써 전이중 통신이 가능한 신뢰적인 연결이 설정되고, 본격적인 데이터 전송 단계로 진입할 수 있게 됩니다.
5.2. 4-way 핸드셰이크
5.2. 4-way 핸드셰이크
4-way 핸드셰이크는 TCP 연결을 정상적으로 종료하기 위한 과정입니다. 이 과정은 양방향 연결의 각 방향을 독립적으로 닫는 전이중 통신 특성을 반영하며, 총 네 단계의 패킷 교환으로 구성됩니다. 연결 종료는 클라이언트나 서버 어느 쪽에서도 먼저 시작할 수 있으며, 일반적으로 연결을 종료하려는 측이 FIN 세그먼트를 전송함으로써 시작됩니다.
연결 종료 절차는 다음과 같은 순서로 진행됩니다.
1. 먼저 연결을 종료하려는 측(예: 클라이언트)이 FIN 플래그가 설정된 세그먼트를 전송합니다.
2. 이 FIN 세그먼트를 받은 상대방(서버)은 ACK 세그먼트를 보내어 FIN 수신을 확인합니다. 이 시점에서 서버에서 클라이언트로의 데이터 흐름은 종료되지만, 서버가 아직 전송 중인 데이터가 있다면 클라이언트로 보낼 수 있습니다.
3. 서버가 보낼 데이터를 모두 전송하고 연결 종료 준비가 완료되면, 서버도 FIN 플래그가 설정된 세그먼트를 클라이언트에게 보냅니다.
4. 클라이언트는 서버의 FIN을 받고 ACK 세그먼트를 보내 확인합니다. 이 ACK를 받은 서버는 연결을 완전히 닫습니다.
클라이언트는 마지막 ACK 세그먼트를 보낸 후, 네트워크 지연으로 인해 유실될 수 있는 재전송된 FIN 세그먼트를 처리하기 위해 일정 시간 동안 TIME_WAIT 상태로 대기합니다. 이 상태가 지나면 클라이언트도 모든 리소스를 해제하고 연결이 완전히 종료됩니다. 이 과정을 통해 데이터의 신뢰성 있는 전송이 완료되었음을 양측이 확신하고, 자원을 안전하게 정리할 수 있습니다.
6. 전송 제어 메커니즘
6. 전송 제어 메커니즘
TCP의 전송 제어 메커니즘은 데이터의 신뢰성 있는 전달을 보장하기 위한 핵심 기능입니다. 이 메커니즘은 크게 두 가지 주요 기술, 즉 재전송 및 타이머 관리와 슬라이딩 윈도우 프로토콜로 구성됩니다. 이들은 함께 작동하여 패킷 손실을 감지하고 복구하며, 송신자와 수신자 간의 효율적인 데이터 흐름을 조정합니다.
재전송 메커니즘은 확인응답(ACK)을 기반으로 합니다. 송신자는 전송한 각 세그먼트에 대해 타이머를 설정하고, 수신자로부터 해당 데이터의 정상 수신을 알리는 ACK를 기다립니다. ACK가 예상 시간 내에 도착하지 않으면 패킷 손실이 발생한 것으로 간주하고 해당 세그먼트를 재전송합니다. 이때 사용되는 대표적인 알고리즘으로는 재전송 시간을 동적으로 계산하는 RTT(Round-Trip Time) 측정과 지수 백오프(Exponential Backoff)가 있습니다. 또한, 중복된 ACK를 여러 번 받는 경우를 통해 손실을 빠르게 감지하는 빠른 재전송(Fast Retransmit) 기법도 활용됩니다.
데이터 흐름의 효율성을 관리하는 것은 슬라이딩 윈도우 프로토콜입니다. 이는 수신자의 처리 능력을 고려하여 송신자가 한 번에 전송할 수 있는 데이터 양(윈도우 크기)을 동적으로 조절합니다. 수신자는 자신의 수신 윈도우(rwnd) 크기를 ACK 패킷에 담아 송신자에게 알려줍니다. 송신자는 이 크기 내에서, 확인응답을 받지 않은 연속된 데이터의 전송을 허용합니다. ACK가 도착함에 따라 이 윈도우는 "슬라이딩"처럼 앞으로 이동하며, 새로운 데이터의 전송이 가능해집니다. 이 방식은 정지-대기 프로토콜처럼 한 번에 하나의 패킷만 보내는 방식보다 네트워크 대역폭을 훨씬 더 효율적으로 사용할 수 있게 합니다.
메커니즘 | 주요 목적 | 동작 방식 |
|---|---|---|
재전송 및 타이머 | 데이터 손실 복구 | ACK 타임아웃 또는 중복 ACK 감지 시 세그먼트 재전송 |
슬라이딩 윈도우 | 흐름 제어 및 효율성 향상 | 수신자 버퍼 상태에 기반한 동적 전송 윈도우 관리 |
이 두 메커니즘은 상호 보완적으로 작동합니다. 슬라이딩 윈도우는 최적의 전송 속도를 유지하려 하고, 재전송 메커니즘은 이 과정에서 발생할 수 있는 오류를 복구합니다. 함께 구현됨으로써 TCP는 높은 처리량과 신뢰성을 동시에 달성할 수 있습니다.
6.1. 재전송 및 타이머
6.1. 재전송 및 타이머
TCP는 신뢰적인 데이터 전송을 보장하기 위해 패킷 손실을 감지하고 복구하는 재전송 메커니즘을 사용합니다. 이 메커니즘의 핵심은 각 전송된 세그먼트에 대한 응답(ACK)을 기다리는 타이머를 운영하는 것입니다. 이 타이머를 RTO라고 합니다. 송신 측은 데이터를 보내고 타이머를 시작하며, 수신 측으로부터 해당 데이터에 대한 ACK를 제시간에 받으면 타이머를 중지하고 다음 데이터를 전송합니다. 만약 RTO가 만료될 때까지 ACK를 받지 못하면, 해당 데이터가 손실되었다고 가정하고 재전송을 수행합니다.
RTO의 값은 네트워크 상황에 따라 동적으로 조정됩니다. 이 값은 RTT을 기반으로 계산되며, 네트워크 지연이 변동할 때마다 지속적으로 업데이트됩니다[4]. 만약 RTO가 너무 짧게 설정되면 불필요한 재전송이 발생하고, 너무 길게 설정되면 손실 복구가 지연되어 성능이 저하됩니다. 따라서 정확한 RTT 측정과 RTO 계산은 TCP 성능에 매우 중요합니다.
재전출력은 단순히 RTO 만료에 의해서만 발생하지 않습니다. 효율성을 높이기 위해 빠른 재전송 메커니즘이 사용됩니다. 수신 측은 순서가 잘못 도착한 세그먼트를 받으면, 즉시 마지막으로 정상 수신한 순번의 ACK를 중복으로 보냅니다. 송신 측이 동일한 ACK 번호를 세 번 연속으로 받으면(중복 ACK), RTO 만료를 기다리지 않고 해당 세그먼트를 즉시 재전송합니다. 이는 RTO보다 훨씬 빠르게 손실을 복구할 수 있게 합니다.
재전송 유발 조건 | 동작 방식 | 주요 특징 |
|---|---|---|
RTO 만료 | 전송 후 설정된 시간 내 ACK 미수신 | 기본적인 손실 감지 방법 |
동일한 ACK 번호를 3회 연속 수신 | RTO를 기다리지 않고 빠른 복구 가능 |
이러한 재전송 및 타이머 관리 체계는 TCP가 신뢰성을 제공하는 근간이 되지만, 모든 재전출력이 패킷 손실 때문만은 아닙니다. 패킷의 순서 재배열도 중복 ACK를 발생시킬 수 있어, 불필요한 재전송을 유발할 수도 있습니다.
6.2. 슬라이딩 윈도우
6.2. 슬라이딩 윈도우
슬라이딩 윈도우는 TCP가 흐름 제어를 수행하고 효율적으로 데이터를 전송하기 위해 사용하는 핵심 메커니즘입니다. 이 방식은 수신 측의 처리 능력과 네트워크 상태를 고려하여 송신 측이 한 번에 보낼 수 있는 데이터의 양을 동적으로 조절합니다. 핵심 아이디어는 수신 측이 자신의 수신 윈도우 크기를 알려주면, 송신 측은 이 크기 내에서 확인응답을 기다리지 않고 연속적으로 여러 개의 세그먼트를 전송할 수 있다는 것입니다. 이렇게 미리 정해진 범위(윈도우) 내의 데이터를 보내고, 수신 측으로부터 ACK를 받으면 윈도우가 그만큼 앞으로 이동(슬라이딩)하여 새로운 데이터를 전송할 수 있게 됩니다.
슬라이딩 윈도우의 동작은 송신 측과 수신 측 각각의 버퍼 상태를 통해 관리됩니다. 송신 측은 다음 표와 같이 세 가지 포인터를 유지하여 윈도우를 정의합니다.
포인터 | 설명 |
|---|---|
SND.UNA (Send Unacknowledged) | 확인응답을 아직 받지 못한 가장 오래된 데이터의 시퀀스 번호 |
SND.NXT (Send Next) | 다음에 전송할 데이터의 시퀀스 번호 |
윈도우 경계 | SND.UNA + 수신 측이 알려준 수신 윈도우 크기 |
SND.UNA와 윈도우 경계 사이의 범위가 현재 전송 가능한 '송신 윈도우'입니다. 수신 측도 유사하게 RCV.NXT(다음에 기대하는 데이터의 시퀀스 번호)와 자신의 버퍼 크기를 기반으로 수신 윈도우를 계산하여 ACK 세그먼트에 담아 송신 측에 주기적으로 알립니다.
이 메커니즘은 네트워크 이용률을 극대화하는 동시에 수신 측의 버퍼 오버플로를 방지합니다. 송신 측은 확인응답을 기다리는 동안 유휴 상태가 되지 않고, 윈도우 크기만큼 데이터를 연속 전송할 수 있습니다. 또한, 혼잡 제어 알고리즘은 이 윈도우 크기에 추가적인 제약(혼잡 윈도우)을 가하여 네트워크 정체를 완화합니다. 따라서 슬라이딩 윈도우는 신뢰성 있는 전송, 효율성, 그리고 흐름 제어와 혼잡 제어를 통합하는 TCP의 근간이 됩니다.
7. TCP 혼잡 제어 알고리즘
7. TCP 혼잡 제어 알고리즘
TCP 혼잡 제어는 네트워크의 혼잡을 감지하고 데이터 전송 속도를 조절하여 패킷 손실을 최소화하고 공정한 대역폭 공유를 목표로 합니다. 초기 TCP Tahoe와 그 개선판인 TCP Reno는 혼잡 제어의 기본적인 틀을 마련한 대표적인 알고리즘입니다. Tahoe는 3중 중복 ACK 또는 재전송 타임아웃을 혼잡 발생 신호로 간주하여 혼잡 윈도우 크기를 급격히 줄이고, 슬로우 스타트 단계부터 재개합니다. Reno는 Tahoe의 단점을 보완하여 3중 중복 ACK 시 패스트 리트랜스미션을 통해 즉시 손실된 세그먼트를 재전송하고, 패스트 리커버리 단계를 도입해 혼잡 후 회복 속도를 높였습니다.
시간이 지남에 따라 고대역폭·고지연 네트워크 환경에서 Tahoe와 Reno의 성능이 제한되는 것으로 나타났습니다. 이 문제를 해결하기 위해 개발된 TCP CUBIC은 혼잡 윈도우의 증가를 시간의 3차 함수(큐빅 함수)에 기반하여 결정합니다. CUBIC은 혼잡 사건 발생 시 윈도우 크기를 선형적으로 감소시키지 않고, 이전 최대 윈도우 크기 근처에서 포화 구간을 형성하며 점진적으로 다시 증가시킵니다. 이 방식은 대역폭을 더 공정하게 공유하고, 고속 장거리 네트워크에서 RTT에 덜 민감한 안정적인 성능을 제공합니다.
주요 TCP 혼잡 제어 알고리즘의 핵심 동작 방식을 비교하면 다음과 같습니다.
알고리즘 | 혼잡 감지 주요 신호 | 혼잡 후 윈도우 조정 방식 | 주요 특징 |
|---|---|---|---|
TCP Tahoe | 3중 중복 ACK, 타임아웃 | 윈도우를 1 MSS로 줄이고 슬로우 스타트 재시작 | 기본적인 AIMD[5] 방식, 패스트 리트랜스미션 없음 |
TCP Reno | 3중 중복 ACK, 타임아웃 | 3중 ACK 시: 패스트 리커버리 단계 수행 / 타임아웃 시: Tahoe와 동일 | 패스트 리트랜스미션과 패스트 리커버리 도입으로 부분적 회복 가능 |
TCP CUBIC | 3중 중복 ACK, 타임아웃 | 윈도우를 배수로 감소시킨 후, 3차 함수 기반으로 점진적 증가 | RTT 독립적, 고대역폭·고지연 네트워크에 최적화, 리눅스의 기본 알고리즘 |
이러한 알고리즘들의 진화는 네트워크 용량과 트래픽 패턴의 변화에 대응하기 위한 지속적인 노력의 결과입니다. 각 알고리즘은 혼잡을 피하면서도 링크 활용도를 최대화하는 서로 다른 전략을 구현하며, 현대 인터넷의 안정적인 데이터 흐름을 뒷받침합니다.
7.1. Tahoe, Reno, CUBIC
7.1. Tahoe, Reno, CUBIC
TCP 혼잡 제어 알고리즘은 네트워크의 혼잡을 감지하고 데이터 전송 속도를 조절하는 핵심 메커니즘입니다. 초기 TCP Tahoe와 그 개선판인 TCP Reno는 혼잡 제어의 기본 원형을 확립했으며, 이후 등장한 TCP CUBIC은 현대 고속 네트워크에서 널리 사용되는 표준 알고리즘이 되었습니다.
알고리즘 | 주요 특징 | 혼잡 감지 방식 | 혼잡 후 동작 |
|---|---|---|---|
TCP Tahoe | 초기 표준 알고리즘 | ||
TCP Reno | Tahoe의 개선, Fast Recovery 도입 | 3-중복 ACK (부분적 손실) / RTO (심각한 손실) | 3-중복 ACK 시 cwnd를 반으로 줄이고 혼잡 회피 단계로 진입[6]. RTO 시 Tahoe와 동일하게 동작. |
TCP CUBIC | 현대 리눅스 기본 알고리즘, 대역폭-지연 곱에 최적화 | 패킷 손실 (ACK 듀플리케이트 또는 RTO) | cwnd를 곡선 함수(3차 함수)를 사용하여 조정. 손실 후 cwnd를 급격히 낮추지 않고 이전 최대점을 목표로 부드럽게 증가시킴. |
TCP Tahoe는 슬로우 스타트, 혼잡 회피, Fast Retransmit의 기본 단계를 정의했습니다. 그러나 패킷 손실이 발생하면 혼잡 윈도우 크기를 1로 초기화하고 슬로우 스타트부터 다시 시작하기 때문에, 특히 대역폭이 큰 네트워크에서 윈도우 크기를 회복하는 데 시간이 오래 걸리는 단점이 있었습니다. TCP Reno는 이 문제를 해결하기 위해 Fast Recovery 단계를 추가했습니다. 3개의 중복 ACK로 '부분적 손실'을 감지하면, 윈도우 크기를 반으로만 줄이고 바로 혼잡 회피 단계로 진입하여 성능 저하를 완화했습니다.
고속 장거리 네트워크 환경에서는 Reno 계열 알고리즘도 대역폭을 효율적으로 활용하지 못하는 경우가 발생했습니다. TCP CUBIC은 이러한 한계를 극복하기 위해 설계되었습니다. CUBIC은 시간을 변수로 하는 3차 함수를 사용하여 혼잡 윈도우의 증가를 결정합니다. 핵심 아이디어는 마지막 패킷 손실이 발생한 시점의 윈도우 크기를 기억하고, 손실 후 일정 시간이 지나면 그 크기로 다시 빠르게 접근한 후 점진적으로 성장하는 것입니다. 이로 인해 대역폭 활용도가 높고 RTT(왕복 시간)에 덜 민감한 특성을 가지게 되어, 오늘날 대부분의 리눅스 시스템의 기본 TCP 혼잡 제어 알고리즘으로 자리 잡았습니다.
8. TCP의 변형과 확장
8. TCP의 변형과 확장
TCP의 기본 설계는 인터넷 초기 환경에 맞춰져 있었으나, 네트워크 환경의 변화와 새로운 요구사항에 따라 다양한 변형과 확장이 개발되었다. 이러한 변형들은 기본 TCP의 핵심 원리를 유지하면서 특정 성능 문제를 해결하거나 새로운 기능을 추가하는 것을 목표로 한다. 주요 개선 방향은 혼잡 제어 알고리즘의 정교화, 연결 설정 지연 감소, 그리고 무선 네트워크나 고대역폭-고지연 환경에서의 성능 향상에 초점을 맞추고 있다.
혼잡 제어 알고리즘의 진화는 중요한 변형 사례이다. TCP Reno 이후, TCP Vegas는 패킷의 왕복 시간(RTT) 변화를 관찰하여 혼잡을 사전에 예측하고 혼잡 윈도우를 조정하는 방식을 도입했다. 이는 버퍼블로트를 완화하고 공평한 대역폭 공유를 목표로 했으나, 기존 TCP Reno와의 경쟁에서 불리한 점이 지적되었다. 최근에는 구글이 제안한 BBR(Bottleneck Bandwidth and Round-trip propagation time)이 혁신적인 접근법을 보여준다. BBR은 패킷 손실을 혼잡의 주요 지표로 보지 않고, 실제 대역폭과 지연 시간을 모델링하여 최적의 송신 속도를 지속적으로 탐색한다. 이는 특히 높은 대역폭과 지연 곱(BDP)을 가진 네트워크에서 처리량을 크게 향상시킬 수 있다.
연결 설정 과정의 오버헤드를 줄이기 위한 확장도 활발히 진행되었다. TFO(TCP Fast Open)는 3-way 핸드셰이크 과정에서 데이터를 함께 전송할 수 있도록 함으로써 첫 번째 요청의 지연을 제거한다. 클라이언트가 서버로부터 받은 암호화된 쿠키를 이후 연결 시 사용하여, SYN 패킷에 애플리케이션 데이터를 실어 보낼 수 있게 한다. 이는 HTTP 요청과 같은 짧은 트랜잭션의 성능을 개선하는 데 효과적이다.
프로토콜 변형 | 주요 특징 | 목표/해결 문제 |
|---|---|---|
RTT 변화를 통해 혼잡을 예측하여 윈도우 조정 | 공평성 향상, 버퍼블로트 감소 | |
대역폭과 지연 시간 모델링을 통한 송신률 제어 | 고대역폭-고지연 환경에서 처리량 최적화 | |
핸드셰이크 과정 중 데이터 전송 허용 | 연결 설정 지연 감소 |
이외에도, 무선 네트워크에서의 빈번한 패킷 손실을 혼잡으로 오인하지 않도록 하는 TCP Westwood, 또는 하나의 물리적 연결 내에 여러 개의 논리적 스트림을 생성하여 헤드 오브 라인 블로킹 문제를 완화하는 MPTCP(Multipath TCP)와 같은 확장들이 연구 및 표준화되고 있다. 이러한 변형과 확장들은 TCP가 현대 네트워크의 다양하고 까다로운 조건에서도 계속해서 근간 프로토콜로 자리매김하도록 돕고 있다.
8.1. TCP Vegas, BBR
8.1. TCP Vegas, BBR
TCP Vegas는 TCP Reno와 같은 패킷 손실 기반 혼잡 제어와 달리, 왕복 시간(RTT)의 변화를 관찰하여 혼잡을 예측하는 선제적 접근 방식을 채택한 알고리즘입니다. 핵심 아이디어는 실제 처리량과 기대 처리량의 차이를 계산하여 네트워크 혼잡을 간접적으로 측정하는 것입니다. RTT가 증가하면 혼잡이 발생하고 있다고 판단하여 혼잡 윈도우 크기를 조기에 줄입니다. 이로 인해 패킷 손실이 발생하기 전에 전송 속도를 낮춤으로써, 버퍼 블로트를 완화하고 대기 시간을 줄이는 효과를 목표로 합니다. 그러나 기존의 손실 기반 알고리즘과의 공정한 대역폭 공유 문제와 낮은 대역폭 환경에서의 성능 저하 등으로 널리 채택되지는 못했습니다.
반면, BBR(Bottleneck Bandwidth and Round-trip propagation time)은 구글에서 개발한 현대적인 TCP 혼잡 제어 알고리즘으로, 네트워크 경로의 두 가지 핵심 상태인 최대 대역폭(BtlBw)과 최소 왕복 시간(RTprop)을 직접 측정하여 동작합니다. BBR은 주기적으로 전송 속도를 탐색하여 실제 사용 가능한 대역폭을 찾고, 그에 맞춰 데이터를 전송합니다. 이는 패킷 손실을 혼잡의 주요 신호로 삼지 않으며, 결과적으로 버퍼 블로트를 유발하지 않고도 높은 처리량과 낮은 지연을 동시에 달성하는 것을 목표로 합니다.
다음 표는 두 알고리즘의 주요 특징을 비교한 것입니다.
특징 | TCP Vegas | BBR |
|---|---|---|
혼잡 탐지 기준 | 왕복 시간(RTT) 증가 | 대역폭과 RTT의 직접 측정 |
주요 목표 | 낮은 지연, 버퍼 블로트 감소 | 높은 처리량과 낮은 지연의 균형 |
패킷 손실 처리 | 손실을 혼잡의 결과로 봄 | 혼잡의 필수 신호로 보지 않음 |
대역폭 공정성 | 기존 TCP Reno와의 경쟁력 약함 | 상대적으로 더 나은 공정성 지향 |
실제 적용 | 연구 및 실험 수준 | 구글 서비스 및 일부 리눅스 커널에 적용 |
BBR은 특히 장거리 고대역폭 네트워크에서 기존 손실 기반 알고리즘보다 우수한 성능을 보이며, 구글의 내부 네트워크 및 유튜브, 구글 클라우드 등의 서비스에 적용되어 검증되었습니다. 반면, TCP Vegas는 혼잡 제어에 대한 새로운 관점을 제시한 선구적인 연구로 평가받습니다.
8.2. TFO(TCP Fast Open)
8.2. TFO(TCP Fast Open)
TFO(TCP Fast Open)는 TCP 연결 설정 과정에서 발생하는 지연을 줄이기 위해 설계된 확장 기능입니다. 기존 TCP는 신뢰성 있는 연결을 위해 반드시 3-way 핸드셰이크를 완료한 후에만 데이터를 전송할 수 있었습니다. 이 과정은 최소 1회의 왕복 시간(RTT) 지연을 유발합니다. TFO는 이 핸드셰이크 과정 중에 클라이언트가 애플리케이션 데이터를 함께 보낼 수 있도록 허용하여, 연결 설정과 데이터 전송을 동시에 수행합니다. 이를 통해 특히 짧은 데이터 교환이 빈번한 웹 서비스에서 전체 지연 시간을 크게 단축할 수 있습니다.
TFO의 동작은 쿠키 기반의 보안 메커니즘을 중심으로 이루어집니다. 클라이언트가 특정 서버에 처음 연결할 때는 정상적인 3-way 핸드셰이크를 수행하며, 이 과정에서 서버는 암호화된 TFO 쿠키를 클라이언트에게 발급합니다. 클라이언트는 이 쿠키를 안전하게 저장합니다. 이후 동일한 서버에 재연결할 때, 클라이언트는 SYN 패킷에 저장된 TFO 쿠키와 함께 초기 데이터 요청을 담아 바로 보냅니다. 서버는 쿠키의 유효성을 검증한 후, SYN-ACK 응답과 함께 요청된 데이터에 대한 회신을 즉시 전송할 수 있습니다.
단계 | 기존 TCP | TCP Fast Open |
|---|---|---|
첫 연결 | 정상적인 3-way 핸드셰이크 후 데이터 전송 | 정상적인 3-way 핸드셰이크 후 데이터 전송 (쿠키 획득) |
재연결 | 반드시 핸드셰이크 완료 후 데이터 전송 (1 RTT 지연) | SYN 패킷에 쿠키와 데이터 포함, 서버가 즉시 데이터 회신 가능 (0 RTT 지연*) |
TFO는 주로 HTTP/HTTPS를 통한 웹 페이지 로딩 가속화에 활용됩니다. 웹 브라우저가 서버에 여러 객체(이미지, 스크립트 등)를 요청할 때 매번 새로운 TCP 연결을 수립해야 하는 경우, TFO를 사용하면 상당한 성능 향상을 기대할 수 있습니다. 그러나 모든 네트워크 경로(예: 중간 라우터나 방화벽)가 TCP 옵션을 정상적으로 처리해야 하며, 서버와 클라이언트 운영체제 모두에서 기능이 지원되어야 실질적으로 적용 가능합니다.
9. 응용 사례
9. 응용 사례
TCP는 인터넷의 핵심 전송 계층 프로토콜로서, 신뢰성 있는 데이터 전송이 필요한 거의 모든 주요 응용 프로그램에서 사용됩니다. 그 연결 지향적이고 오류 없는 통신을 보장하는 특성 덕분에, 우리가 일상적으로 사용하는 많은 서비스의 기반이 되고 있습니다.
가장 대표적인 응용 사례는 월드 와이드 웹입니다. HTTP와 그 보안 버전인 HTTPS는 모두 TCP 위에서 동작합니다. 사용자가 웹 브라우저에서 주소를 입력하면, 브라우저는 먼저 해당 서버와 TCP 연결을 수립한 후 HTTP 요청을 보내고 응답을 받습니다. 웹 페이지의 텍스트, 이미지, 스타일시트 등 모든 구성 요소는 TCP 세그먼트로 안정적으로 전송되어 화면에 표시됩니다. 전자메일 전송도 TCP에 크게 의존합니다. SMTP 프로토콜을 사용한 메일 발송과 POP3 또는 IMAP 프로토콜을 사용한 메일 수신 모두 TCP 연결을 통해 이루어집니다. 이를 통해 첨부 파일을 포함한 메일 내용이 손실되거나 손상되지 않고 전달됩니다.
파일 전송 분야에서는 FTP가 TCP를 사용하는 고전적이면서도 중요한 예입니다. 대용량 파일을 전송할 때 데이터 무결성이 필수적이므로, TCP의 신뢰성 있는 전송과 순서 보장 기능이 핵심 역할을 합니다. 또한, 원격 시스템 접속을 위한 SSH와 데이터베이스 접속(예: MySQL, PostgreSQL)도 대부분 TCP를 기반으로 합니다. 이러한 응용들은 단순한 데이터 전달을 넘어, 명령어와 그 결과와 같은 상호작용이 정확한 순서로 교환되어야 하기 때문에 TCP가 적합합니다.
응용 분야 | 주요 프로토콜 | TCP가 제공하는 핵심 가치 |
|---|---|---|
웹 탐색 | 웹 페이지 리소스의 완전하고 순서 있는 전달 | |
이메일 | 메시지 및 첨부 파일의 무결성 보장 | |
파일 전송 | 대용량 파일의 오류 없는 전송 | |
원격 접속 | 터미널 명령과 응답의 신뢰할 수 있는 스트림 | |
데이터베이스 연동 | 프로토콜 종속 (예: MySQL 프로토콜) | 쿼리와 결과 세트의 정확한 전송 |
요약하면, 데이터의 정확한 전송이 최우선인 응용 프로그램들은 광범위하게 TCP를 채택하고 있습니다. 패킷 손실, 중복, 순서 뒤바뀜과 같은 네트워크의 근본적인 문제를 해결함으로써, TCP는 애플리케이션 개발자가 네트워크의 복잡성을 직접 처리하지 않고도 비즈니스 로직에 집중할 수 있는 안정적인 통신 채널을 제공합니다.
9.1. 웹(HTTP/HTTPS)
9.1. 웹(HTTP/HTTPS)
TCP는 월드 와이드 웹의 근간을 이루는 HTTP와 HTTPS 프로토콜의 신뢰할 수 있는 전송 계층을 제공합니다. HTTP 요청과 응답은 모두 TCP 연결을 통해 전송되는 데이터 스트림으로 캡슐화됩니다. 웹 브라우저가 서버에 접속할 때, 기본적으로 URL에 명시된 포트(HTTP는 80, HTTPS는 443)를 통해 TCP 연결을 먼저 수립한 후, 그 안에서 HTTP 메시지 교환이 이루어집니다. 이 과정은 3-way 핸드셰이크로 시작되며, TCP의 연결 지향성은 모든 HTTP 요청이 순서대로 정확히 전달되도록 보장합니다.
HTTPS의 경우, 보안 계층(TLS/SSL)이 TCP 위에 추가됩니다. 연결 흐름은 먼저 표준 TCP 핸드셰이크로 연결을 설정한 후, 그 위에서 TLS 핸드셰이크가 수행되어 암호화된 터널을 형성합니다. 이후의 모든 HTTP 통신은 이 암호화된 터널을 통해 전송됩니다. TCP는 암호화된 데이터의 무결성과 순서를 유지하는 역할을 계속 수행하며, TLS 기록 계층의 데이터를 세그먼트로 나누어 신뢰성 있게 전송합니다.
HTTP/1.x와 HTTP/2는 기본적으로 지속적이지 않은(non-persistent) 또는 지속적인(persistent) TCP 연결을 활용합니다. HTTP/1.0에서는 일반적으로 하나의 요청-응답 쌍마다 새로운 TCP 연결을 열고 닫았으나, 이는 연결 설정 오버헤드가 큽니다. HTTP/1.1 및 HTTP/2에서는 하나의 TCP 연결을 통해 여러 개의 요청과 응답을 파이프라이닝하거나 멀티플렉싱하여 효율성을 높입니다. 특히 HTTP/2는 단일 연결 내에서 여러 스트림을 병렬로 처리하도록 설계되었지만, 여전히 TCP의 혼잡 제어와 재전송 메커니즘 아래에서 동작합니다.
TCP의 특성은 웹 성능에 직접적인 영향을 미칩니다. 초기 연결 설정 지연, 혼잡 제어로 인한 느린 시작(slow-start), 그리고 패킷 손실 시 발생하는 Head-of-Line Blocking 현상은 웹 페이지 로딩 시간을 증가시키는 요인입니다. 이러한 한계를 해결하기 위해 TCP Fast Open, HTTP/3과 같은 새로운 접근법이 개발되었습니다.
9.2. 이메일, 파일 전송
9.2. 이메일, 파일 전송
TCP는 이메일과 파일 전송과 같은 애플리케이션 계층 서비스의 근간을 이루는 신뢰성 있는 전송 프로토콜입니다. SMTP를 통해 이메일을 보내거나, FTP나 SFTP를 통해 파일을 전송할 때, 데이터의 정확한 순서와 무결성은 TCP에 의해 보장됩니다. 이메일의 경우, 메시지 본문과 첨부 파일이 패킷으로 분할되어 네트워크를 통해 전송되는데, TCP는 이 모든 패킷이 손실 없이 올바른 순서로 수신측에 도착하도록 합니다. 파일 전송에서도 마찬가지로, 대용량 파일의 모든 바이트가 원본과 동일하게 재구성될 수 있도록 신뢰성 있는 연결을 제공합니다.
이러한 서비스들은 데이터의 일부라도 유실되면 전체 내용의 의미가 훼손될 수 있기 때문에 TCP의 연결 지향성과 신뢰성이 필수적입니다. 예를 들어, 이메일 첨부 파일이나 중요한 문서의 한 섹션이 누락된다면 그 파일은 쓸모없게 됩니다. TCP의 확인응답 및 재전송 메커니즘은 이러한 문제를 방지합니다. 또한, 흐름 제어를 통해 수신자의 처리 능력을 고려한 데이터 전송 속도를 조절함으로써, 수신 측 버퍼 오버플로우로 인한 데이터 손실을 막습니다.
프로토콜/서비스 | 주요 용도 | 의존하는 TCP 기능 |
|---|---|---|
이메일 발송 | 신뢰성 있는 데이터 스트림, 연결 관리 | |
이메일 수신 | 신뢰성 있는 데이터 스트림 | |
파일 전송 (제어 및 데이터 채널) | 별도의 연결을 통한 신뢰적 전송[7] | |
SFTP (SSH File Transfer Protocol) | 보안 파일 전송 | SSH 터널 내의 신뢰성 있는 전송 채널 |
파일 전송 프로토콜인 FTP는 두 개의 TCP 연결을 사용하는 특징이 있습니다. 하나는 명령어를 주고받는 제어 연결이고, 다른 하나는 실제 파일 데이터를 전송하는 데이터 연결입니다. 이 구조는 장시간 걸리는 대용량 파일 전송 중에도 사용자 명령(예: 전송 중단)을 즉시 처리할 수 있게 합니다. TCP는 이러한 복잡한 상호작용을 뒷받침하는 안정적인 통신 채널을 제공합니다. 요약하면, 이메일과 파일 전송은 데이터의 완전한 배달이 최우선인 전형적인 서비스로서, TCP의 핵심 가치를 가장 잘 보여주는 응용 사례입니다.
10. 한계와 대안
10. 한계와 대안
TCP는 수십 년간 인터넷의 핵심 전송 계층 프로토콜로 자리 잡았지만, 현대 네트워크 환경에서 특정 한계점이 부각되고 있습니다. 가장 큰 문제는 지연 시간입니다. TCP의 연결 지향성과 신뢰성 보장 메커니즘은 반드시 필요한 비용을 수반합니다. 3-way 핸드셰이크로 인한 연결 설정 지연, 혼잡 제어를 위한 초기 느린 시작 단계, 그리고 패킷 손실 시 발생하는 재전송 대기 시간 등이 누적되어 전체 응답 시간을 증가시킵니다. 이는 특히 지리적으로 멀리 떨어진 서버와 통신하거나, 짧은 데이터를 자주 교환하는 웹 애플리케이션에서 사용자 체감 성능을 저하시키는 주요 원인입니다.
또한, TCP는 기본적으로 혼잡 제어가 전송 계층에 통합되어 있어, 애플리케이션 계층에서의 유연한 제어가 어렵습니다. 헤드 오브 라인 블로킹 문제도 있습니다. TCP는 패킷의 전송 순서를 보장하기 때문에, 하나의 패킷이 손실되면 그 뒤의 패킷들이 애플리케이션에 전달되지 못하고 대기하게 되어 전체 스트림의 처리가 지연될 수 있습니다. 이는 멀티플렉싱이 필요한 현대 웹 환경에서 비효율을 초래합니다.
이러한 한계를 극복하기 위해 제안된 주요 대안은 구글이 주도하여 개발한 QUIC 프로토콜입니다. QUIC은 전송 계층과 보안 계층을 통합하고, UDP 위에서 동작합니다. 핵심 개선 사항은 다음과 같습니다.
특징 | TCP | QUIC |
|---|---|---|
연결 설정 지연 | 1-RTT (기본), 0-RTT는 별도 확장 필요[8] | 0-RTT (재연결 시) |
다중 스트림 지원 | 단일 스트림 | 내장된 멀티플렉싱, 독립적 스트림 |
헤드 오브 라인 블로킹 | 전송 계층에서 발생 | 스트림 수준에서만 격리 |
프로토콜 업그레이드 | 커널 업데이트 필요 | 사용자 공간에서 구현, 빠른 배포 가능 |
연결 이동성 | IP/포트 변경 시 연결 끊김 | 연결 ID를 사용하여 네트워크 변경 유지 |
QUIC은 특히 HTTP/3의 기반 프로토콜로 채택되면서 빠르게 보급되고 있습니다. 그러나 TCP는 여전히 광범위한 인프라와 애플리케이션에서 지원되며, QUIC이 모든 사용 사례를 대체하기는 어렵습니다. 따라서 단기적으로는 TCP의 성능을 개선하는 TCP BBR과 같은 새로운 혼잡 제어 알고리즘과 TCP 자체의 확장([9])이 병행되어 사용될 것으로 예상됩니다.
10.1. 지연 시간 문제
10.1. 지연 시간 문제
TCP는 신뢰성 있는 데이터 전송을 보장하지만, 이로 인해 발생하는 지연 시간은 실시간 통신이나 대역폭이 넓은 환경에서 주요한 한계점으로 작용합니다. 이 지연은 주로 연결 설정 과정, 혼잡 제어 알고리즘의 보수적 동작, 그리고 패킷 손실 시의 재전송 메커니즘에서 비롯됩니다.
가장 대표적인 지연 원인은 연결 설정을 위한 3-way 핸드셰이크입니다. 클라이언트와 서버가 데이터를 교환하기 전에 패킷을 세 번 왕복해야 하므로, 이 과정에서 최소 1.5 RTT(Round-Trip Time)의 지연이 필수적으로 발생합니다. 또한, 패킷 손실이 감지되면 TCP는 해당 패킷의 재전송을 기다리는 동안 전송을 멈추거나 크게 줄이는 방식을 취합니다. 이 현상을 헤드 오브 라인 블로킹이라고 부르며, 하나의 패킷 손실이 뒤따르는 모든 패킷의 전송 지연을 유발합니다.
혼잡 제어 방식도 지연에 영향을 미칩니다. TCP Reno나 CUBIC과 같은 전통적인 알고리즘은 패킷 손실을 네트워크 혼잡의 주요 신호로 간주하여 윈도우 크기를 급격히 줄입니다. 이는 혼잡을 효과적으로 완화하지만, 결과적으로 링크의 가용 대역폭을 충분히 활용하지 못하고 전송 속도 회복이 느려져 평균 처리량이 떨어지고 지연이 증가할 수 있습니다. 특히 무선 환경처럼 패킷 손실 원인이 혼잡이 아닌 경우에도 이러한 반응은 불필요한 성능 저하를 가져옵니다.
이러한 지연 문제를 해결하기 위해 다양한 대안 프로토콜이 제안되고 있습니다. 대표적으로 QUIC 프로토콜은 전송 계층에서 사용자 데이터그램 프로토콜을 기반으로 하여 연결 설정 시 지연을 크게 줄이고, 독립적인 스트림을 통해 헤드 오브 라인 블로킹 문제를 완화합니다. 또한, TCP의 혼잡 제어를 개선한 BBR과 같은 알고리즘은 패킷 손실 대신 지연 변화를 측정하여 대역폭을 더 효율적으로 활용하려는 시도를 보여줍니다.
10.2. QUIC 프로토콜
10.2. QUIC 프로토콜
QUIC는 구글에서 개발한 차세대 전송 계층 네트워크 프로토콜로, TCP와 TLS의 기능을 통합하고 최적화하여 웹 통신의 성능과 보안을 향상시키는 것을 목표로 합니다. 초기에는 "Quick UDP Internet Connections"의 약자였으나, 현재는 IETF에 의해 표준화된 독립적인 프로토콜로 자리 잡았습니다. QUIC의 가장 큰 특징은 UDP를 기반으로 한다는 점입니다. 이는 TCP의 핸드셰이크와 혼잡 제어로 인한 지연을 피하면서도, 애플리케이션 계층에서 TCP와 유사한 신뢰성, 순서 보장, 혼잡 제어, 보안 기능을 직접 구현함으로써 양쪽의 장점을 결합하려는 시도입니다.
주요 기술적 특징은 다음과 같습니다. 첫째, 연결 설정 시 TLS 1.3 이상의 암호화 핸드셰이크를 기본으로 통합하여, 대부분의 경우 TCP의 3-way 핸드셰이크와 TLS 협상을 결합한 단일 왕복(RTT)으로 연결을 수립할 수 있습니다. 이는 초기 연결 지연을 크게 줄입니다. 둘째, 연결 마이그레이션과 다중 스트림을 지원합니다. 단일 QUIC 연결 내에서 독립적인 여러 개의 논리적 데이터 스트림을 운영할 수 있어, 한 스트림에서의 패킷 손실이나 지연이 다른 스트림에 영향을 주지 않는 헤드 오브 라인 블로킹 문제를 애플리케이션 계층에서 해결합니다. 또한 사용자의 IP 주소가 변경되어도 연결 ID를 기반으로 연결을 유지할 수 있습니다.
QUIC는 주로 HTTP/3의 하위 전송 프로토콜로 사용됩니다. 기존의 HTTP/2가 TCP 위에서 동작할 때 발생하는 패킷 손실에 의한 성능 저하와 핸드셰이크 지연 문제를 해결하기 위해 채택되었습니다. 그러나 QUIC는 UDP를 사용하기 때문에, 일부 중간 네트워크 장비(방화벽, 라우터 등)에서 해당 트래픽을 차단하거나 제대로 처리하지 못할 수 있는 실무적 도전 과제도 존재합니다. 이러한 장벽을 넘어, QUIC는 모바일 환경과 같이 네트워크 상태가 자주 변하는 상황에서 더욱 빛을 발하며, 점차 많은 주요 CDN 및 웹 서비스에서 지원 범위를 확대하고 있습니다.
