전송계층 TCP/UDP

dobby·2024년 5월 21일
0
post-thumbnail

전송 계층 서비스의 원리

트랜스포트 계층과 네트워크 계층의 관계

트랜스포트 계층 프로토콜들은 종단 시스템에 존재한다.
종단 시스템 안에서 트랜스포트 프로토콜은 애플리케이션 프로세스에서 네트워크 경계(네트워크 계층)까지 메시지를 운반하며, 또한 반대 방향으로 네트워크 계층에서 애플리케이션 프로세스로 메시지를 운반한다.
그러나 트랜스포트 프로토콜은 메시지가 네트워크 계층 내부에서 어떻게 이동하는지는 언급하지 않는다.

트랜스포트 계층이 하위의 네트워크 계층으로부터 데이터를 수신하면 여러 프로세스들 중 하나에게 데이터를 전달해야 한다.
이때, 수신 측 호스트의 트랜스포트 계층은 실제로 데이터를 직접 프로세스로 전달하지 않는다.
호스트가 가진 여러 개의 소켓들 중 적절한 한 개의 소켓으로 전달하는 역할을 한다.

Multiplexing

출발지 호스트에서 소켓으로부터 데이터를 모아 헤더 정보를 더해 캡슐화를 한다.
캡슐화된 세그먼트들을 네트워크 계층으로 전달하는 작업을 다중화라고 한다.

Demultiplexing

네트워크 계층을 통해 도착한 데이터를 트랜스포트 계층 세그먼트의 데이터를 올바른 소켓으로 전달하는 작업을 역다중화라고 한다.

소켓은 유일한 식별자를 가지고 세그먼트는 각 세그먼트가 전달될 적절한 소켓을 가리키는 특별한 필드를 갖고 있어야 한다.
UDP와 TCP의 동작 방식은 다르다.
UDP 소켓은 포트 번호를 기반으로 연결하며, TCP 소켓은 포트 번호와 IP 주소를 기반으로 연결한다.

TCP와 UDP

네트워크 계층에서 가장 중요한 프로토콜이 IP라면, 전송 계층에서 가장 중요한 프로토콜은 TCP/UDP이다.
TCP는 신뢰할 수 있는 통신을 위한 연결형 프로토콜이고,
UDP는 TCP보다 신뢰성은 떨어지지만 비교적 빠른 통신이 가능한 비연결형 프로토콜이다.

TCP 통신 단계와 세그먼트 구조

TCP 통신은 크게 세 단계로 나누면 다음과 같이 나눌 수 있다.

  1. 연결 수립
  2. 데이터 송수신
  3. 연결 종료

TCP는 통신하기 전에 연결을 수립하고 통신이 끝나면 연결을 종료한다.
또한, 데이터 송수신 단계에서 재전송을 통한 오류 제어, 흐름 제어, 혼잡 제어 등의 기능을 제공한다.

MSS는 Maximum Segment Size의 약자로, TCP로 전송할 수 있는 최대 페이로드 크기를 의미한다.
MSS의 크기를 고려할 때 TCP 헤더의 크기는 제외한다. (MTU와는 대조적)

  • 송신지 포트/수신지 포트 : 필드 이름 그대로 송신지 또는 수신지 애플리케이션을 식별하는 포트 번호가 명시되는 필드
  • 순서 번호 : 송수신되는 세그먼트의 올바른 순서를 보장하기 위해 세그먼트 데이터의 첫 바이트에 부여되는 번호
  • 확인 응답 번호 : 상대 호스트가 보낸 세그먼트에 대한 응답, 다음으로 수신하기를 기대하는 순서 번호 명시
  • 제어 비트 : 현재 세그먼트에 대한 부가 정보
  • 윈도우 : 수신 윈도우의 크기 명시 (한 번에 수신하고자 하는 데이터의 양)

제어 비트

제어 비트는 기본적으로 8비트로 구성된다.

  • ACK : 세그먼트의 승인을 나타내기 위한 비트
  • SYN : 연결을 수립하기 위한 비트
  • FIN : 연결을 종료하기 위한 비트

순서 번호와 확인 응답 번호

순서 번호 필드와 확인 응답 번호 필드는 TCP의 신뢰성을 보장하기 위해 사용되는 중요한 필드이다.

전송 계층이 응용 계층으로부터 전송해야 하는 1900바이트 크기의 데이터를 전달받았다고 가정해보자.
이는 MSS 단위로 전송될 수 있다.
편의상 MSS가 500바이트라고 할 때, 총 네 개의 세그먼트로 쪼갤 수 있다.
처음 통신을 위해 연결을 수립한 경우, 즉 제어 비트에서 연결을 수립하기 위한 비트인 SYN 플래그가 1로 설정된 세그먼트의 경우 순서 번호는 무작위 값이 된다.
이를 초기 순서 번호라 한다.
초기 순서 번호가 100이라면 가장 먼저 보내게 될 세그먼트의 순서 번호가 초기 순서 번호인 100이 되는 것이다.

