[혼공네트] Chapter 04. 전송 계층 (4주차)

한샛코드·2025년 1월 18일
0
post-thumbnail

04-1. 전송 계층 개요 : IP의 한계와 포트

신뢰할 수 없는 통신과 비연결형 통신

  1. 비신뢰성 통신 - IP가 패킷을 수신지까지 제대로 전송하였다는 것을 보장하지 않음
    • 이러한 특징을 최선형 전달(best effort delivery)라고도 부름
    • 패킷이 손상되거나 중복으로, 혹은 순서를 섞어서 전송하였더라도 확인하지 않음
  2. 비연결형 통신 - 패킷을 보내기 전, 호스트 간 사전 연결 수립 작업거치지 않음

IP의 한계를 보완하는 전송 계층

  • TCP - 연결형 통신신뢰성 통신을 지원하는 전송 계층의 프로토콜
    • 가상의 회선을 설정하듯이 연결을 수립함
    • 재전송을 통해 패킷의 오류 제어, 흐름 제어, 혼잡 제어 등 다양한 기능을 제공함
  • UDP - 비연결형 통신신뢰할 수 없는 통신을 지원하는 전송 계층의 프로토콜
    • TCP보다 비교적 빠른 전송 가능

응용 계층과의 연결 다리, 포트

포트의 정의

  • 포트(port) - 호스트 내의 특정 애플리케이션을 식별하기 위한 정보
    • 포트 개념이 없으면, 패킷이 수신되더라도 어떠한 애플리케이션으로 전달해야 할지 알 수 없음

포트의 분류

1️⃣ 패킷 내 송·수신지 포트 번호를 통해 송·수신지 호스트의 특정 애플리케이션을 식별함
2️⃣ 포트 번호는 일반적으로 IP 주소와 함께 [ IP 주소 : 포트 번호 ] 형식으로 표기함

  • 포트 번호는 번호와 범위에 따라 잘 알려진 포트, 등록된 포트, 동적 포트로 나뉨
    1. 잘 알려진 포트(well known port) - 범용적으로 사용되는 애플리케이션 프로토콜이 주로 사용함
    2. 등록된 포트(registered port) - 흔히 사용되는 애플리케이션 프로토콜에 할당하기 위해 사용함
    3. 동적 포트(dynamic port; 사설 포트, 임시 포트) - 자유롭게 사용할 수 있음

포트 기반 NAT

NAPT (Network Address Port Translation)

  • NAPT - 포트를 활용해 하나의 공인 IP 주소여러 사설 IP 주소공유할 수 있게 하는 NAT의 일종
    • NAT 변환 테이블에 사설/공인 IP 주소와 더불어 포트 번호도 함께 기록하고 변환함

좀 더 알아보기 ① : 포트 포워딩

  • 포트 포워딩(port fowarding) - 사전에 호스트에 IP 주소 및 포트 번호를 할당하고, 해당 호스트에게 패킷을 전달하는 기능
  • 처음 외부 호스트에서 패킷을 전송할 때, 어떤 IP 주소 및 포트로 보내야할지 결정하기 위해 사용함
  • 할당한 IP 주소와 포트 번호를 패킷을 송신하려는 외부 호스트에 알려주면 됨

좀 더 알아보기 ② : ICMP (Internet Control Message Protocol)

  • ICMP - IP의 비신뢰성/비연결성 특징을 보완하기 위한 프로토콜
    • IP 패킷의 전송 과정에 대한 피드백 메시지(ICMP 메시지)를 얻기 위해 사용함
  • ICMP 메시지는 타입(ICMP 메시지의 유형)코드(구체적인 메시지 내용)로 정의됨
  • 다만, ICMP가 IP의 비신뢰성 특성을 보완하기 위한 역할이지, 완전히 보장하는 것은 아님

04-2. TCP와 UDP

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

1️⃣ TCP 통신은 ① 연결 수립② 데이터 송·수신③ 연결 종료 과정의 단계를 거침
2️⃣ 데이터 송·수신중 과정에서 재전송을 통한 오류 제어, 흐름 제어, 혼잡 제어를 제공함

