Network

[Network] OSI Layer 4(Transport) - TCP, UDP

Yoonsoo Park 2024. 8. 23. 14:31

1. What Layer 4 do? 

 4계층은 전송 계층(Transport Layer)로 불리는 것처럼 노드 간 통신을 담당한다. L4의 주소 체계는 포트 주소(Port Address, 실무에서는 주로 포트 번호라고 지칭)가 쓰이는데, 뒤에서 더 자세히 서술하겠지만 포트 주소를 통해 프로세스 또는 프로그램을 식별하게 된다. 그리고 목적에 따라 L4의 프로토콜인 TCP와 UDP 중 전송 방식을 결정하고, 흐름 제어 및 오류 제어(TCP)를 수행한다. 마지막으로 필요에 따라 세그먼트(L4 PDU)로 단편화 작업을 하는 기능을 한다. L4의 대표적인 네트워크 장비로는 L4 스위치가 있다.

OSI 7 Layer Model

 

2. 애플리케이션을 식별하는 주소, 포트 주소(Port Address)

 한 가지 가정을 해보자. 만약 필자가 네트워크 외부의 PC로 메세지를 구성하는 패킷을 보냈다. 패킷들은 정상적으로 잘 라우팅되어 목적지 PC로 잘 도착했다. 그리고 목적지 PC에는 웹 브라우저, 메신저, 게임 등 여러 애플리케이션이 실행중이다. 그렇다면 메세지를 수신하는 과정은 완료된걸까? 

 

 그렇지 않다. 메세지가 정상적으로 전송되어 읽으려면, 필자가 의도한 특정 애플리케이션의 프로세스까지 전달되어야 한다. 그렇다면 실행되고 있는 여러 애플리케이션 프로세스 중에 올바른 루트로 패킷이 가려면 특정 애플리케이션을 어떻게 식별해야할까? 여기에 쓰이는 것이 포트 주소(Port Address, 포트 번호라고도 불린다)

 

 포트 주소는 사용 목적에 따라 잘 알려진 포트(Well Known Service Port), 등록된 포트(Registered Port), 동적 포트(Dynamic/Private Port)으로 구분된다.

 

이름 번호 용도
Well-Known Service Port 0~1023 잘 알려진 서비스 프로그램 용으로 예약된 주소 
Registered Port 1024~49151 웰노운 포트보단 아니지만 흔히 사용되는 애플리케이션에 할당하는 주소
Dynamic Port 49152~65535 등록하지 않고 임의로 사용할 수 있는 주소

 

일반적으로, 서버 프로세스의 포트는 개발 단계에서 미리 지정된 포트 주소를 사용하도록 정의하고, Well-Known  Port와 Registeref Port를 주로 사용한다. 반면 클라이언트 프로세스의 포트는 프로세스가 동작할 때마다 관리 주체인 OS(운영체제)d에 의해 Dynamic포트 번호 중 임의의 포트 주소가 할당된다. 대표적인 예시로 웹 브라우저를 들 수 있다.

 

웹 브라우저의 작동 방식

 

그림을 보면 호스트에서 웹 서비스 요청 패킷을 보내면 해당 패킷에는 송신지인 HTTP 프로세스의 포트 주소 80과 수신지인 호스트의 포트 주소가 있다( 해당 사진의 경우 등록된 주소에 속하는 5000이지만 일반적으로 호스트의 포트 주소는 동적 포트를 할당한다). 

 

 포트 주소는 일반적으로 IP주소와 같이 주어져 특정 호스트에서 실행 중인 특정 애플리케이션 프로세스를 식별하는데 쓰인다. 다음과 같은 표기로 사용된다. ex) 192.168.0.20:5000

 

 

3. L4의 느려도 믿음직한 전송 방식, TCP(Transmission Control Protocol)

 L4의 핵심 프로토콜인 TCP(Transmission Control Protocol)은 IP와 다르게 신뢰성, 연결성 통신을 수행하는 프로토콜이다. TCP의 특징은 아래와 같다. 

 

  • 연결 지향
    • 데이터를 전달할 논리적인 연결을 먼저 구성 -> 3-Way-Handshake
    • 연결 설정 -> 데이터 전송 -> 연결 종료
  • 신뢰성 보장
    • 순차적으로 데이터를 전송함 -> TCP Flags(제어 비트), 순서 번호, 확인 응답 번호
    • 확인 응답 및 재전송
  • 흐름 제어
    • 데이터 전달에 지연 현상이 발생했을 때 데이터의 양을 조절 -> Sliding Window

 