이후 다음 세그먼트의 순서 번호는 100 + 500(송신한 바이트 수)가 된다.
이런 식으로 순서 번호가 설정된다.

확인 응답 번호는 수신자가 다음으로 받기를 기대하는 순서 번호이다.
일반적으로 '수신한 순서 번호 + 1'로 설정된다.
확인 응답 번호 값을 보내기 위해서는 제어 비트에서 승인을 나타내는 비트인 ACK 플래그를 1로 설정해야 한다.

TCP에 대해 설명해주세요.
TCP는 전송계층 프로토콜 중 하나로, 재전송, 누적확인 응답, 순서번호 등을 통해 신뢰적인 데이터 전송을 제공합니다.
또한, 연결지향형이기 때문에 데이터를 전송하기 전에 송신자와 수신자간 3-way-handshake 통신 연결을 수립하고 4-way-handshake로 통신 연결을 종료합니다.
TCP 연결은 전이중 서비스를 제공하며 항상 단일 송신자와 수신자 사이의 점대점(point-to-point) 연결이기에 멀티캐스팅이 불가능합니다.

TCP 연결 수립과 종료

연결 수립

TCP의 연결 수립은 3-way-handshake를 통해 이루어진다.

처음 연결을 시작하는 호스트의 연결 수립 과정을 액티브 오픈이라 한다.
연결을 처음 요청하는 동작을 액티브 오픈이라고 생각해도 좋다.
반대로 연결 요청을 받고 나서 요청에 따라 연결을 수립해주는 호스트도 있다.
이 호스트의 연결 수립 과정을 패시브 오픈이라 한다.

연결 종료

TCP가 연결을 종료하는 과정은 송수신 호스트가 각자 한 번씩 FIN, ACK를 주고받으며 이루어진다.
액티브 클로즈는 먼저 연결을 종료하려는 호스트에 의해 수행된다.
패시브 클로즈는 연결 종료 요청을 받아들이는 호스트에 의해 수행된다.

TCP 상태

TCP는 연결형 통신과 신뢰할 수 있는 통신을 유지하기 위해 다양한 상태를 유지한다.
TCP는 상태를 유지하고 활용한다는 점에서 stateful 프로토콜이라고 한다.

상태주요 상태
연결 수립 전CLOSED, LISTEN
연결 수립 상태SYN-SENT, SYN-RECEIVED, ESTABLISHED
연결 종료FIN-WAIT-1, CLOSE-WAIT, FIN-WAIT-2, LAST-ACK, TIME-WAIT, CLOSING

연결 수립 전

아직 연결 수립이 이루어지기 전의 호스트는 CLOSEDLISTEN 상태를 유지하고 있다.

  • CLOSED: 아무런 연결이 없는 상태
  • LISTEN: 연결 대기 상태, 일반적으로 서버로서 동작하는 패시브 오픈 호스트는 LISTEN 상태를 유지하며 SYN 세그먼트를 기다린다.

연결 수립 상태

  • SYN-SENT: 액티브 오픈 호스트가 SYN 세그먼트를 보낸 뒤 그에 대한 응답인 SYN+ACK 세그먼트를 기다리는 상태
    연결 요청을 보낸 뒤 대기하는 상태이다.
  • SYN-RECEIVED: 페시브 오픈 호스트가 SYN+ACK 세그먼트를 보낸 뒤 그에 대한 ACK 세그먼트를 기다리는 상태
  • ESTABLISHED: 연결 확립, 데이터를 송수신할 수 있는 상태

연결 종료

  • FIN-WAIT-1: FIN 세그먼트로 연결 종료 요청을 보낸 액티브 클로즈 호스트는 FIN-WAIT-1 상태로 접어들게 된다.
  • CLOSE-WAIT: FIN 세그먼트를 받은 패시브 클로즈 호스트가 그에 대한 응답으로 ACK 세그먼트를 보낸 후 대기하는 상태
  • FIN-WAIT-2: FIN-WAIT-1 상태에서 ACK 세그먼트를 받게 되면 FIN-WAIT-2 상태가 된다.
    상대 호스트의 FIN 세그먼트를 기다리는 상태
  • LAST-ACK: CLOSE-WAIT 상태에서 FIN 세그먼트를 전송한 뒤 이에 대한 ACK 세그먼트를 기다리는 상태
  • TIME-WAIT: 액티브 클로즈 호스트가 FIN 세그먼트를 수신하고 ACK 세그먼트를 전송한 뒤 접어드는 상태.
    패시브 클로즈 호스트가 마지막 ACK 세그먼트를 수신하면 CLOSED 상태로 전이하는 반면, TIME-WAIT 상태에 접어든 액티브 클로즈 호스트는 일정시간을 기다린 뒤 CLOSED 상태로 전이한다.

TIME-WAIT 상태가 필요한 이유
상대 호스트가 받았어야 할 마지막 ACK 세그먼트가 올바르게 전송되지 않았을 수 있기 때문이다.

