과정을 즐기자

트랜스포트 계층(L4)이 하는 일(feat. 포트, TCP, UDP, QUIC) 본문

Network

트랜스포트 계층(L4)이 하는 일(feat. 포트, TCP, UDP, QUIC)

320Hwany 2023. 7. 27. 17:16

이번 글에서는 저번 글에 이어서 트랜스포트 계층(L4)이 하는 일에 대해 알아보겠습니다.

물리 계층(L1), 데이터 링크 계층(L2), 네트워크 계층(L3)이 하는 일은 이전 글들을 참고해주세요

 

L4 - 트랜스포트 계층

L4는 송신자와 수신자를 연결하는 통신 서비스를 제공합니다.

직접 물리적으로 데이터를 옮기는 것은 아니지만 송신자, 수신자가 통신을 할 수 있게 연결해주는 역할입니다.  

L4는 호스트 내에서 애플리케이션을 구분하는 용도로 포트라는 것을 사용합니다.

포트는 16비트로 사용하기 때문에 2^16으로 부호없는 정수 0 ~ 65535번이 될 수 있습니다.

IP 뒤에 콜론으로 포트 번호를 붙입니다. 포트는 논리적인 개념으로 간단하게 프로세스 주소라고 할 수 있습니다.

이렇게 L4는 송신자, 수신자를 연결하는 통신 서비스를 제공하며 포트를 이용해 애플리케이션을 구분합니다. 

TCP

L1, L2, L3를 통해 원하는 호스트에게 정확하게 데이터를 전달할 수 있습니다.

하지만 문제가 발생하여 패킷이 왜곡되거나 분실되는 상황이 발생할 수 있습니다.

이러한 문제를 해결하기 위해 L4에는 TCP 프로토콜이 있습니다.

 

TCP는 데이터의 신뢰성을 보장하는 프로토콜입니다.

TCP는 상대와 통신하기 위해 3 way handshake로 커넥션을 만듭니다.

이렇게 커넥션을 맺은 후 통신을 할 때 애플리케이션에서 데이터를 분할해서 전송합니다.

분할하는 이유는 2가지가 있습니다.

첫 번째로는 너무 큰 데이터가 분실되는 경우 잃어버리는 데이터가 많고 데이터를 분할하면 일부 데이터가 분실되어도 

그 부분만 다시 보내면 됩니다.

두 번째로는 L2에서 보낼 수 있는 최대 크기가 정해져 있기 때문입니다. 

예를들어 이더넷 프레임을 사용한다면 최대 1500바이트인데 TCP 헤더 20바이트 IP 헤더 20바이트를 사용하면

데이터는 최대 1460 바이트 사용가능합니다.

 

TCP는 데이터를 보낼 때마다 확인 응답을 받고 확인 응답이 있어야만 다음 데이터를 보내는 방식으로 신뢰성있는 

데이터 전송을 보장합니다. (이 부분은 TCP 흐름제어로 개선 - 뒤에서 설명)

 

통신이 끝났으면 커넥션을 끊는데 이 과정은 4 way handshake로 진행합니다.

TCP는 이렇게 커넥션 확립, 데이터 전송, 커넥션 끊기로 신뢰성 있는 데이터 전송을 보장합니다.

TCP 헤더

TCP 헤더는 위와 같이 구성됩니다.

Source Port, Destination Port는 각각 16비트로 구성됩니다.

Sequence Number는 32비트로 구성된 데이터 일련 번호입니다.

Sequence Number가 있기 때문에 데이터의 순서가 뒤죽박죽으로 도착해도 원상태로 복원하고 누락된 것도 확인할 수 있니다.

Sequence Number는 처음 보낼 때 난수로 보내고 그 다음부터는 현재 Sequence Number + 데이터의 크기 + 1 입니다.

Acknowledgement Number는 32비트로 구성되고 자신이 다음에 받아야 할 상대의 Sequence Number를 나타냅니다.

 

그 다음으로 4비트로 구성된 헤더의 크기를 알 수 있는 데이터 오프셋(DO), 9비트로 구성된 컨트롤 플래그가 있습니다.