1) MSS와 TCP 세그먼트 헤더의 구조

​ TCP를 이해하기 위해 먼저 MSS와 TCP 세그먼트 헤더 구조에 대해 알아보자. 

먼저, MSS(Maximum Segment Size)TCP로 전송할 수 있는 최대 페이로드의 크기를 의미한다. MSS의 크기를 고려할 때 TCP 헤더 크기는 제외한다( <-> MTU는 헤더 크기까지 포함).

*MTU가 기억나지 않는다면 이전의 IP Fragmentation 포스트 를 다시 보자!

 

 이제 TCP 세그먼트 헤더의 구조를 보자. TCP 헤더의 크기는 Option 필드의 크기에 따라 가변적이다(20bytes~60bytes). 그리고 TCP의 동작을 지시하는 메세지를 생성하여 연결 상태를 제어한다(Flags). 

TCP Segment Header

 

Source Port Address(2bytes)

  • 출발지 Application Port Addr

Destination Port Address(2bytes)

  • 목적지 Application Pork Addr

Sequence Number (4bytes)

  • 송수신되는 세그먼트의 올바른 순서를 보장하기 위해 데이터의 첫 바이트에 부여되는 번호
  • 초기 순서 번호는 임의의 값(ISN; Initial Sequence Number)
  • 전송되는 데이터의 크기를 누적시키며 순서를 알려 줌

 

Acknowledgment Number (4bytes)

  • 확인 응답 번호
  • 데이터를 정상적으로 수신한 뒤 예상하는 다음 Sequence Number를 알려줌
    • 받은 Sequence Number + Payload 크기
    • 최초 SYN에 대한 응답 : 수신한 Sequence Number + 1

 

HLEN (4bits)

  • TCP Header 길이 값
  • 4개의 Bit로 표현되고 4bytes단위로 표시됨(최대 길이 값 60bytes)

 

Reserved

  • 예약된 field(사용할 가능성이 있어 여유 공간을 둔 것)

 

TCP Flags(1bytes) = 제어 비트

  • 논리적인 TCP 연결회선 제어 및 데이터 관리를 위해 사용
  • TCP 메세지의 종류를 명시 함
  • 1bit씩 메시지 종류가 지정되어 있고, 해당 bit값이 설정되면 지정된 가능을 수행

* SYN, ACK, FIN은 자주 사용되므로 외워두기!

Wireshark로 본 Flags

 

 

Window (2bytes)

  • 통신의 상대방에게 자신의 버퍼 여유용량 크기를 지속적으로 알려 줌
  • 능동적인 흐름제어를 위해 사용 됨
  • Sliding Window 기법 사용

 

2) TCP 연결 수립: 3-Way-Handshake

 앞선 설명에서 TCP는 연결형 통신을 수행하는 프로토콜이기 때문에 통신 이전에 연결 수립, 이후에 연결 종료 과정이 있다고 언급했었다. TCP 연결 수립은 송신 대상이 연결할 준비가 되었는지 안부를 묻는 것과 유사하다고 볼 수 있다. IP, UDP와 같이 상대방의 준비 여부와 상관없이 패킷을 보내는 것이 아닌, 상대방이 준비된 것을 확인하고 패킷(세그먼트)를 전송하는 것이다. TCP의 연결 수립은 3-way-handshake라는 과정을 통해 이뤄진다. 3-way-handshake는 아래 그림과 같이 이뤄진다. 

3-way-handshake

 

해당 과정을 표로 정리해보면 아래와 같다. 

송수신 방향 세그먼트 세그먼트에 포함된 주요 정보 비유
A -> B SYN  A의 초기 순서 번호
SYN 비트(1)
'연결 준비 되셨죠?'
B -> A SYN+ACK B의 초기 순서 번호
A의세그먼트에 대한 확인 응답 번호 
SYN 비트(1)
ACK 비트(1)
'확인했습니다'
'연결 시작해요'
A -> B ACK A의 다음 순서 번호
B의 세그먼트에 대한 확인 응답 번호
ACK 비트(1) 
'확인했습니다'

 

 해당 표에서 호스트가 요청하여 연결을 시작하는 동작(첫번째 A->B)을 액티브 오픈(Active Open)이라고 하고, 서버(B)로부터 요청을 받아 연결하는 동작(세번째 A->B)을 패시브 오픈(Passive Open)이라고 한다. 

 

 

