-
강의 과제) 전송 계층, TCP, UDP, TCP 오류, 흐름 제어, 혼잡 제어TIL-sparta 2024. 6. 16. 23:20
학습 키워드: transport layer, TCP, UDP, TCP errors, flow control, congestion control
1. 전송 계층이란? 전송 계층의 개념과 필요성
전송 계층(L4)은 TCP와 UDP 프로토콜이 속해 있는 계층으로, 데이터를 세그먼트(segment) 단위로 분리하여 송신하고 수신 시 세그먼트를 재조립(reassembly) 합니다. 네트워크 계층(L3)이 IP 주소를 이용해 서로 다른 네트워크의 두 호스트간 패킷 전달을 담당했다면, 전송 계층은 송신측과 수신측의 호스트 내 프로세스 끼리의 end-to-end 통신을 담당합니다. 하드웨어와 프로세스를 이어주는 OS의 커널(kernel)에서 SW적으로 구현되어 있으며, 네트워크의 혼잡 제어를 담당하는 로드 밸런서도 L4에 속합니다.
하나의 호스트 안에서는 여러 개의 프로세스가 동작할 수 있기 때문에 단순하게 호스트의 IP 주소를 아는 것 만으로는 데이터의 최종 목적지가 되는 프로세스를 식별할 정보가 부족합니다. 전송 계층은 이 문제를 해결하기 위해 포트(port)라는 개념을 사용합니다.
포트 번호는 16비트의 길이로 이루어진 숫자로, 0부터 65535까지 총 65536개가 있습니다. 앞서 언급했듯이 이 번호는 데이터의 목적지가 되는 프로세스를 식별하기 위해 존재하기 때문에, 하나의 호스트에서 여러 개의 프로세스가 동시에 같은 포트 번호를 사용할 수는 없습니다. 또한, 포트 사용의 혼선을 막기 위해 자주 사용되는 서비스들이 동일한 포트 번호를 유지할 수 있도록 IANA ( Internet Assigned Numbers Authority)라는 기관에서 0번 부터 1023번 까지의 포트를 잘 알려진 포트( well-known ports)번호로 지정하여 해당 포트들을 고정된 용도로만 사용하도록 권장하고 있습니다. 이 포트 번호들은 시스템 포트(system ports)나 예약 포트(reserved ports)라는 이름으로도 불립니다. 1024부터 49151 까지는 등록된 포트(registered ports)로, IANA의 승인 절차를 거쳐 등록된 어플리케이션들이 사용중인 포트 번호들이 포함됩니다. 나머지 번호들은 동적 포트(dynamic ports)라고 부르며, IANA가 관할하지 않기 때문에 제약이 없어 자유롭게 사용이 가능합니다.
2. TCP와 UDP란?
1) TCP (Transmission Control Protocol):
전송 제어 프로토콜(TCP)은 두 호스트 간 신뢰성 있는 데이터 교환을 목표로 하는 연결 지향형(connection-oriented) 프로토콜입니다. 3-Way Handshake (SYN, SYN-ACK, ACK)를 통해 연결을 수립하고, 4-Way Handshake (FIN, ACK, FIN, ACK)를 통해 연결을 해제합니다. TCP는 데이터의 전달 순서를 보장하며, 이를 위해 최소 20바이트에서 최대 60바이트의 큰 헤더를 필요로 합니다. 또한, 연결 상태를 확인하는 추적 메커니즘이 있어서 이를 통해 수신자가 발신자에게 ACK 응답을 보내서 발신자가 ACK 응답이 없는 부분의 데이터를 다시 송신할 수 있습니다. 이메일 전송이나 파일 전송, 웹 브라우징 등 신뢰성이 필요한 작업에 주로 사용됩니다.
- 발신지 포트 (source port): 발신지의 프로세스가 사용중인 포트 번호
- 목적지 포트 (destination port): 수신지의 프로세스가 사용중인 포트 번호
- 시퀀스 번호 (sequence number): 단조 증가하는(monotonic increasing) 식별 번호로, TCP가 보내는 각 바이트마다 식별 번호가 지정됩니다. 이 번호는 분해된 세그먼트가 다시 재조립될 때 순서대로 합쳐질 수 있도록 도와줍니다.
- ACK 번호 (acknowledgement number): 발신자가 응답 받기를 기다리는 다음 시퀀스 번호입니다. TCP의 데이터는 순차적으로 전달되기 때문에 ACK 번호는 항상 이전 시퀀스 번호 +1입니다.
- 데이터 오프셋 (data offset): 옵션 헤더가 끝나고 데이터가 시작되는 지점을 나타냅니다.
- 제어 비트 (control flag): 연결을 조율하는 메타 정보 플래그를 담고 있습니다.
- 수신 윈도 (receive window): 발신자가 데이터 수신에 사용할 수 있는 여유 버퍼 용량이 얼마나 남았는지를 알려줍니다. 흐름 제어에 사용됩니다.
- 긴급 포인터 (urgent pointer): 세그먼트 데이터 시작 위치를 기준으로 긴급 데이터의 위치를 나타냅니다. 제어 비트에 URG가 사용된 경우에만 유효합니다.
2) UDP (User Datagram Protocol):
사용자 데이터그램 프로토콜(UDP)는 TCP에 비해 보다 경량화된 방식의 데이터그램 지향형(datagram-oriented) 프로토콜입니다. UDP는 TCP와 달리 데이터 전송 전 연결의 수립을 필요로하지 않으며, 데이터의 전송 순서나 전달 여부를 보장하지 않습니다. 신뢰성을 희생하여 전송 속도를 높인 방식이라고 할 수 있겠습니다. UDP의 헤더는 다음과 같은 네 가지 정보들이 포함되며, 각각 16비트씩 총 8바이트의 길이로 구성됩니다. UDP는 주로 실시간 영상 스트리밍 서비스(영상 통화, 인터넷 방송 등)나 온라인 게임 등에서 사용됩니다.
- 발신지 포트 (source port): 데이터그램의 발신지 프로세스에서 사용된 포트 번호로, 수신자의 응답이 필요할 때 사용됩니다.
- 목적지 포트 (destination port): 데이터그램이 전달될 프로세스가 사용중인 포트 번호입니다.
- 길이 (length): 헤더와 페이로드를 합친 데이터의 총 길이를 나타냅니다.
- 체크섬 (checksum): 네트워킹에서 데이터의 무결성을 검사하기 위해 사용되는 값 입니다. UDP 헤더와 페이로드, 그리고 IP 헤더 등을 통해 체크섬 값을 계산하는데, UDP는 오류 제어나 흐름 제어가 없으며 오류 보고는 보통 IP나 ICMP에서 담당하기 때문에 이 필드는 잘 사용되지 않는다고 합니다. 이 값을 계산하지 않는 경우 0으로 설정합니다.
TCP의 경우 4-Way Handshake를 통해 연결을 종료하지만, UDP는 데이터의 전송을 언제 종료해야 하는지 자체적으로 알 수 있는 기능이 없기 때문에 이를 어플리케이션 단에서 정의해줘야 합니다.
3. TCP 오류, 흐름, 혼잡 제어란?
1) 오류 제어:
앞서 TCP 통신은 데이터를 송신한 뒤 ACK 응답을 받는다고 했는데, 네트워크나 호스트의 사정에 따라 ACK응답을 받지 못하게되는 경우,
혹은 NACK이라는 부정 응답을 돌려받는 경우에러가 발생한 것으로 간주합니다. TCP는 여러가지 에러 상황에 대한 오류 제어 기법들이 있습니다.- Stop And Wait: ACK 응답 대기 시 timeout에 도달하면 이전에 전송한 데이터를 다시 전송합니다.
- Go Back N: 연속적으로 데이터를 보내서 에러 발생 지점을 찾아내는 방식입니다. 수신측이 ACK을 통해 데이터를 요청하고, 에러 지점 발견 시 ACK을 보내 줘서 송신자가 해당 지점부터 데이터를 다시 전송하도록 조율합니다. 이때, 기존에 수신한 에러 지점 이후의 데이터는 폐기합니다.
- Selective Repeat: Go Back N과 비슷하지만 에러가 발생한 부분의 데이터만 다시 전송하는 방식입니다. 언뜻 더 괜찮아 보이지만, 에러 지점 이후의 데이터를 폐기하지 않고 재전송 받은 데이터를 수신 버퍼에 집어넣기 위해 정렬 과정을 거치게 됩니다. 따라서 재전송이 더 빠른 상황에서는 Go Back N을, 재정렬이 더 빠른 상황에서는 Selective Repeat을 사용합니다.
2) 흐름 제어 (Flow Control):
포트에 바인딩된 프로세스의 데이터 처리 속도가 느려서 수신 속도를 따라가지 못하게 되는 경우 추가로 수신된 데이터는 버려지게 되는데, 이렇게 데이터가 버려지면 송신지에서 해당 세그먼트에 대한 ACK 응답을 받지 못하게 되어 추가로 데이터를 송신하게되고, 이 데이터도 다시 버려지는 식의 현상이 반복되면서 네트워크 리소스가 낭비되고 정체가 일어나게 됩니다. 흐름 제어는 이러한 현상을 방지하기 위해 지나치게 많은 데이터가 송신되지 않도록 하는 기법입니다. 앞서 언급했듯이 TCP 헤더에는 여유 수신 버퍼의 크기를 기재하는 수신 윈도 옵션이 있는데, 이를 통해 데이터 송신측이 보내는 데이터의 크기를 제한하거나 수신 측의 처리 속도에 맞춰 대기하도록 조율합니다. 이러한 방식을 sliding window라고 부르며, 특별한 경우가 아니라면 대부분의 TCP에서 이 방식을 사용한다고 합니다.
만약 수신 윈도의 크기가 0인 상태에서 뒤이은 ACK 응답이 유실되는 경우 TCP가 deadlock 상태에 빠질 수 있는데, 이를 방지하기 위해서 수신 윈도의 크기가 0일 때는 persist timer가 시작되고, 이 값이 만료되는 시점에서 작은 패킷을 한 번 전송하여 수신지의 윈도 상태를 확인하게 됩니다.
3) 혼잡 제어 (Congestion Control):
흐름 제어 기법은 송신측이 수신 속도가 느린 호스트를 많은 데이터로 압도하는 것을 방지하지만, 느린 네트워크나 라우터에 발생하는 과부하를 방지하는 못합니다. 많은 패킷이 거쳐가는 라우터에서 병목 현상이 발생하는 것은 흔한 일인데, 이런 식으로 한 곳에 데이터의 흐름이 집중되는 것을 막기 위해 혼잡 제어 기법이 사용됩니다. 혼잡 제어 기법은 수신측의 수신 윈도 크기와 상관 없이 송신측이 확인 응답률과 누락률을 통해 특정한 값을 도출하여 자체적으로 ACK 없이 보낼 수 있는 데이터의 한도를 제한합니다.
--
REFERENCES:
> 강의 노트, "9강. OSI 7계층", 김태선 튜터님 (스파르타)
https://teamsparta.notion.site/10-HTTP-HTTPS-1dee0f1d7f5d4e979ca38a4e159c4f72
> 강의 노트, "10강. HTTP/HTTPS", 김태선 튜터님 (스파르타)
> TheBook, "멀티플레이어 게임 프로그래밍", 조슈아 글레이저, 산제이 마드하브 공저 / 장준혁 역
https://www.cloudflare.com/learning/ddos/glossary/open-systems-interconnection-model-osi/
> Cloudflare, "What is the OSI Model?"
https://www.geeksforgeeks.org/tcp-ip-model/
> GeeksForGeeks, "TCP/IP Model"
https://www.geeksforgeeks.org/differences-between-tcp-and-udp/
> GeeksForGeeks, "Difference between TCP and UDP"
http://www.ktword.co.kr/test/view/view.php?no=1889
> 정보통신기술용어해설, "TCP Header"
https://www.geeksforgeeks.org/tcp-ip-packet-format/
> GeeksForGeeks, "TCP/IP Packet Format"
https://www.geeksforgeeks.org/user-datagram-protocol-udp/
> GeeksForGeeks, "User Datagram Protocol (UDP)"
https://ipcisco.com/lesson/network-ports/
> Cisco, "Network Ports"
https://en.wikipedia.org/wiki/Transmission_Control_Protocol
> Wikipedia, "Transmission Control Protocol"
https://evan-moon.github.io/2019/11/22/tcp-flow-control-error-control/
> "패킷의 흐름과 오류를 제어하는 TCP" by Evan Moon
728x90'TIL-sparta' 카테고리의 다른 글
[TIL] 타워 디펜스 팀 프로젝트 진행 (D-3) (0) 2024.06.19 [TIL] 타워 디펜스 팀 프로젝트 발제 (D-4) (0) 2024.06.17 프로그래머스) 멀쩡한 사각형 풀이 (Java) (2) 2024.06.15 [TIL] 심화 주차 개인 과제 제출 (D-Day) (0) 2024.06.14 [TIL] 심화 주차 개인 과제 (Chrome Dino Web Socket Server) 진행 (D-1) (2) 2024.06.13