Doctor Pepper

TCP 개념 및 원리 본문

자격증/CCNA

TCP 개념 및 원리

Doctor Pepper 2024. 10. 18. 13:52

 

네트워크 통신에서 TCP(Transmission Control Protocol)인터넷 프로토콜(IP)과 함께 가장 중요한 프로토콜 중 하나이다. TCP는 데이터가 정확하고 신뢰성 있게 전송되도록 보장하는 역할을 수행하며, 특히 패킷 손실이 발생할 수 있는 네트워크 환경에서 데이터 전송의 안정성을 제공한다.

 

1. TCP 기본 개념

 TCP전송 계층(Transport Layer)에 속하며, 데이터 전송의 신뢰성을 보장하기 위해 여러 기능을 수행한다. 이 기능에는 연결 설정, 흐름 제어, 오류 제어, 혼잡 제어가 포함된다. TCP는 데이터를 작은 단위인 패킷으로 나누어 전송하며, 각 패킷이 올바른 순서로 도착했는지, 누락되거나 손상된 패킷이 없는지를 확인한다.

연결 지향적
(Connection-Oriented)
TCP는 데이터를 전송하기 전에 송신자와 수신자 간에 연결을 설정함.
이 연결은 데이터 전송이 끝날 때까지 유지되며, 연결 종료 시 송신자와 수신자 간에 연결을 해제함.
신뢰성 보장
TCP는 패킷 손실, 오류, 중복 전송 등을 방지하기 위한 메커니즘임.
손실된 패킷이 발생하면 재전송을 요청하고, 데이터가 손상 여부 확인.
데이터 흐름 제어 송신자가 수신자의 처리 속도를 초과하는 데이터를 전송하지 않도록 흐름 제어(Flow Control)를 통해 송신 속도 조절.
혼잡 제어 네트워크 혼잡이 발생할 경우 이를 감지하고, 전송 속도를 낮추어 네트워크를 보호하는 혼잡 제어(Congestion Control)를 적용.

 

 

2. TCP 헤더

 응용 계층에서 전달된 데이터에 TCP 헤더를 추가하여 캡슐화한 것을 세그먼트라고 한다. TCP는 신뢰성을 보장하고 통신 효율을 최적화하기 위해 다양한 기능을 활용하며, 이러한 기능을 구현하기 위해 TCP 헤더에는 여러 제어 정보가 포함되어 있다.

 

- 출발지 포트 번호(Source Port), 목적지 포트 번호(Destination Port)

 출발지 포트 번호와 목적지 포트 번호는 각각 송신자와 수신자의 애플리케이션을 식별하는 16비트 필드이다. 클라이언트가 서버와 통신할 때, 클라이언트는 일정 범위 내에서 임의로 선택한 값을 출발지 포트 번호로 설정하고, 서버에서 실행 중인 특정 애플리케이션에 할당된 포트 번호를 목적지 포트 번호로 설정한다. 서버는 수신된 TCP 헤더의 목적지 포트 번호를 확인하여 어떤 애플리케이션으로 데이터를 전달할지 결정한다.

출발지 포트 번호
(Source Port)
송신자의 포트 번호를 나타냄.
TCP는 여러 애플리케이션이 동시에 데이터를 전송할 수 있도록 포트 번호를 사용함.
이 필드는 송신자 애플리케이션을 구분하는 역할을 함.
목적지 포트 번호
(Destination Prot)
데이터를 받을 수신자의 포트 번호를 나타냄.
출발지 포트와 마찬가지로 목적지 포트는 수신자의 애플리케이션을 식별하는 역할을 함.
이 필드를 통해 데이터를 받을 정확한 프로그램 또는 프로세스를 지정함.

 

- 시퀀스 번호(Sequence Number)

 시퀀스 번호는 TCP 세그먼트에서 데이터가 전체 흐름 중 어디에 위치하는지를 나타내는 32비트 필드이다. 송신 측은 애플리케이션으로부터 받은 데이터를 바이트 단위로 나누어 각 바이트에 일련번호를 부여한다. 처음 전송되는 데이터에는 초기 시퀀스 번호(ISN)가 할당되며, 이후 송신된 데이터의 바이트 수만큼 시퀀스 번호가 계속 증가한다. 이를 통해 수신자는 데이터의 순서를 파악하고 손실된 데이터가 있는지 확인할 수 있다.

시퀀스 번호
(Sequence
Number)
송신한 데이터의 바이트 순서를 추적하는 데 사용되는 번호임.
TCP는 전송한 데이터를 작은 단위(세그먼트)로 나누어 전송하는데, 각 세그먼트에 시퀀스 번호가 부여됨.
시퀀스 번호는 송신자가 전송하는 첫 번째 바이트의 위치를 나타내며, 수신자는 이를 통해 데이터가 올바른 순서로 도착했는지 확인할 수 있음.

 

