네트워크

TCP와 UDP개념정리 (TCP 편)

GearDeveloper 2024. 8. 15. 19:58
안녕하세요, 오늘은 네트워크의 기본 중 하나인 TCP와 관련된 개념에 대해 배워보겠습니다. 이 글을 통해 TCP의 작동 방식과 특징을 이해할 수 있게 될 것입니다 UDP 편은 다음 포스트를 참조해주세요!

TCP와  UDP의 역할

목적지 단말안에서 동작하는 여러 애플리케이션 프로세스 중 통해해야 할 목적지 프로세스를 정확히 찾아가고 패킷 순서가 바뀌지 않도록 잘 조합해 원래 데이터를 잘 만들어내기 위한 역할을 합니다.

4계층 프로토콜과 서비스 포트

  • 인캡슐레이션과 디캡슐레이션에서 다루었던 것처럼 데이터를 보내고 받는 인캡슐레이션, 디캡슐레이션 과정에 각 계층에서 정의하는 헤더가 추가되고 여러 가지 정보가 들어갑니다. 다양한 정보중 가장 중요한 두가지 정보는
    • 각 계층에서 정의하는 정보
    • 상위 프로토콜 지시자 정보
  • 송신측에서 추가한 2계층 헤더 MAC 주소 정보는 수신 측의 2계층에서 확인하고 사용됩니다. 마찬가지로 송신 측에서 추가한 3계층 IP 주소는 수신 측 3 계층에서 사용합니다. 4계층에서는 이런 정보로 시번스 번호, ACK 번호가 있습니다.
  • 상위 프로토콜 지시자는 디캡슐레이션 과정에서 상위 계층의 프로토콜이나 프로세스를 정확히 찾아가기 위한 목적으로 사용됩니다. 2계층은 이더 탑입, 3계층은 프로토콜 번호, 4계층은 포트 번호가 상위 프로토콜 지시자입니다.
  • 3계층의 프로토콜 번호나 2계층의 이더 타입과 같은 상위 프로토콜 지시자는 출발지와 도착지를 구분해 사용하지 않고 한 개만 사용하지만 4계층 프로토콜 지시자인 포트 번호는 출발지와 목적지를 구분해 처리해야합니다.
    1. 예를 들어, 우리가 웹 브라우저를 사용하여 인터넷에서 웹 페이지를 요청한다고 가정해봅시다. 이 때 사용되는 프로토콜은 HTTP입니다. HTTP는 4계층 프로토콜로, TCP/IP 위에서 동작합니다.
    2. 우리의 컴퓨터(출발지)가 서버(목적지)로 HTTP 요청을 보낼 때, 이 요청은 TCP/IP 패킷에 포함됩니다. 이 패킷의 3계층에서는 IP 주소가 사용되며, 2계층에서는 MAC 주소가 사용됩니다. 이러한 정보들은 출발지와 목적지 사이의 통신에서 항상 동일하게 유지됩니다.
    3. 하지만 HTTP 요청에는 포트 번호도 있습니다. 예를 들어, 출발지 컴퓨터는 포트 12345를 사용하여 요청을 보내고, 서버는 포트 80에서 이를 수신할 수 있습니다. 이 포트 번호는 출발지와 목적지 사이의 통신을 식별하는 데 사용됩니다.
    4. 이렇게, 프로토콜 인디케이터들 중에서 3계층 프로토콜 번호와 2계층 이더 유형은 출발지와 목적지 간의 통신에서 항상 같은 값으로 유지되지만, 4계층의 포트 번호는 출발지와 목적지 사이의 통신을 구별하기 위해 각각 다르게 처리됩니다.

TCP

  • TCP 프로토콜은 신뢰할 수 없는 공용망에서도 정보유실 없는 통신을 보장하기 위해 세션을 안전하게 연결하고 데이터를 분할하고 분할된 패킷이 잘 전송되었는지 확인하는 기능이 있습니다.
  • 패킷에 번호를 부여하고 잘 전송되었는지에 대해 응답합니다.
  • TCP의 여러 역할 덕분에 네트워크 상태를 심각하게 고려하지 않고 특별한 개발 없이도 쉽고 안전하게 네트워크를 사용할 수 있습니다.

TCP의 특징

  1. 연결형 서비스로 가상 회선 방식을 제공합니다.
    • 3-wayhandshake를 통해 연결한다.
    • 4-wayhamdshake를 통해 해제한다.
  2. 흐름 제어(Flow control)
    • 네트워크 내의 패킷 수가 과도하게 증가하지 않도록 방지
  3. 혼잡 제어
    • 네트워크 내의 패킷 수가 과도하게 증가하지 않도록 방지
  4. 높은 신뢰성을 보장
    • 신뢰성이 높은 전송을 하기 때문에 UDP보다 속도가 느림
  5. 전이중(Full-Duplex), 점대점(Point to Point) 방식
    • 전이중(Full-Duplex) : 전송이 양방향으로 동시에 일어날 수 있다.
    • 점대점(Point to Point) : 각 연결이 정확히 2개의 종단점을 가지고 있다.