ℹ️ MSS(Maximum Segment Size) - TCP로 전송할 수 있는 최대 페이로드 크기
단, 크기를 고려할 때 TCP 헤더의 크기는 제외함 (헤더 크기를 포함했던 MTU 크기와 대조적))

  1. 송·수신지 포트 - 호스트의 특정 애플리케이션을 식별하는 포트 번호가 명시됨
  2. 순서 번호(sequence number) - 세그먼트 데이터의 첫 바이트에 부여되는 번호
    • 수신되는 세그먼트의 올바른 순서를 보장하기 위함
    • 초기 순서 번호 - SYN 플래그가 1로 설정된 세그먼트의 무작위로 부여된 순서 번호
      • 연결 수립 이후의 순서 번호는 [초기 순서 번호 + 송신한 바이트 수]임
  3. 확인 응답 번호(ACK number) - 다음으로 수신하기를 기대하는 순서 번호가 명시됨
    • 상대 호스트가 송신한 세그먼트에 대한 응답임
    • ACK 플래그를 1로 설정하고, (일반적으로) 수신한 순서 번호에 1을 더한 값
  4. 제어 비트(contorl bits; flag bits) - 세그먼트의 부가 정보가 명시됨
    • ACK(세그먼트의 승인을 나타냄), SYN(연결을 수립하기 위한 비트), FIN(연결을 해제하기 위한 비트)
  5. 윈도우(window) - 수신 윈도우(한 번에 수신하고자 하는 데이터의 양)의 크기가 명시됨

TCP 연결 수립과 종료

연결 수립 : 쓰리 웨이 핸드셰이크

  • 쓰리 웨이 핸드셰이크(three-way handshake) - 3단계로 이루어진 TCP의 연결 수립 과정
    1. SYN 세그먼트 (AB) - 호스트 A호스트 B와의 연결을 시도함
      • 호스트 A의 초기 순서 번호
    2. SYN + ACK 세그먼트 (BA) - 호스트 B호스트 A의 세그먼트에 응답하고, 연결을 시도함
      • 전송된 세그먼트에 대한 확인 응답 번호, 호스트 B의 초기 순서 번호
    3. ACK 세그먼트 (AB) - 호스트 A호스트 B의 세그먼트에 응답하여 연결함
      • 전송된 세그먼트에 대한 확인 응답 번호, 호스트 A의 다음 순서 번호
  • 액티브 오픈(active open) - 처음 연결을 시도하는 호스트의 연결 수립 과정 (서버)
  • 패시브 오픈(passive open) - 연결을 요청을 받는 호스트의 연결 수립 과정 (클라이언트)

연결 종료

  1. FIN 세그먼트 (AB) - 호스트 A호스트 B와 연결 종료를 시도함
  2. ACK 세그먼트 (BA) - 호스트 B호스트 A의 세그먼트에 응답함 (확인 응답 번호)
  3. FIN 세그먼트 (BA) - 호스트 B호스트 A와 연결 종료를 시도함
  4. ACK 세그먼트 (AB) - 호스트 A호스트 B의 세그먼트에 응답하여 연결을 종료함 (확인 응답 번호)
  • 액티브 클로즈(active close) - 먼저 연결을 종료하는 호스트의 연결 종료 과정
  • 패시브 클로즈(passive close) - 연결 종료 요청을 받아들이는 호스트의 연결 종료 과정

TCP 상태

  • TCP 상태(state) - 현재 어떤 통신 과정에 있는지를 나타내는 정보
    • 이런 점에서 TCP를 스테이트풀 프로토콜(stateful protocol)이라고도 부름

연결이 수립되지 않은 상태

  • CLOSED - 어떠한 연결도 없는 상태
  • LISTEN - 연결 대기 상태 (일반적인 패시브 오픈 호스트의 상태)
    • 다르게 말하면, SYN 세그먼트를 기다리는 상태라고 할 수 있음

연결 수립 상태

  1. SYN-SENT - 액티브 오픈 호스트가 SYN 세그먼트를 보내고 SYN+ACK 세그먼트를 기다리는 상태
  2. SYN-RECEIVED - 패시브 오픈 호스트가 SYN+ACK 세그먼트를 보내고 ACK 세그먼트를 기다리는 상태
  3. ESTABLISHED - 두 호스트 간에 연결이 수립된 상태