- 확인 응답 번호(Acknowledgment Number)

 확인 응답 번호는 다음에 수신할 데이터의 시퀀스 번호를 나타내는 32비트 필드로, 수신한 데이터의 시퀀스 번호에 수신한 데이터의 크기(바이트 수)를 더한 값이 설정된다. 이 번호는 수신자가 송신자에게 마지막으로 성공적으로 수신한 바이트의 다음 시퀀스 번호를 알려주는 역할을 한다. 예를 들어, 수신자가 1000번째 바이트까지 수신했다면, 다음에 받을 바이트의 번호인 1001이 확인 응답 번호로 설정된다. 이를 통해 송신자는 데이터가 정상적으로 전달되었는지 확인할 수 있으며, 만약 데이터가 손실되었다면 재전송을 요청할 수 있다.

 

- 데이터 오프셋(Data Offset)

 데이터 오프셋은 TCP 헤더의 길이를 나타내는 4비트 필드로, 헤더의 크기를 32비트(4바이트) 단위로 계산한 값이 들어간다. 이 필드는 TCP 헤더에 있는 선택적 필드의 길이를 포함한 헤더의 총 크기를 나타낸다. 옵션이 없는 기본적인 TCP 헤더는 20바이트이므로, 데이터 오프셋 필드의 값은 5(5 x 4 = 20)로 설정된다. IP 헤더의 길이 필드와 마찬가지로, 데이터 오프셋 필드는 TCP 헤더 자체의 크기를 명확하게 정의한다.

 

- 예약(Reserved)

 TCP의 확장성을 고려해 마련된 3비트 예약 필드는 현재는 사용되지 않으며, 항상 0으로 설정되어 있다. 이는 미래에 추가 기능을 구현할 가능성을 염두에 두고 남겨둔 공간이다.

 

- 제어 플래그(Control Bits)

 제어 플래그는 TCP 연결 상태를 제어하기 위한 9비트 필드로, 각 비트는 특정 동작을 나타내며 다양한 상태를 표현하는 9개의 플래그로 구성되어 있다. 각 비트는 1 또는 0으로 설정되며, 연결 설정, 종료 및 데이터 전송 과정에서 사용된다. 예를 들어, 연결을 설정하기 위해 처음 보내는 SYN 패킷의 경우, 8번째 비트가 1로 설정된 TCP 세그먼트를 전송하게 된다.

SYN
(Synchronize
Flag)
커넥션 설정에 사용됨
SYN 플래그가 1이면 커넥션 설정 목적을 나타냄.
Synchronize는 동기화라는 뜻으로 송신 측과 수신측은 시퀀스 번호와 확인 응답 번호를 동기화함
ACK
(Acknowledge-
ment Flag)
환인 응답에 사용됨
ACK 플래그가 1이면 확인 응답 번호 필드에 값이 들어 있음을 나타냄
커넥션을 설정하는 첫 번째 SYN 패킷 이외의 TCP 세그먼트에서는 항상 ACK 플래그가 1로 되어 있음
FIN
(Fin Flag)
커넥션 종료에 사용됨
FIN 플래그가 1이면 데이터 전송이 끝났고, 커넥션을 끊고 싶다는 목적을 나타냄
통신이 종료되어 커넥션을 끊을 경우, 양쪽에서 FIN 플래그에 1이 설정된 TCP 세그먼트를 교환하고 서로 확인 응답을 보내면 커넥션이 끊어짐
URG
(Urgent)
긴급 데이터가 포함되어 있음을 나타냄
이 플래그가 설정되면 긴급 포일터 필드에 지정된 데이터가 우선적으로 처리됨

 

- 윈도우 크기(Window Size)

 윈도우 크기는 수신 가능한 데이터 크기를 알리기 위한 16비트 필드로, 단말기가 한 번에 수신할 수 있는 데이터의 양(바이트 수)을 나타낸다. 이 필드를 통해 흐름 제어가 이루어지며, 송신자는 상대방이 알려준 윈도우 크기보다 큰 데이터를 보내지 않도록 조정한다. 수신자는 이 값을 기반으로 데이터를 전송할 수 있는 속도를 조절하며, 만약 수신자의 버퍼에 여유 공간이 적다면 윈도우 크기를 줄여 송신자가 데이터를 천천히 보내도록 한다.

 