윈도 사이즈와 슬라이딩 윈도

  • TCP는 일방적으로 패킷을 보내는 것이 아니라 상대방이 얼마나 잘 받았는지 확인하기 위해 ACK 번호를 확인하고 다음 패킷을 전송합니다.
  • 패킷이 잘 전송되었는지 확인하기 위해 별도 패킷을 받는 것 자체가 통신 시간을 늘리지만 송신자와 수신자가 먼 거리에 떨어져 있으면 왕복 지연시간이 늘어나므로 응답을 기다리는 시간이 더 길어집니다. 그래서 데이터를 보낼 때 패킷을 하나만 보내는 것이 아니라 많은 패킷을 한꺼번에 보내고 응답을 하나만 받습니다.
  • 가능하면 최대한 많은 패킷을 한꺼번에 보내는 것이 효율적이지만 네트워크 상태가 안좋으면 패킷 유실 가능성이 커지므로 적절한 송신량을 결졍해야하는데 한번에 데이터를 받을 수 있는 데이터 크기를 윈도 사이즈라 합니다.
  • 네트워크 상황에 따라 이 윈도 사이즈를 조절하는 것을 슬라이딩 윈도라고 합니다
  • TCP 헤더에서 윈도 사이즈로 표현할 수 있는 최대 크기는 2의 16승 입니다. 실제로 64KB만큼 사이즈를 가질 수 있지만 이 사이즈는 회선의 안정성이 높아지고 고속화되는 현대 네트워크에서는 너무 작은 숫자입니다.

3-Wayhandshake (TCP 연결 과정)

제어 플래그

SYN

  • 두 장치 간의 TCP 연결을 시작하는 데 사용됩니다. 클라이언트가 서버와의 통신을 시작하려고 하면 SYN 플래그 세트와 순서 번호가 포함된 TCP 패킷을 보냅니다. 이는 연결의 시작을 나타내며 클라이언트와 서버 간의 시퀀스 번호를 동기화합니다.

SYN + ACK

  • 이에 대한 응답으로 서버는 SYN 및 ACK 플래그가 모두 설정된 패킷을 다시 전송하여 SYN을 승인합니다. ACK 플래그는 클라이언트의 SYN 수신을 확인하고, SYN 플래그는 자체 시퀀스 번호를 제공하여 연결을 설정하려는 서버의 의도를 나타냅니다.

ACK

  • 패킷에 순서를 부여하는 것을 시퀀스 번호, 응답 번호를 부여하는 것을 ACK 번호라고 부릅니다.

연결 과정

  1. Client 측에서 Server로 SYN을 보내고 SYN-SENT 상태로 변경.
  2. Server 측에서 Client가 보낸 SYN 를 인식하고 ACK 제공.
  3. Client 측에서 Server가 보낸 SYN + ACK를 인식하고 ACK를 제공 후 ESTABLISHED 상태로 변경.
  4. Server 측에서 Client가 보낸 ACK를 인식하여 ESTABLISHED 상태로 변경.

4-Wayhandshake (TCP 연결 해제 과정)

제어 플래그

FIN

  • TCP 연결을 안전하고 안정적으로 종료하는 데 매우 중요하며, 연결이 닫히기 전에 양측이 데이터 교환을 완료했는지 확인합니다.

ACK

  • 패킷에 순서를 부여하는 것을 시퀀스 번호, 응답 번호를 부여하는 것을 ACK 번호라고 부릅니다.

연결 과정

  1. 해당 Client 측에서 연결 해제 신호 FIN을 보낸다. 그 후 Client 측은 FIN-WAIT-1 상태로 변경된다.
  2. Server 측에서 FIN 신호를 확인하고해당 Client 측으로 ACK 신호를 보내고 동시에 close 요청을 한다. 그리고 CLOSE-WAIT 상태가 된다
  3. 해당 Server가 ACK를 보내 Client 측에서 확인하여 FIN-WAIT-2 상태로 변경된다.
  4. 해당 FIN Close 요청을 받은 Server는 애플리케이션 종료 프로세스를 진행하고 해당 클라이언트 측으로 FIN 신호를 보내 Server 측도 끊는다고 신호를 보낸다. 그 후 LAST-ACK 상태로 변경된다.
  5. FIN을 받은 Client는 신호를 확인했다는 ACK 신호를 Server에게 보내고 TIME-WAIT 상태로 변경된다.
  6. 일정 시간이 지나면 CLOSE 상태로 변경된다.

TCP 연결 과정 상태

상태 설명
CLOSED TCP 연결의 초기 상태로 현재 활성화된 연결이 없음을 나타냅니다.
LISTEN TCP 서버가 들어오는 연결을 받아들일 준비가 되었음을 나타내기 위해 사용됩니다.
SYN-SENT 클라이언트는 SYN(동기화) 패킷을 전송했으며 서버로부터 해당 SYN-ACK(동기화 승인)를 기다리고 있습니다.
SYN-RECEIVED 서버는 SYN 패킷을 수신하고 SYN-ACK 패킷을 클라이언트로 다시 보냈습니다.
ESTABLISHED 클라이언트와 서버 모두 3방향 핸드셰이크(SYN, SYN-ACK, ACK)를 성공적으로 완료하고 연결이 설정되었습니다.
FIN-WAIT-1 연결의 한 쪽에서는 FIN(완료) 패킷을 보내 연결을 종료하고 FIN 패킷에 대한 ACK(승인) 또는 다른 쪽의 FIN을 기다리고 있음을 나타냅니다.
FIN-WAIT-2 FIN을 시작한 쪽은 FIN에 대한 ACK를 받았고 이제 상대방의 FIN을 기다리고 있습니다.
CLOSE-WAI 연결이 상대방으로부터 FIN을 받고 ACK를 보냈으나 아직 자신의 FIN을 보내지 않았습니다.
TIME-WAIT 연결을 닫고 최종 ACK를 보낸 쪽은 상대방이 ACK를 받았는지 확인하기 위해 기다리고 있습니다.
LAST-ACK FIN을 보내고 ACK를 받은 측은 이제 자신의 FIN에 대한 최종 ACK를 기다리고 있습니다.

 

Reference

[1] 고재성, 이상훈. "IT 엔지니어를 위한 네트워크 입문." 길벗, 2022.

https://dev-coco.tistory.com/144