연결 종료 상태

  1. FIN-WAIT-1 - 액티브 클로즈 호스트FIN 세그먼트를 보내고 해당 상태로 접어듦
  2. CLOSE-WAIT - 패시브 클로즈 호스트ACK 세그먼트를 보내고 해당 상태로 접어듦
  3. FIN-WAIT-2 - 액티브 클로즈 호스트가 ACK 세그먼트를 받고 FIN 세그먼트를 기다리는 상태
  4. LAST-ACK - 패시브 클로즈 호스트가 FIN 세그먼트를 보내고 ACK 세그먼트를 기다리는 상태
  5. TIME-WAIT - 액티브 클로즈 호스트FIN 세그먼트를 수신 후 ACK 세그먼트를 보냄
    • 패시브 클로즈 호스트는 ACK 세그먼트를 수신하면 CLOSED 상태로 돌아감
    • 엑티브 클로즈 호스트는 TIME-WAIT 상태에서 일정 시간이 지난 뒤 CLOSED 상태로 돌아감
      • ACK 세그먼트가 올바르게 전송되지 않았을 수도 있기 때문에 기다리는 과정을 거침

UDP 데이터그램 구조

  • UDP는 (TCP와 달리) 연결 수립 및 제어를 수행하지 않고, 상태를 유지하지도 않음
    • 이런 점에서 UDP를 스테이트리스 프로토콜(stateless protocol)이라고도 부름
  • UDP 데이터그램 구조
    1. 송·수신지 포트 - 호스트의 특정 애플리케이션을 식별하는 포트 번호가 명시됨
    2. 길이 - 헤더를 포함한 UDP 데이터그램의 바이트가 명시됨
    3. 체크섬 - 데이터그램 전송 과정에서 오류가 발생했는지 점검하기 위한 필드
      • 신뢰성(수신지까지 정상적으로 전달)과는 무관함
  • UDP는 TCP에 비해 적은 오버헤드로 패킷을 빠르게 처리할 수 있음 (ex. 실시간 스트리밍)

04-3. TCP의 오류·흐름·혼잡 제어

오류 제어 : 재전송 기법

오류 검출과 재전송

ℹ️ TCP는 중복된 ACK 세그먼트를 수신했거나, 타임아웃이 발생했을 때 세그먼트를 재전송

  1. 중복된 ACK 세그먼트를 수신하였을 때
    • 받은 세그먼트의 순서 번호 중에서 일부가 누락되면 중복된 ACK 세그먼트를 전송하게됨
  2. 타임아웃이 발생했을 때
    • TCP 세그먼트를 송신하는 모든 호스트는 재전송 타이머(retransmission timer) 값을 유지함
      • 호스트가 세그먼트를 전송할 때마다 재전송 타이머를 시작함
    • 타임아웃이 될 때까지 ACK 세그먼트를 전송 받지 못하면,
      세그먼트를 정상적으로 전송하지 못하였다고 판단하고 재전송을 시도함

ARQ : 재전송 기법

ℹ️ ARQ(Automatic Repeat Request) - 문제가 생긴 세그먼트를 재전송함으로써 신뢰성을 확보함

  1. Stop-and-Wait ARQ - 정상 전달되었음을 확인하기 전까지는 새로운 세그먼트를 전송하지 않음
    • 단, 이러한 방식으로 인해 네트워크 이용 효율성이 낮아질 수 있음
  2. Go-Back-N ARQ - 파이프라이닝을 활용해 여러 세그먼트를 한 번에 보내고,
    도중에 잘못 전송된 세그먼트가 있을 경우 해당 세그먼트부터 전부 다시 전송함
    • 즉, ACK 세그먼트는 n번만 확인했다는 응답이 아닌, n번까지 확인했다는 의미임
    • 이런 점에서 ACK 세그먼트를 누적 확인 응답(Cumulative ACK)이라고 할 수 있음
  3. Selective Repeat ARQ - 수신 호스트에서 정상 전송받은 패킷에 대해서만 ACK 세그먼트를 보냄
    • 송신 호스트는 응답받지 못한 세그먼트가 있다면, 해당 세그먼트를 재전송을 시도함
    • 즉, ACK 세그먼트는 개별 확인 응답(Selective ACK)이라고 할 수 있음