- 체크섬(Checksum)

 체크섬은 수신한 TCP 세그먼트의 일관성을 확인하기 위한 16비트 필드로, IPv4 헤더의 체크섬과 유사한 방법으로 계산된 값을 포함한다. 이 필드는 TCP 세그먼트의 데이터와 헤더가 전송 중 손상되지 않았는지 확인하는 데 사용된다. 송신자는 데이터와 헤더에 대한 체크섬 값을 계산해 이 필드에 넣고, 수신자는 받은 데이터를 다시 계산하여 손상 여부를 판단한다. 만약 체크섬 값이 일치하지 않으면 해당 세그먼트가 손상된 것으로 판단하고 재전송을 요청한다.

 

- 긴급 포인터(Urgent Pointer)

 긴급 포인터는 제어 플래그의 URG가 1인 경우에만 유효한 16비트 필드로, 긴급 데이터를 나타내는 시퀀스 번호가 설정된다. URG 플래그가 설정된 경우, 이 포인터는 긴급 데이터의 끝을 나타내며, 긴급 데이터는 일반적인 데이터보다 우선 처리된다. 따라서 수신자는 이 포인터를 통해 긴급 데이터의 위치를 파악할 수 있다.

 

- 옵션(Options)

 옵션은 TCP 통신의 성능 향상을 목적으로 사용되는 확장 기능 필드로, 크기가 가변적이며 32비트 단위로 변동힌다. TCP는 기본적인 헤더 외에도 추가 기능을 제공하기 위해 옵션 필드를 포함할 수 있으며, 대표적인 옵션으로는 MSS(Maximum Segment Size)가 있다. MSS는 한 번에 전송할 수 있는 최대 세그먼트 크기를 설정하는 데 사용되며, 이 필드는 선택적으로 사용된다. 옵션 필드가 존재하지 않을 경우, 기본 TCP 헤더 크기는 20바이트이다.

 

- 패딩(Padding)

 패딩은 TCP 헤더의 크기를 32비트(4바이트) 단위로 조정하기 위해 사용되는 필드로, 빈 데이터를 나타내는 0이 설정된다. TCP 프로토콜은 특정 크기(4바이트)의 경계에 맞춰 데이터와 헤더를 정렬하는 것을 선호하기 때문에 패딩이 필요하다. 이를 통해 데이터 전송의 효율성을 높이고, 특정 아키텍처의 요구 사항에 부합하는 방식으로 데이터를 처리할 수 있다.

 

3. TCP 커넥션

- TCP 커넥션

TCP에서는 통신을 시작할 때, 통신하는 단말기의 애플리케이션 사이에 TCP 커넥션이라는 논리적 경로를 설정한다. 양쪽 애플리케이션 사이에 직통 파이프를 준비해서 데이터를 주고받는다고 생각하면 된다. TCP에서는 커넥션이 설정된 후, 커넥션을 이용해 통신한다. 통신이 모두 끝나면 커넥션을 닦고 통신을 종료한다.

 

- 커넥션 설정

TCP 커넥션에서는 3-웨이 핸드셰이크(3-way handshake)로 커넥션을 설정한다. 이 과정은 클라이언트와 서버 간의 신뢰할 수 있는 연결을 보장하며, 데이터 통신을 시작하기 전에 양측이 서로의 존재와 연결 가능성을 확인한다. 

SYN
(Synchronize)
클라이언트가 서버에 연결 요청을 보내기 위해 SYN 패킷을 전송함
이 패킷에는 클라이언트의 초기 시퀀스 번호가 포함됨
이 단계에서 클라이언트는 서버와의 연결을 설정하기 위한 의사를 전달함
SYN-ACK
(Synchronize
-Acknowledge)
서버는 클라이언트의 SYN 패킷을 수신한 후, 연결 요청을 수락하는 ACK 패킷과 클라이언트에게 자신의 초기 시퀀스 번호를 포함한 SYN 패킷을 동시에 전송함
이 패킷은 클라이언트의 SYN 패킷에 대한 응답으로, 클라이언트의 요청을 수용했음을 알리고, 서버 측에서도 연결을 위한 초기 시퀀스 번호를 설정함 
ACK
(Acknowledge)
클라이언트는 서버의 SYN-ACK 패킷을 수신한 후, 서버의 SYN 패킷을 ACK 패킷으로 응답함
이 단계에서 클라이언트는 서버의 연결 수락을 확인하며, 이제 클라이언트와 서버는 서로의 초기 시퀀스 번호를 알고 있음

 

4. 데이터 송신 기능