CLOSING 상태는 양쪽 모두가 동시에 연결 종료를 요청하고 서로의 종료 응답을 기다리는 경우 CLOSING 상태로 접어든다.
이 경우 ACK 세그먼트를 수신하면 TIME-WAIT 상태로 접어든 뒤 종료하게 된다.

3-way-handshake에 대해 설명해주세요.
TCP 프로토콜의 송신자와 수신자간 통신 연결을 수립하는 과정입니다.
1단계로, 액티브 오픈 호스트가 SYN 세그먼트를 보낸 뒤 패시브 오픈 호스트가 SYN+ACK 세그먼트를 보낼 때까지 기다립니다.
이를 SYN-SENT 상태라고 합니다.
2단계로, 패시브 오픈 호스트가 SYN+ACK 세그먼트를 보낸 뒤 이에 대한 ACK 세그먼트를 기다리며 이러한 상태를 SYN-RECEIVED라고 합니다.
마지막 3단계로 연결이 확립되는 ESTABLISHED 상태로 넘어가며 데이터를 송수신할 수 있게 됩니다.
이 과정을 3-way-handshake라고 합니다.

4-way-handshake에 대해 설명해주세요.
4개의 특별한 패킷을 주고받으며 TCP 연결을 해제하는 방법을 말합니다.
1단계로 액티브 클로즈 호스트는 FIN 세그먼트를 전송합니다.
2단계는 패시브 클로즈 호스트는 FIN 세그먼트를 받은 후 ACK 세그먼트를 전송합니다.
3단계로 페시브 클로즈 호스트는 액티브 클로즈 호스트에게 연결을 종료하겠다는 FIN 세그먼트를 보냅니다.
마지막 4단계로 액티브 클로즈 호스트는 FIN 세그먼트에 대한 응답 ACK 세그먼트를 전송하고 일정 시간을 기다린 후 종료됩니다.


UDP 데이터그램 구조

UDP는 TCP와 달리 비연결형 통신을 수행하는 신뢰할 수 없는 프로토콜이다.
연결 수립 및 해제, 오류 제어, 혼잡 제어, 흐름 제어 등을 수행하지 않으며 상태를 유지하지도, 활용하지도 않는 stateless 프로토콜의 일종이다.

UDP 데이터그램 헤더는 크게 송신지 포트와 수신지 포트, 길이, 체크섬 필드의 네 개 필드로 구성되어 있다.

  • 송신지 포트/수신지 포트 : 송수신지의 포트 번호
  • 길이 : 헤더를 포함한 UDP 데이터그램의 바이트
  • 체크섬 : 데이터 전송 과정에서 오류가 발생했는지 검사하기 위한 필드로, 신뢰성/비신뢰성과는 관련이 없다.

체크섬 무결성 검증

UDP 체크섬은 UDP 세그먼트의 오류 검출을 위해 사용된다.

  1. 체크섬은 UDP 헤더와 페이로드를 연결하여 하나의 데이터를 만든다.
  2. 데이터를 16비트 단위로 나눈다.
  3. 각 16비트 단위의 값을 모두 더한다.
  4. 이렇게 계산된 값의 하위 16비트를 구한다.
  5. 최종적으로 체크섬은 이렇게 구한 하위 16비트 값의 보수를 취해 얻는다.
  6. 수신자는 도착한 UDP 패킷의 헤더와 페이로드를 동일한 방식으로 처리하여 체크섬을 계산한다.
  7. 수신된 체크섬 값과 계산된 체크섬 값을 비교하여 무결성 검증을 수행한다.
  8. 만약 체크섬 값이 일치하지 않으면 데이터 그램이 손상되었을 가능성이 높기 때문에, 수신자는 해당 패킷을 무시하거나 재요청을 수행하는 등의 조치를 취한다.

UDP의 장단점

[ 장점 ]
비연결형 서비스이므로 TCP에 비해 오버헤드가 적고 빠르게 패킷을 보낼 수 있다.
또한 1:1, 1:N, N:N 통신이 가능하다.
TCP는 점대점 연결이기에 멀티캐스팅이 불가하다.

[ 단점 ]
데이터의 신뢰성이 없다는 것이다.
UDP는 패킷이 손실되거나 패킷의 순서가 바뀔 수도 있다.


UDP는 TCP에 비해 오버헤드가 적고 빠르게 패킷을 보낼 수 있다.
그래서 주로 스트리밍과 같은 실시간성이 강조되는 상황에서 주로 쓰인다.

TCP의 전송 방식이 수신지에 하나씩 확실하게 전달하는 것이라면,
UDP는 빠르게 마구 던지는 것과 같다.
그렇기에 패킷이 손실되거나 패킷의 순서가 바뀔 수도 있다.


NEXT. TCP 오류, 흐름, 혼잡제어


도서
혼자 공부하는 네트워크

profile
성장통을 겪고 있습니다.

0개의 댓글