흐름 제어 : 슬라이딩 윈도우

  • 흐름 제어(flow control) - 수신 호스트의 처리 속도를 고려하여 송·수신 속도균일하게 유지하는 것
    • Go-BACK-N ARQ 및 selectvie Repaet ARQ에서 흐름 제어가 필요함
  • 윈도우(window) - 송신 호스트가 파이프라이닝할 수 있는 최대량
    • 송신 측의 윈도우(송신 윈도우)는 수신 측의 윈도우(수신 윈도우)를 바탕으로 알 수 있음
    • 윈도우의 크기만큼 확인 응답을 받지 않고 한 번에 전송 가능함 (슬라이딩 윈도우 사용)

혼잡 제어

  • 혼잡(congestion) - 많은 트래픽으로 인해 패킷 처리가 늦어지거나 유실될 우려가 있는 네트워크 상황
    • 혼잡 붕괴(cogestion collapse) - 혼잡으로 인해 전송률이 크게 떨어지는 현상
  • 송신 호스트는 네트워크의 혼잡도를 판단하고, 혼잡 윈도우만큼을 전송함
    • 혼잡 윈도우 - 혼잡 없이 전송할 수 있을 듯한 데이터 양
      • 크기는 송신 호스트가 어느 정도 세그먼트를 전송하고, 혼잡 제어 알고리즘에 의해 결정함

ℹ️ AIMD(Additive Increase Multiplicative Decrease) - 혼잡이 감지되지 않으면 RTT 값마다 혼잡 윈도우를 1씩 증가시키고, 감지되면 혼잡 윈도우를 절반으로 떨어뜨리는 알고리즘

  1. 느린 시작(slow start) - 혼잡 윈도우를 1부터 시작하여 정상적으로 수신된 ACK 세그먼트마다 1씩 증가시키는 알고리즘
  2. 혼잡 회피(congestion avoidance) - RTT마다 혼잡 윈도우를 1MSS씩 증가하는 알고리즘
  3. 빠른 회복(fast recovery) - 느린 시작을 건너뛰고 혼잡 회피를 수행하는 알고리즘

ℹ️ 혼잡이 감지되면 다음 세 가지 방법 중 하나를 선택하게 됨

  1. 타임아웃 발생 - 혼잡 윈도우 값을 1로, 느린 시작 임계치를 혼잡 감지 시점의 혼잡 윈도우 값의 절반으로 초기화한 뒤, 느린 시작을 재개함
  2. 혼잡 윈도우 >= 느린 시작 임계치 - 느린 시작을 종료하고 혼잡 윈도우를 절반으로 초기화한 뒤, 혼잡 회피를 수행
  3. 세 번의 중복 ACK 발생 - 빠른 재전송 후에 빠른 회복을 수행함

숙제

기본 숙제

  1. IP와 연관된 통신 특정으로 알맞은 단어를 <보기>에서 골라 보세요.
    <보기> 신뢰성, 연결형, 비신뢰성, 비연결형
    • 신뢰성과 연결형은 전송 계층(TCP)의 특징임
  2. 다음은 TCP쓰리 웨이 핸드셰이크 과정을 나타내는 그림입니다. 괄호 안에 들어갈 말을 <보기>에서 골라 보세요.
    <보기> SYN, ACK, FIN
    • 호스트 A가 호스트 B가 보낸 SYN 세그먼트에 응답하기 위해 ACK 세그먼트를 전송함

추가 숙제

ℹ️ [ CTRL + SHIFT + ESC ] 키를 동시에 누르고, 우측 [자세히] 탭을 들어가면 볼 수 있음


회고

이번 차시는 다른 차시에 비해서 많이 복잡해서 이전 차시까지의 내용과 연관지어 머릿속에서 정리하기 까다로운 듯한 느낌이 들었다. 아무래도 이 부분에 대해서는 반복적인 학습이 필요할 것 같다. 그리고, 이번 차시와 관련한 내용을 경험 측면에서도 볼 수가 있었는데, 파일 다운로드 초반 속도가 느린 이유를 TCP의 혼잡 제어 알고리즘 중 하나인 '느린 시작'의 영향으로 볼 수 있다는 것을 깨달았다. 이런 사례처럼 공부를 하면 할 수록 일상속에서 당연하게 생각하고 단순히 흘려보냈던 것들의 원리를 알고나니 네트워크에 대한 공부가 점점 더 재미있어지는 것 같다고 생각한다.

profile
개발도 하고 요리도 하는 노근본 개발자

0개의 댓글

관련 채용 정보