3) TCP 연결 종료

 TCP는 통신이 끝난 후 연결 종료 과정을 거치는데, TCP 연결 수립이 3번의 제어 비트 세그먼트 전송을 통해 이뤄졌다면, 연결 종료는 4번의 제어 비트 세그먼트 전송을 통해 이뤄져 4-Way-Handshake로도 불린다. 연결 수립이 완료된 상태를 Conncted Established라고 하는데, 해당 상태에서 세그먼트 통신이 이뤄지고, 해당 과정이 종료된 후 FIN, ACK 세그먼트가 교환되는 과정이 연결 종료 과정이다. 

 

송수신 방향 세그먼트 세그먼트에 포함된 주요 정보 비유
A -> B FIN FIN 비트(1) '연결 끊을게요'
B -> A ACK ACK 비트(1)
A의세그먼트에 대한 확인 응답 번호
'네'
A -> B FIN FIN 비트(1) '연결 끊으세요'
B -> A ACK ACK 비트(1)
A의세그먼트에 대한 확인 응답 번호
'네'

 

 

4) TCP의 상태(State)

 TCP는 신뢰성과 연결성있는 통신을 위해 다양한 '상태'를 유지한다. 상태(State)어떤 통신 과정에 있는가를 의미하며, TCP를 Stateful Protocol이라고 부르기도 한다. 아래 상태에 대한 설명과 TCP 상태 천이 다이어그램을 통해 이해해보자.

 

TCP 상태 천이 다이어그램(TCP State Machine)

 

Window에서 netstat로 TCP의 상태를 볼 수 있다

 

  • CLOSED
    • 아무런 연결이 없는 상태
  • LISTEN
    • 연결 대기 상태
    • 3-way-handshake의 첫 SYN 세그먼트를 기다리는 상태
  • SYN-SENT
    • 3-way-handshake에서 SYN을 보낸 뒤, SYN+ACK 세그먼트를 기다리는 상태
  • SYN-RECEIVED
    • 3-way-handshake에서 SYN+ACK 세그먼트를 보낸 뒤, ACK를 기다리는 상태
  • ESTABLISHED
    • 연결이 확립되었음을 나타내는 상태
  • FIN-WAIT-1
    • 일반적인 TCP 종료 상태에서 연결 종료의 첫 상태
    • FIN 세그먼트를 보낸 상태
  • CLOSE-WAIT
    • FIN 세그먼트를 받은 호스트가 응답으로 ACK를 보낸 후 대기하는 상황
  • FIN-WAIT-2
    • FIN-WAIT-1 상태에서 ACK 세그먼트를 받은 상태, FIN 세그먼트를 기다리는 상태
  • LAST-ACK
    • CLOSE-WAIT 상태에서 FIN을 전송한 뒤 ACK를 기다리는 상태
  • TIME-WAIT
    • ACK 세그먼트를 수신하고 일정 시간 기다린 뒤 CLOSED 상태로 전이
  • CLOSED
    • 동시에 연결을 종료할 때 전이되는 상태

 

 

 

4. L4의 빠른 전송 방식, UDP(User Datagram Protocol)

UDP(User Datagram Protocol)은 IP와 같이 비 신뢰성, 비 연결성 통신을 수행하는 프로토콜이다. UDP는 TCP와 같은 연결 수립, 오류 제어, 흐름 제어 등 대부분의 기능을 제한하여 패킷 손실, 순서 뒤바뀜 등이 일어날 우려가 있다. 하지만 이러한 특성 덕분에 TCP에 비해 오버헤드(부하)가 적어 빠른 패킷 처리가 가능해 UDP는 주로 실시간 통신 서비스, 빠른 파일 전송(TFTP), 정보 해석 및 전달 서비스(DNS, DHCP..)에 사용된다.

 UDP 데이터그램 헤더는 8byte로 이뤄져 있으며, TCP에 비해 매우 간단하고 가벼운 구조로 이뤄져 있다.

 

UDP Datagram Header

 

  • Source Port Address: 수신지 포트 주소
  • Destination Port Address: 송신지 포트 주소
  • Length: 헤더를 포함한 UDP 데이터그램의 길이
  • Checksum: 데이터그램 전송 과정에서 데이터 무결성을 검사하기 위한 필드