컨트롤 플래그의 각 필드는 사용 용도에 따라 다르게 설정합니다.

 

16비트로 구성된 Window Size는 TCP 흐름제어인 슬라이딩 윈도우를 사용할 때 필요합니다.

16비트로 구성된 CheckSum은 데이터의 변조나 에러를 알아내기 위해 사용합니다.

16비트로 구성된 Urgent Pointer는 컨트롤 플래그의 URG가 1인 경우에 사용합니다.

Options 필드는 TCP의 기능을 확장할 때 사용하는데 Windows Scaling 등 성능 향상을 위한

옵션입니다. 크기가 정해져있지 않고 가변적입니다. 

TCP 흐름 제어

데이터를 보낼 때마다 확인 응답을 받고 확인 응답이 있어야만 다음 데이터를 보내는 방식은 효율성이 떨어집니다.

따라서 한번에 여러 개의 데이터를 보내는 방식을 생각해냅니다.

전송할 데이터들이 있을 때 윈도우라는 것을 만들어서 한번에 보낼 영역을 저장합니다.

한번에 전송할 데이터들의 크기를 윈도우 사이즈라고 합니다.

윈도우 크기가 커질 수록 한번에 더 많은 데이터를 보내기 때문에 통신 속도가 빨라집니다.

TCP 혼잡 제어

하지만 수신측의 네트워크가 혼잡할 때 송신측에서 너무 많은 데이터를 보내면 문제가 생깁니다.

이러한 네트워크 혼잡 문제를 해결하기 위해 TCP 혼잡 제어를 합니다.

 

송신측에서 처음 데이터를 보낼 때 윈도우 크기를 최대한 작게 설정해 한번에 하나의 데이터만 보냅니다(슬로우 스타트)

수신측에서 데이터를 잘 받았으면 윈도우 크기를 2배씩 늘리다가 수신측에서 너무 많은 데이터를 받았다고 전달하면

다시 윈도우 크기를 줄이는 방법으로 적절한 양의 데이터를 전송할 수 있습니다.

 

이러한 방식으로 TCP는 신뢰성있는 전송을 보장하면서 흐름제어로 여러 데이터를 전송하며 너무 많은 데이터를 보낼 때  

데이터의 양을 조절하기 위해 혼잡 제어를 합니다

 

UDP

TCP는 데이터가 분실되거나 손상되면 재전송을 보장하고 순서가 바뀐 데이터를 재조립하지만 UDP는 그렇지 않습니다.

만약 데이터가 분실되거나 재전송을 원하는 경우 프로그래머가 직접 애플리케이션 계층에서 요청을 해야합니다.

UDP는 신뢰성을 보장하는 여러 절차를 생략하기 때문에 빠른 처리가 가능합니다.

동영상, 음성, 게임 같은 경우에는 데이터가 조금 손실되더라도 끊기지 않고 빠른 응답이 중요하기 때문에 UDP를 많이 사용합니다.

 

UDP는 헤더도 매우 단순합니다.

16비트로 구성된 Source Port, Destination Port가 있습니다.

16비트로 구성된 UDP Length가 있고 UDP 헤더와 데이터의 크기를 합친 값을 저장합니다.

16비트로 구성된 Checksum은 UDP 헤더와 데이터가 변조되었는 지를 체크합니다.

TCP VS UDP

신뢰성을 보장하려면 TCP를 사용하는게 좋고 더 빠른 속도를 원하면 UDP를 사용하는게 좋습니다.

이 둘의 장점을 취하기 위해서 UDP를 사용하면서 신뢰성은 사용자가 직접 구현하는 방식을 많이 이용합니다.

 

UDP를 이용해 TCP처럼 신뢰성을 제공하는 QUIC이라는 프로토콜도 등장했습니다.

HTTP/2는 TCP를 이용한 기술이고 HTTP/3는 UDP 기반으로 만들어진 QUIC을 사용합니다.

 

출처 : 그림으로 배우는 네트워크 (인프런 - 감자), 성공과 실패를 결정하는 1%의 네트워크 원리