
TCP(Transmission Control Protocol)는 네트워크 핵심 프로토콜 중 하나로, 신뢰성 있는 데이터 전송을 보장한다. 이 프로토콜은 네트워크 연결 지향적이며, 데이터 패킷의 순서를 보장하고 오류를 검출하여 재전송하는 기능을 제공한다.
TCP 헤더는 데이터 전송의 제어와 관리를 위한 중요한 정보를 포함하고 있다.
주요 필드로는 출발지 포트, 목적지 포트, 시퀀스 번호, 확인 응답 번호, 데이터 오프셋, 예약 필드, 제어 비트(플래그), 윈도우 크기, 체크섬, 긴급 포인터 등이 있다.
이러한 필드들은 TCP 연결의 설정, 유지, 종료 및 데이터의 신뢰성 있는 전송을 가능하게 한다.

SEQ 와 ACK 번호를 통해 데이터의 순서를 유지하고, 손실된 패킷을 감지하여 재 전송을 요청할 수 있다.
TCP 헤더는 연결의 상태와 패킷의 목적을 나타낸다. 주요 TCP 플래그는 다음과 같다.
클라이언트 서버
| |
| SYN (seq=x) |
|-------------------------------->|
| |
| SYN-ACK (seq=y,ack=x+1) |
|<--------------------------------|
| |
| ACK[+data] (seq=x+1,ack=y+1) |
|-------------------------------->|
| |
| (연결 설정 완료) |
| |
이렇게 3-way handshake를 통해 TCP 연결이 설정되면, 클라이언트와 서버는 안정적인 양방향 통신 채널을 확보하게 된다. 이 연결을 통해 데이터를 주고받을 수 있으며, 각 패킷의 순서와 전달 여부를 확인할 수 있다. 연결이 더 이상 필요하지 않을 때는 4-way handshake를 통해 연결을 종료하게 된다.
클라이언트 서버
| |
| FIN (seq=u) |
|--------------------->|
| |
| ACK (ack=u+1) |
|<---------------------|
| |
| FIN (seq=v) |
|<---------------------|
| |
| ACK (ack=v+1) |
|--------------------->|
| |
| 연결 종료 완료 |
| |
FIN (Finish): 클라이언트가 연결 종료를 요청
ACK: 서버가 클라이언트의 종료 요청을 확인
FIN: 서버가 연결 종료 준비를 마치고 종료를 요청
ACK: 클라이언트가 서버의 종료 요청을 확인
handshake 과정을 통해 TCP는 신뢰성 있는 연결 설정과 종료를 보장한다.
각 단계에서 시퀀스 번호와 확인 응답을 사용하여 데이터의 순서와 전송을 정확히 관리한다.
흐름제어란 송신자와 수신자 간의 데이터 전송 속도를 조절하여 수신자의 버퍼 오버플로우를 방지하는 중요한 메커니즘이다.
TCP는 네트워크의 효율성을 높이고 데이터 손실을 최소화하기 위해 여러 흐름 제어 방식을 사용한다. 그 중 대표적인 것이 Stop-and-Wait 방식과 윈도으 크기를 활용한 방식이다.
Stop-and-Wait은 가장 단순한 흐름 제어 방식으로, 송신자가 하나의 패킷을 보내고 수신자의 확인(ACK)을 받을 때까지 기다리는 방식이다.

이 방식은 간단하지만 응답이 돌아올 때 까지 계속해서 대기하는 상황이 발생하고 이로 인해 네트워크 자원을 비효율적으로 사용하며, 특히 긴 지연시간을 가진 네트워크에서 성능이 떨어진다.
확인 응답을 기다리지 않고 서로 약속했던 윈도우 크기 만큼의 패킷을 한번에 전달하는 방식이다.
윈도우 크기는 확인 응답을 기다리지 않고 한 번에 전송할 수 있는 데이터의 양을 나타낸다. 이를 통해 네트워크 자원을 더 효율적으로 사용할 수 있다.
TCP의 표준 구현에서 이 기능은 기본적으로 활성화되어 있어 대부분의 TCP 연결에서 자동으로 사용된다. 이는 인터넷 프로토콜 스택의 핵심 요소로, 신뢰성 있는 데이터 전송과 효율적인 네트워크 사용을 동시에 달성하는 데 중요한 역할을 한다.

윈도우 크기를 사용하면 여러 패킷을 연속으로 전송할 수 있어, 네트워크 지연 시간을 효과적으로 활용할 수 있다. 이는 특히 대역폭이 크고 지연시간이 긴 네트워크에서 큰 성능 향상을 가져온다.
반드시 그렇지는 않다. 사이즈가 너무 크면 네트워크 혼잡이 발생할 수 있고, 패킷 손실 시 재전송해야 할 데이터의 양이 증가하여 오히려 성능이 저하될 수 있다. 따라서 네트워크 상황과 수신자의 처리 능력을 고려한 적절한 윈도우 설정이 중요하다.
ARG는 TCP가 사용하는 오류 제어 메커니즘으로, 데이터 전송의 신뢰성을 보장하는 데 중요한 역할을 한다. 이 방식은 흐름 제어와 밀접하게 연관되어 있으며 다음과 같은 특징을 가진다.
TCP는 주로 Selective Repeat ARQ와 유사한 방식을 사용하여 효율적인 데이터 전송과 오류 복구를 수행한다. 이는 윈도우 기반 흐름 제어와 결합되어 네트워크 자원을 최적화하고 신뢰성 있는 데이터 전송을 보장한다.
네이글 알고리즘은 TCP 연결에서 작은 패킷들의 과도한 전송을 줄이기 위해 설계된 알고리즘이다. 이 알고리즘은 다음과 같은 방식으로 작동한다.
MSS : TCP 세그먼트로 보낼 수 있는 최대 크기. 즉 페이로드의 크기네이글 알고리즘의 주요 목적은 네트워크 효율성을 높이고 불필요한 패킷 오버헤드를 줄이는 것이다. 그러나 실시간 애플리케이션에서는 지연을 유발할 수 있어 필요에 따라 비활성화 할 수 있다.
네이글 알고리즘은 주로 대화형 애플리케이션이나 작은 데이터를 자주 전송하는 애플리케이션에 유용하다. 그러나 실시간 게임이나 스트리밍 서비스와 같이 즉각적인 응답이 중요한 경우엔 오히려 성능을 저하시킬 수 있다.
TCP의 혼잡제어는 네트워크의 과부하를 방지하고 전체 네트워크의 효율성을 유지하기 위한 중요한 메커니즘이다. 혼잡제어는 네트워크의 상태를 지속적으로 모니터링하고 네트워크 혼잡 상황에 따라 데이터 전송 속도를 조절한다.
이러한 알고리즘들은 TCP가 네트워크 상황에 동적으로 대응하여 효율적인 데이터 전송을 가능하게 한다. 혼잡제어는 개별 TCP 연결의 성능뿐만 아니라 전체 네트워크의 안정성과 효율성을 향상시키는데 중요한 역할을 한다.
흐름제어는 송신자와 수신자간의 데이터 전송 속도를 조절하여 수신자의 처리 능력을 초과하지 않도록 하는 반면, 혼잡제어는 전체 네트워크의 부하를 관리하여 네트워크 혼잡을 방지한다. 흐름제어는 엔드포인트 간의 문제를, 혼잡제어는 네트워크 전체의 문제를 다룬다.