- 확인 응답과 재전송 제어

 TCP에서는 수신 측이 데이터를 수신하면 송신 측에 해당 데이터가 수신되었음을 알려주는 확인 응답(ACK)을 전송한다. TCP 헤더에서 명시된 확인 응답 번호를 통해 송신 측은 자신이 보낸 데이터 중 상대방이 어디까지 수신했는지를 확인할 수 있다. 만약 확인 응답이 돌아오지 않으면, 데이터가 중간에 유실되었을 가능성이 있다.

 

 일정 시간 동안 확인 응답이 돌아오지 않으면, 송신 측은 데이터를 재전송하게 된다. 이 과정을 재전송 제어라고 한다. 재전송 제어는 두 가지 방법, 즉 중복(Duplicate) ACK재전송 타임아웃을 통해 재전송이 필요한지 판단한다.

  • 중복 ACK: 수신 측에서 동일한 확인 응답 번호를 가진 ACK 패킷이 여러 번 수신되는 경우를 말한다. 이는 수신 측에서 일부 시퀀스 번호가 누락된 경우 발생하며, 수신한 데이터까지의 확인 응답을 연속해서 반환한다. 송신 측에서는 동일한 ACK 패킷이 여러 번 반환될 경우, 재전송이 필요하다고 인지하고 해당 패킷을 재전송한다.

 

  • 재전송 타임아웃: 송신 측에서 일정 시간 내에 ACK가 돌아오지 않을 경우, 송신한 시퀀스 번호에 대한 확인 응답이 없었다고 판단하여 패킷을 재전송한다. 재전송 타임아웃까지의 시간을 재전송 타이머라고 한다.

 

 일반적으로 재전송 타임아웃을 통한 재전송 제어보다 중복 ACK를 통한 재전송 제어가 더 빠르기 때문에, 중복 ACK를 이용한 재전송 제어는 고속 재전송 제어라고 부른다.

 

- 윈도우 제어

 TCP에서는 각 세그먼트마다 확인 응답(ACK)을 받아야 한다. 그러나 이렇게 매번 확인 응답을 받고 다음 패킷을 전송하는 방식으로 데이터를 전송하면, 모든 데이터를 완전히 전송하는 데 시간이 많이 소요된다.

 

 따라서 TCP는 한 세그먼트마다 응답을 기다리는 대신, 여러 세그먼트를 연속으로 전송하고 수신 측에서 이들 세그먼트에 대한 확인 응답을 한꺼번에 반환하는 방식을 채택하고 있다. 이를 통해 통신 효율성을 높일 수 있다.

 

 한 번에 보낼 수 있는 데이터 양을 윈도우 크기라고 한다. 윈도우 크기는 수신 측이 송신 측에게 TCP 헤더의 윈도우 크기 필드를 통해 한 번에 수신할 수 있는 데이터 양을 3-웨이 핸드셰이크 과정 중에 알려준다. 이 윈도우 크기를 활용하여 송수신할 데이터 양을 제어하는 방법을 윈도우 제어라고 한다.

 

 윈도우 제어를 통해 송신 측은 수신 측의 수신 가능 용량을 고려하여 효율적으로 데이터를 전송할 수 있으며, 이는 TCP의 전송 성능을 향상시키는 중요한 요소이다.

 

- 흐름 제어

 데이터를 송신하는 측에서는 자신의 애플리케이션 상황에 맞게 데이터를 전송한다. 그러나 수신할 수 없는 양의 데이터가 전송되면, 수신 측에서 처리가 과중해지고 패킷 손실이 발생할 수 있다.

 

 이를 방지하기 위해 수신 측은 TCP 헤더 내의 윈도우 크기 필드를 통해 그 시점에서 수신할 수 있는 데이터 허용량을 송신 측에 알려준다. 송신 측은 3-웨이 핸드셰이크 과정에서 통보된 상대방의 윈도우 크기에 따라 데이터를 전송하다가, 새로운 윈도우 크기가 통보되면 더 이상 데이터를 보내지 않고 확인 응답(ACK)을 기다린다.

 

 이렇게 수신 측의 윈도우 크기에 맞춰 데이터 전송량을 조절하는 과정을 흐름 제어라고 한다. 흐름 제어를 통해 송신 측은 수신 측의 처리 능력에 맞춰 데이터를 전송함으로써, 패킷 손실을 방지하고 통신의 안정성을 높일 수 있다.

'자격증 > CCNA' 카테고리의 다른 글

DNS(Domian Name System)  (1) 2024.10.18
UDP 개념 및 원리  (2) 2024.10.18
라우팅(Routing)  (3) 2024.10.17
서브넷 마스크(Subnet mask)  (1) 2024.10.17
TCP/IP 주소 표현  (0) 2024.10.16