ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 02. TCP & UDP (3) - TCP 세부 - 연결 설정, 헤더, 상태, 제어 등
    네트워크 Network 2024. 10. 9. 00:17

     

    안녕하세요!

    현재 TCP와 UDP에 대한 내용을 다루고 있으며 다섯 개의 섹션으로 진행 중 입니다.

    순서는 아래와 같습니다.

     

    1. Data에 대한 이해

    2. OSI 7 Layer의 Protocol인 TCP와 TCP/IP의 TCP는 같은가?

    3. TCP 알아보기

    4. UDP 알아보기

    5. 비교 및 정리 (왜 쓰는가, 어디에 쓰이는가, 무엇을 하는가, 어떻게 쓰는가)


     

    이번 시간에는 TCP에 대한 내용들을 정리해보았는데요. 양이 방대한 만큼 더 공부가 필요한 것 같습니다. 
    TCP(Transmission Control Protocol)는 IP 프로토콜 상에서 동작하며, 데이터가 신뢰성 있게 전송되도록 보장하는 역할을 합니다. TCP의 역할은 결국  네트워크 성능 향상, 보안 문제 해결, 대규모 네트워크 환경에서의 최적화 등과 관련되어 있다는 점을 기억합시다.

     

    목차는 아래와 같습니다.

    01. TCP의 주요 특징

    02. 헤더 구조

    03. 헤더 Flag

    04. 연결 설정 및 종료 + 재전송 기능

    05. 상태(State)

    06. TCP 흐름 제어

    07. TCP 혼잡 제어 알고리즘

    08. TCP의 문제점 및 한계

    09. TCP 세션 분석

    10. TCP 관련 보안 이슈

    추가정보


     

    01. TCP의 주요 특징

    - 연결 지향(Connection-Oriented): TCP는 데이터를 전송하기 전에 송신자와 수신자 사이에 연결을 설정합니다. 연결이 성립된 후에만 데이터 전송이 이루어집니다.

    - 신뢰성 있는 전송(Guaranteed Delivery): TCP는 데이터가 손실되지 않도록 보장하며, 순서대로 데이터가 도착하도록 재전송 및 패킷 정렬 기능을 제공합니다.

    - 흐름 제어(Flow Control): 송신 측이 너무 빠르게 데이터를 보내 수신 측이 이를 처리하지 못하는 상황을 방지합니다.

    - 혼잡 제어(Congestion Control): 네트워크 혼잡을 감지하여 패킷 전송 속도를 조절함으로써 네트워크 부하를 줄이는 역할을 합니다.

     

    02. TCP 헤더 구성

     

    03. TCP Flag

    TCP 헤더에 포함된 플래그는 다음과 같은 역할을 합니다:

    SYN (Synchronize): 연결 설정을 위해 사용됩니다. 3-Way Handshake 과정에서 첫 번째 패킷에 설정됩니다.
    ACK (Acknowledgment): 수신 확인을 위해 사용됩니다. 데이터 수신 후 ACK 번호를 통해 송신자에게 응답합니다.
    FIN (Finish): 연결 종료를 요청하는 데 사용됩니다. 송신자가 데이터 전송을 완료하고 연결을 닫고 싶을 때 설정됩니다.
    RST (Reset): 비정상적인 연결을 리셋하는 데 사용됩니다. 연결 설정에 문제가 있을 때 사용됩니다.
    PSH (Push): 수신자가 즉시 애플리케이션 레벨로 데이터 처리를 시작하도록 요청합니다.
    URG (Urgent): 긴급 데이터를 전송할 때 사용됩니다. 이 경우 Urgent Pointer를 통해 긴급 데이터의 위치를 지정합니다.

     


     

    04. TCP 연결 설정 및 종료 + 재전송 기능

    !! 3-Way Handshake (삼중 핸드셰이크): 연결을 설정할 때 TCP는 다음과 같은 절차를 거칩니다.

    1. SYN: 클라이언트가 연결 요청(SYN)을 보냅니다.

    2. SYN-ACK: 서버가 연결 요청을 수락하고 응답(SYN-ACK)을 보냅니다.

    3. ACK: 클라이언트가 확인 응답(ACK)을 보내면 연결이 성립됩니다.

     

    아래는 상세한 과정입니다. 

    더보기

    TCP의 연결 설정을 위한 3-way Handshaking
    클라이언트와 서버 간에 신뢰성 있는 연결을 설정하기 위한 세 단계의 절차이다.
    두 호스트 간 세 개의 세그먼트 교환

    1. Client -> Server: TCP SYN (Synchronize)
    클라이언트 측 TCP는 서버 TCP에게 애플리케이션 계층 데이터를 포함하지 않는, 특별한 TCP 세그먼트를 송신한다. (특별한 세그먼트 -> SYN 세그먼트라 부름)  
    단, 세그먼트의 헤더에 SYN 비트라고 불리는 하나의 플래그 비트를 1로 설정한다. 

    추가로 클라이언트는 최초의 순서 번호(client_isn)를 임의로 선택하고, 
    최초의 TCP SYN 세그먼트의 순서 번호 필드에 이 번호를 넣는다.
    이 세그먼트는 IP 데이터그램(네트워크 계층 패킷) 안에서 캡슐화되고 서버로 송신된다.

    즉, 클라이언트가 서버에게 연결을 요청하기 위해 SYN 플래그가 설정된 TCP 세그먼트를 전송하는데, 
    이때 클라이언트는 초기 시퀀스 번호를 랜덤하게 선택하여 전송한다.

    2. Server -> Client: TCP SYN+ACK (Synchronize-Acknowledge)
    TCP SYN 세그먼트를 포함하는 IP 데이터그램이 서버 호스트에 도착하면, 
    서버는 데이터그램으로부터 TCP SYN 세그먼트를 추출한 다음, 연결에 대한 TCP 버퍼와 변수를 할당한다. 
    클라이언트 TCP로 연결 승인 세그먼트를 송신하는데, 이 연결 승인 세그먼트도 애플리케이션 계층 데이터를 포함하지 않는다.

    그러나 세그먼트 헤더 안에 3개의 중요한 정보를 포함한다.
    SYN 비트는 1로 설정된다.
    TCP 세그먼트 헤더의 확인응답 필드는 client_isn+1로 설정된다.
    동시에 서버는 자신의 최초의 순서 번호(server_isn)를 선택하고, TCP 세그먼트 헤더의 순서 번호 필드에 이 값을 넣는다. 
    이 연결 승인 세그먼트는 
    “나는 당신의 최초 순서 번호 client_isn을 가지고 연결을 시작하자는 당신의 SYN 패킷을 수신했다. 
    나는 이 연결 설정에 동의한다. 
    나 자신의 최초의 순서 번호는 server_isn이다.” 
    라는 의미이다. 
    이 연결 승인 세그먼트를 SYN+ACK segment라 부른다.

    3. Client -> Server: TCP ACK (Acknowledgment)
    연결 승인 세그먼트를 수신하면, 클라이언트는 연결에 대한 버퍼와 변수를 할당한다.
    이후, 클라이언트 호스트는 서버로, 서버의 연결 승인 세그먼트를 확인하는 또 다른 세그먼트를 송신한다.
    여기서 클라이언트는 TCP 세그먼트 헤더의 확인응답 필드 안에 server_isn+1 값을 넣어 ACK를 생성한다.
    연결이 설정되었기 때문에 SYN 비트는 0으로 설정된다. 
    세 번째 단계는 클라이언트에서 서버로의 데이터를 세그먼트 페이로드에서 운반할 수 있다.

    즉, 클라이언트는 서버에게 ACK 플래그가 설정된 TCP 세그먼트를 전송하여 서버의 응답을 확인한다.
    클라이언트는 서버의 초기 시퀀스 번호에 1을 더한 값을 자신의 초기 시퀀스 번호로 선택한다.
    이로써 연결이 설정되었고, 양쪽은 이후의 데이터 전송을 위해 서로에게 대기 상태로 진입한다.

    3-way Handshake 상태 요약

    더보기

    TCP는 연결 지향적인 프로토콜로 통신의 시작, 종료에 별도의 과정을 따른다.
    TCP 연결 초기화 : 3-way Handshake 요약

    클라이언트와 서버 양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제로 데이터 전달이 시작하기 전에 한쪽이 다른 쪽이 준비되었다는 것을 알 수 있도록 하는 과정이다. 

    1. A 클라이언트는 B 서버에 접속을 요청하는 SYN 패킷을 보낸다. 
    2. 이때 A 클라이언트는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 된다.
    3. B 서버는 SYN 요청을 받고 A 클라이언트에게 요청을 수락한다는 ACK 와 SYN flag 가 설정된 패킷을 발송하고
        A가 다시 ACK로 응답하기를 기다린다. 이때 B 서버는 SYN_RECEIVED 상태가 된다.

    4. A 클라이언트는 B 서버에게 ACK를 보내고 (이후, 클라이언트는 ESTABLISHED 상태가 된다.)
        B 서버가 이를 수신한 이후,
    연결이 이루어지고 데이터가 오가게 된다. 
        이때의 B 서버의 상태는 ESTABLISHED 로 변경된다.

     

     

    !! 4-Way Handshake (연결 종료): 연결을 종료할 때는 4단계를 거칩니다.

    1. FIN: 한 쪽이 연결 종료(FIN) 요청을 보냅니다.

    2. ACK: 상대방이 그 요청을 확인(ACK)합니다.

    3. FIN: 상대방도 연결 종료(FIN) 요청을 보냅니다.

    4. ACK: 처음 연결 종료를 요청한 쪽이 확인(ACK) 응답을 보내며 연결이 종료됩니다.

     

    아래는 상세한 과정입니다. 

    더보기

    TCP 연결 해제 : 4-way Handshake
    클라이언트는 연결 종료를 원하면 FIN(종료) 플래그가 설정된 패킷을 서버에게 전송한다. 
    클라이언트는 FIN_WAIT_1 상태가 된다.
    서버는 FIN을 받으면, 확인 응답(ACK)을 클라이언트에게 보내고, 서버도 연결을 종료하기 위해 FIN 플래그가 설정된 패킷을 전송한다. 
    서버는 CLOSE_WAIT 상태가 된다.
    클라이언트는 서버로부터 받은 FIN에 대한 확인 응답(ACK)을 보내고, 더 이상 보낼 데이터가 없다면 FIN을 보낸다. 

    클라이언트는 FIN_WAIT_2 상태로 바뀐다. 
    클라이언트는 이 상태에서 서버로부터 받은 데이터를 확인하며 대기한다.
    서버는 클라이언트로부터 받은 ACK를 기다렸다가 확인 응답(ACK)을 보내고, 서버는 LAST_ACK 상태가 된다. 
    서버는 클라이언트로부터 받은 FIN에 대한 확인 응답을 확인하여 모든 데이터가 안전하게 전송되었음을 확인한다.
    클라이언트는 LAST_ACK 상태에서 서버로부터 받은 ACK를 확인하고, 이후 TIME_WAIT 타이머를 시작한다. 
    TIME_WAIT 상태는 마지막 ACK가 분실되었을 경우에 대비하여 대기하는 시간을 제공한다. 
    TIME_WAIT 타이머가 만료되면 클라이언트는 CLOSED 상태가 된다. 
    클라이언트는 서버의 연결 종료 요청에 대한 최종 응답을 마치고 연결이 완전히 종료된다.

     

    !! TCP의 재전송 기능 - 타임 아웃 이벤트 (Time Out)

    TCP에서는 재전송 정책에 따라 세그먼트를 일정 시간 동안 기다리다가(타임아웃), 일정 횟수만큼 타임아웃을 일으킨 세그먼트를 재전송하는 것으로 응답합니다. 
    (타임아웃 타이머는 다시 시작, 타임아웃이 발생할 때마다 재전송 간격은 지수적으로 증가할 수 있음.)

     

    다음과 같은 상황에서 타임아웃이 발생할 수 있습니다.
    1. ACK가 도착하지 않은 경우 : 

    송신 측이 세그먼트를 전송하고, 수신 측이 해당 세그먼트를 받았음에도 불구하고 ACK가 일정 시간 내에 송신 측에 도달하지 않을 경우, 송신 측에서는 해당 세그먼트의 재전송을 수행한다. 
    2. 3-way handshake에서 SYN, SYN/ACK 세그먼트 도중 손실된 경우 : 

    클라이언트가 SYN 세그먼트를 서버에게 보내고, 서버에서 SYN/ACK 세그먼트를 클라이언트에게 보냈으나 어느 한 쪽에서 세그먼트가 손실된 경우, 해당 세그먼트의 재전송이 이루어진다.

    TCP 구현에서는 타임아웃 주기에 대한 값이 설정되어 있습니다.  
    이 값은 일반적으로 round-trip time(RTT)의 여유분을 고려하여 동적으로 조절되는데요.
    RTT는 세그먼트를 전송한 후 해당 세그먼트에 대한 ACK를 받을 때까지의 시간을 나타냅니다.

    재전송 정책 : TCP는 세그먼트의 손실이나 지연에 대응하여 안정적인 데이터 전송을 보장

     

    RTO (Retransmission Timeout): RTO는 세그먼트를 재전송하기 위한 타임아웃 값입니다. 
    타임아웃이 발생하면 해당 세그먼트를 재전송합니다.
    RTO 값은 초기에는 라운드트립 타임(RTT)의 추정치로 설정되며, 이후에는 RTT 측정을 통해 동적으로 조절됩니다.
    두 번째 이후로는 Exponential Backoff 기법을 사용하여 재전송 간격이 2배씩 증가합니다.
    많은 TCP 구현에서는 일반적으로 타임아웃이 발생한 세그먼트에 대해 두 번까지만 재전송을 시도합니다.

     

    * Exponential Backoff : 재전송 간격이 2배씩 증가하는 지수 백오프(exponential backoff) 기법을 적용. 
    이는 네트워크 혼잡이나 다른 문제로 인한 세그먼트 손실에 대응하기 위함이다.
    * Fast Retransmit(빠른 재전송) : 일부 구현에서는 세그먼트 손실을 빠르게 감지하기 위해 Fast Retransmit 기법을 사용한다. 이는 중복 ACK가 도착하면 송신 측에서 바로 해당 세그먼트를 재전송하는 방식이다.

     


     

    05. TCP 상태(State)

    TCP는 여러 가지 상태를 가질 수 있으며, 연결의 흐름을 따라가는 과정에서 상태가 변화합니다.

    - LISTEN: 서버가 클라이언트의 연결 요청을 대기 중인 상태

    - SYN-SENT: 클라이언트가 SYN 패킷을 보내고 응답을 기다리는 상태

    - SYN-RECEIVED: 서버가 SYN 패킷을 받고 SYN-ACK 응답을 보낸 상태

    - ESTABLISHED: 연결이 완료된 상태로 데이터 전송이 가능한 상태

    - FIN-WAIT-1: 연결 종료를 요청하고 상대방의 응답을 기다리는 상태

    - CLOSE-WAIT: 상대방의 종료 요청을 받고 대기 중인 상태

    - TIME-WAIT: 연결이 완전히 종료되기 전에 남은 패킷을 처리하기 위해 대기 중인 상태


     

    06. TCP 흐름 제어

    - 슬라이딩 윈도우(Sliding Window): 송신자는 수신자의 버퍼 크기에 따라 데이터를 전송합니다. 수신자가 처리할 수 있는 데이터 크기(윈도우 크기)를 확인한 후에만 송신이 이루어집니다.

    - ACK 번호: 수신자는 마지막으로 성공적으로 받은 패킷에 대한 ACK 번호를 보내고, 송신자는 그 번호를 기준으로 다음 데이터를 전송합니다.

     

    07. TCP 혼잡 제어 알고리즘

    - Slow Start: 연결이 처음 설정되면 데이터 전송 속도가 천천히 시작되고, 이후 네트워크 상태에 따라 점진적으로 증가합니다.

    - Congestion Avoidance: 네트워크가 혼잡해질 가능성이 있을 때 전송 속도를 조절하여 혼잡을 방지합니다.

    - Fast Retransmit: 패킷이 손실된 것으로 의심되면 재전송합니다.

    - Fast Recovery: 손실된 패킷이 재전송된 후에는 속도를 급격히 줄이지 않고 빠르게 복구합니다.

     

    08. TCP의 문제점 및 한계

    - 헤더 오버헤드: TCP는 신뢰성을 제공하기 위해 많은 제어 정보(헤더)를 포함하므로 UDP보다 오버헤드가 큽니다.

    - 네트워크 지연: TCP는 ACK을 기다리는 과정에서 추가적인 지연이 발생할 수 있습니다.

    - 중복 ACK 및 패킷 재전송: 중복 ACK은 네트워크 혼잡이나 손실을 감지하는 데 사용되지만, 때로는 불필요한 패킷 재전송을 유발할 수 있습니다.

     

    09. TCP 세션 분석

    - Wireshark: 네트워크 패킷을 분석하는 대표적인 도구로, TCP 세션을 모니터링하여 패킷의 송수신 상태를 확인할 수 있습니다.

    - netstat: TCP 연결 상태 및 포트 사용 현황을 확인할 수 있는 명령어입니다.

     

    10. TCP 관련 보안 이슈

    - TCP SYN Flood 공격: 공격자는 SYN 패킷을 대량으로 보내서 서버의 자원을 고갈시키는 공격입니다.

    - TCP 세션 하이재킹(Session Hijacking): 공격자는 TCP 세션의 Sequence Number를 예측하여 세션을 가로채는 방식입니다.

     


    아래는 추가적으로 알면 좋은 내용을 덧붙였습니다. 

     

    Nagle 알고리즘

    - 개념: Nagle 알고리즘은 작은 패킷을 네트워크로 전송하는 것을 방지하여 네트워크 혼잡을 줄이는 데 도움을 줍니다. 여러 작은 데이터 패킷을 하나로 모아 전송하므로 패킷의 수를 줄이고 효율성을 높입니다.

    - 용도: 대기 시간이 길거나 대역폭이 제한된 네트워크에서 주로 사용되며, Telnet과 같은 애플리케이션에서 중요한 역할을 합니다.

    - 비활성화: 대기 시간을 줄여야 하는 실시간 애플리케이션(예: 온라인 게임)에서는 Nagle 알고리즘을 비활성화하여 즉각적인 패킷 전송이 이루어지도록 할 수 있습니다.

     

    Delayed ACK (지연 ACK)

    - 개념: TCP는 데이터 패킷을 수신한 후 즉시 ACK를 보내지 않고 잠시 대기하여 추가 데이터가 수신될 때 ACK를 함께 보낼 수 있도록 하는 방식입니다. 이는 ACK 패킷의 수를 줄여 네트워크 혼잡을 방지하는 데 도움이 됩니다.

    - 장점: 네트워크 부하를 줄이고, 패킷 처리의 효율성을 높입니다.

    - 단점: 대기 시간이 중요한 애플리케이션에서는 지연된 ACK가 성능 저하를 유발할 수 있습니다.

     

    MTU (Maximum Transmission Unit) 및 MSS (Maximum Segment Size)

    - MTU: 네트워크 인터페이스에서 전송할 수 있는 최대 패킷 크기를 의미합니다. 일반적으로 Ethernet에서는 1500바이트가 사용됩니다.

    - MSS: TCP는 MTU 크기에서 IP 및 TCP 헤더를 제외한 순수 데이터 크기를 MSS로 정의합니다. 예를 들어, Ethernet의 기본 MTU가 1500바이트라면 MSS는 1460바이트가 됩니다.

    - MTU/MSS 관련 문제: MTU가 너무 작으면 많은 작은 패킷으로 인해 네트워크가 비효율적이 될 수 있으며, MTU가 너무 크면 패킷이 분할(Fragmentation)될 가능성이 큽니다. 이는 네트워크 성능 저하를 유발할 수 있습니다.

     

    TCP Keepalive

    - 개념: TCP는 유지 관리 프로세스의 일부로 연결이 여전히 유효한지 확인하기 위해 주기적으로 Keepalive 패킷을 전송합니다. 이것은 장시간 연결이 유지될 때 유용합니다.

    - 용도: Keepalive는 네트워크에서 비정상적으로 끊어진 연결을 감지하고 이를 종료하는 데 사용됩니다.

    - Keepalive 간격: Keepalive 패킷은 일정 시간 동안 데이터 전송이 없을 때 전송되며, 이 간격은 운영체제나 애플리케이션에 따라 조정할 수 있습니다.

     

    TCP Window Scaling

    - 개념: 기본 TCP 윈도우 크기는 65,535바이트로 제한됩니다. 하지만 고속 네트워크에서는 이 크기가 너무 작아 데이터 전송 속도를 충분히 활용하지 못할 수 있습니다. Window Scaling 옵션은 윈도우 크기를 더 크게 확장할 수 있도록 지원합니다.

    - 장점: 대역폭이 크고 레이턴시가 높은 네트워크 환경에서 더 많은 데이터를 한 번에 전송할 수 있어 성능을 크게 개선할 수 있습니다.

    - 사용 환경: 주로 장거리 네트워크(LFN, Long Fat Networks)에서 사용되며, 예를 들어 위성 통신 같은 고지연 고대역폭 네트워크에서 매우 유용합니다.

     

    TCP Retransmission (재전송)

    - 개념: TCP는 데이터 패킷이 손실되었을 때 이를 감지하고 재전송합니다. 패킷 손실을 감지하는 방법은 주로 Timeout이나 중복 ACK를 통해 이루어집니다.

    - 재전송 타이머(RTO, Retransmission Timeout): TCP는 일정 시간이 지나도 ACK를 받지 못하면 해당 패킷을 재전송하는 타이머를 설정합니다. 이 타이머 값은 동적으로 변경되며, 네트워크 상황에 따라 조정됩니다.

    - Fast Retransmit: 3개의 중복 ACK를 수신했을 때 즉시 재전송하는 메커니즘으로, 재전송 타이머를 기다리지 않고 손실된 패킷을 빨리 복구할 수 있습니다.

     

    TCP Selective Acknowledgment (SACK)

    - 개념: 기본 TCP는 수신자가 마지막으로 받은 연속된 패킷에 대해서만 ACK를 보냅니다. 하지만 중간에 일부 패킷이 손실된 경우에도 손실되지 않은 패킷에 대해서는 따로 ACK를 보내는 것이 효율적입니다. SACK는 이러한 기능을 제공하여 손실된 패킷만 재전송하도록 합니다.

    - 장점: 네트워크 성능을 최적화하고 불필요한 데이터 재전송을 줄입니다.

     

    TCP 패킷 분석 도구 활용

    - Wireshark: TCP 통신을 분석할 수 있는 가장 널리 사용되는 네트워크 분석 도구입니다. TCP 세션을 캡처하고 각 패킷의 세부 사항을 확인할 수 있습니다.

    - TCP 스트림 추적: Wireshark에서는 특정 TCP 세션의 흐름을 따라가며 송수신된 데이터를 확인할 수 있습니다.

    - 패킷 손실 및 재전송 분석: Wireshark는 패킷 손실이나 재전송이 발생한 구간을 시각적으로 보여주므로 문제 해결에 유용합니다.

    - Netcat: TCP 포트 스캐닝이나 네트워크 연결 테스트를 위한 유틸리티로, 간단하게 TCP 연결을 테스트할 수 있습니다.

    - tcpdump: 터미널 기반 네트워크 트래픽 분석 도구로, TCP 패킷을 캡처하고 분석하는 데 유용합니다.

     

    TCP 보안 향상

    - TCP Reset Attack: 공격자는 TCP 세션 중간에 RST 패킷을 보내 세션을 강제로 종료시킬 수 있습니다. 이를 방지하기 위해서는 패킷 필터링과 방화벽 설정을 강화해야 합니다.

    - TLS와의 결합: TCP 자체는 암호화되지 않으므로 보안이 중요한 경우 TLS(Transport Layer Security)와 결합하여 전송 계층에서 보안을 강화해야 합니다.

     

    TCP 및 QoS (Quality of Service)

    - 개념: TCP는 QoS와 밀접한 관계가 있습니다. QoS 설정을 통해 네트워크 트래픽의 우선순위를 설정하고 대역폭을 조정할 수 있습니다. 중요한 TCP 세션(예: VoIP, 비디오 스트리밍)을 우선 처리하도록 설정할 수 있습니다.

    - DSCP (Differentiated Services Code Point): TCP 패킷의 헤더에 우선순위를 나타내는 DSCP 필드를 사용하여 QoS 처리를 할 수 있습니다.

     


     

    이번에는 TCP에 대해서 알아보았습니다. 

    다음 글은 UDP에 대한 내용입니다. 감사합니다!

     

Designed by Tistory.