Blog on Iterating

전송 계층

네트워크 계층이 호스트-호스트 데이터 전달을 다루었고, 응용 계층은 프로세스-프로세스 간 신뢰성 있는 통신이 필요하다.

이를 위한 서비스를 제공하는 것이 전송계층이다. 응용 계층에 신뢰성, 순서 제어, 흐름 제어를 제공한다.

주소 지정

네트워크 계층은 IP까지만 구분한다. 전송 계층은 호스트 내에서 여러 프로세스를 구분하기 위해 port번호를 사용한다.

연결 설정

두 프로세스는 서로 준비 상태임을 확인해야 한다. 핸드셰이크를 이용한다.

연결 해제

한쪽만 닫으면 데이터가 유실되기 때문에, 양쪽이 동기화하며 안전하게 닫아야 한다. 4 way를 이용한다.

오류 제어

네트워크를 이동하는 패킷은 손실, 손상이 발생할 수 있다. 검출, 재전송, 순서 보장으로 오류를 제어한다.

흐름제어

송신 속도가 너무 빠르면 수신쪽에서 데이터가 유실될 수 있다. 슬라이딩 윈도우로 정해진 크기 이상의 데이터를 전송하는 것을 막는다.

다중화

여러 응용 프로세스가 동시에 같은 네트워크를 공유. 목적지의 구분은 포트로 이루어지며 수신측에서 포트별로 분리한다.

혼잡 제어

전체 네트워크를 대상으로 라우터가 과부화되지 않게 조절. 네트워크 사용량을 넘지 않으면서 가능한 많은 송신자에게 공평한 자원 제공을 목적으로 한다. 공정성과 효율성을 높이는 것을 하지만 이 둘은 서로 trade-off 관계이다.

  • 사전적 제어(Open-loop)

    • 혼잡 발생 전 예방

    • 설계 단계에서 최적화 제어

  • 피드백 제어(Closed-loop)

    • 패킷 손실, RTT 증가, 라우터의 ECN 비트와 같은 혼잡을 감지하고 반응

UDP(User Datagram Protocol)

  • 연결/해제가 없는 비연결 통신 - 단순하고 빠름

  • 신뢰성을 보장하지 않는 best-effort 전달 - 손실 / 중복 발생 가능. 혼잡 제어가 없어 네트워크 과부하 시 성능 악화

  • 단순한 작은 헤더

  • 브로드캐스트 / 멀티캐스트 가능

  • 실시간 서비스, 간단하고 빠른 통신에 적합. DNS. VoIP, RPC(짧은 메세지 교환 시). 게임 네트워킹

TCP(Transmission Control Protocol)

  • 소켓을 이용한 통신. 포트번호로 응용 프로세스 구분

  • 연결지향 - 연결(3-way handshake), 연결해제(4-way handshake). 연결 상태는 소켓의 state machine으로 확인

  • 신뢰성 보장 - 손실/중복/순서바뀜을 모두 해결.

  • 바이트 스트림 서비스(Byte-stream service) - 응용이 보낸 데이터는 경계가 없는 바이트 스트림 전송

  • Full-duplex - 양방향 동시 전송 가능

  • keep-alive

  • 세그먼트 단위로 전송

  • 혼잡제어 알고리즘

    • slow start

    • congestion avoidance

    • fast retransmit

    • fast recovery

연결성과 신뢰성

  • 연결성 - 데이터를 주고 받기 전에 논리적인 연결 상태를 만드는 것. 서로의 상태를 논리적으로 알고 있는지.

  • 신뢰성 - 실제 전송한 데이터가 손실, 중복, 순서바뀜 없이 도착하는 것을 보장하는 것.

성능이슈

TCP 개발 당시 네트워크 기술이 발달하지 못했기 때문에 TCP 윈도우의 크기는 네트워크 대역폭에 비해서 작은편이다. 이로 인해서 발달된 네트워크 대역폭을 제대로 사용하지 못하게 되었다. 그리고 매 패킷마다 헤더를 처리하기 때문에 전송량이 큰 네트워크에서는 프로세스 부하가 커지게 된다.

이를 해결하기 위해서는 다음이 제안된다.

  • 호스트 설계 (Host Design for Fast Networks)

    • 빠른 네트워크를 위해 커널 네트워크 스택 최적화 필요.

    • 데이터 복사를 줄이는 zero-copy I/O 기술 -> CPU 메모리 복사 감소.

    • 네트워크 인터페이스 카드(NIC) 오프로딩 (체크섬 계산, 세그먼트 분할 오프로딩) -> CPU 계산 위임 (체크섬, 분할 등).

  • 빠른 세그먼트 처리 (Fast Segment Processing - 커널 내 최적화)

    • 수많은 패킷을 처리하기 위한 효율적인 큐 관리.

    • 인터럽트 줄이기 (NAPI 같은 polling 기반).

    • 커널 bypass 기법(커널 경유 자체를 피하는 대안적 접근, DPDK 등)도 현대에 많이 연구됨.

  • 헤더 압축 (Header Compression)

    • TCP/IP 헤더는 40바이트 이상 → 작은 패킷에선 비효율.

    • 링크 특성(예: 저속 무선망)에서는 압축하여 전송 효율 개선.

    • 예: Van Jacobson TCP 헤더 압축.

  • 긴 지연·고속 네트워크 지원 (Protocols for Long Fat Networks)

    • 전통 TCP는 윈도우 크기 한계(16비트 → 최대 65KB).

    • 윈도우 스케일 옵션(Window Scale Option): 더 큰 윈도우 허용 → 고속망 활용 가능.

    • TCP Vegas, TCP Cubic, BBR 등 새로운 혼잡 제어 알고리즘 등장.