네트워크

[04] 전송 계층

BGK97 2024. 6. 23. 16:33

전송 계층 개요: IP의 한계와 포트

네트워크 계층 IP의 한계

  • 전송계층은, 신뢰할 수 있는 통신과 연결형 통신이 가능
    • 응용 계층의 애플리케이션 프로세스들을 식별하는 역할 수행

  • 네트워크 계층의 핵심 프로토콜인 IP는 단편화와 주소 지정을 수행
  • 이외에 IP의 한계점이 크게 두가지 있는데
    1. 비신뢰성 통신
    2. 비연결형 통신

비신뢰성 통신

  • IP 프로토콜이 패킷이 수신지까지 제대로 전송되었다는 보장을 하지않는 특징
  • 통신 과정에서 데이터 손상, 중복 패킷이 전송되더라도 확인하지 않고, 재전송도 하지 않음
  • 순차적으로 패킷이 도착할 것이라는 보장도 없음
    • 최선형 전달(Best Effect Delivery)라고도 함
  • 결과에 대한 보장이 없음

비 연결형 통신

  • 송수신 호스트 간 사전 연결 수립 작업을 거치지 않음
    • 수신지를 향해 패킷을 보내기만 함

IP가 비신뢰성, 비연결형 통신을하는 이유

  • 주요 이유는 성능 때문
    • 신뢰성 및 연결형은 패킷의 빠른 송수신과 배치되는 작업
    • 시간과 대역폭, 부하가 요구되어 성능상의 악영향으로 이어질 가능성이 있음
  • 실시간 스트리밍 서비스, 실시간 통화처럼 패킷 손실을 감수 하더라도 빠른 전송이 우선됨

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

1. 전송계층은 연결형 통신을 가능하게 함

  • 연결형 통신을 지원하는 대표적인 프로토콜로 TCP가 있음
  • TCP는 두 호스트가 정보를 받기 전, 가상의 회선을 설정하듯이 연결 수립
    • 송수신 동안에는 연결을 유지, 끝나면 연결 종료 가능

2. 전송 계층은 신뢰성 있는 통신이 가능하게 함

  • 이 또한 TCP를 통해 가능
  • TCP는 패킷이 수신지 까지 올바른 순서대로 확실하게 전달되는 것을 보장
    • 재전송을 통한 오류, 흐름, 혼잡 제어 등 다양한 기능 제공
무조건 연결형 통신과 신뢰성 통신이 좋은가?
- 답은 X, 때로는 비교적 높은 성능을 위해 비신뢰성, 비연결형을 지원하는 프로토콜이 필요
- 전송계층에서는 이를 UDP라고 부름

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

프로세스란?

  • 실행중인 프로그램을 의미
  • 프로그램이 실행되는 순간 프로세스가 되어 메인 메모리에 적재
  • 각 프로세스는 PID 번호로 식별

포트란?

  • 네트워크 외부에서, 파일을 구성하는 패킷이 라우팅 되어 컴퓨터로 도착했다 해도, 수신이 끝난 것이 아님
  • 패킷은 실행중인 특정 애플리케이션 프로세스까지 전달되어야 함
    • 전송에서도 마찬가지로, 특정 애플리케이션 프로세스까지 전달
    • 패킷의 최종 목적지는, 특정 애플리케이션 프로세스
    • 이 특정 애플리케이션 프로세스를 식별할 수 있는 정보를 포함한 것이 포트임

포트의 분류

  • 포트 번호를 통해 특정 애플리케이션 식별
  • TCP와 UDP는 모두 포트 번호 필드인 송신지 포트, 수신지 포트 번호 포함
  • 포트 번호는 16비트로 표현 가능
  • 0번부터 65535번 까지 포트번호는 범위에 따라 잘 알려진 포트, 등록된 포트, 동적 포트로 구성

잘 알려진 포트 (Well Known Port)

  • 0번부터 1023번까지의 포트 번호
  • 시스템 포트라 부르기도 함
  • 범용적으로 사용되는 프로토콜이 일반적으로 사용하는 포트 번호

등록된 포트 (Registered Port)

  • 포트번호 1024번부터 49151번 까지의 포트
  • 덜 범용적이지만, 흔히 사용되는 애플리케이션 프로토콜에 할당하기 위해 사용

동적 포트 (Dynamic Port)

  • 사설 포트, 임시포트라고도 함
  • 인터넷 할당 번호 관리 기관에 의해 할당된 애플리케이션 프로토콜이 없고, 특별히 관리되지 않음
  • 자유롭게 사용가능
  • 주로 클라이언트로서 동작하는 프로그램이 사용
    • 대표적으로 웹 브라우저가 있음

  • IP 주소와 포트 번호가 함께 주어지면, 특정 호스트에서 실행중인 특정 애플리케이션 프로세스를 식별 가능
  • 일반적으로 IP주소 : 포트번호 형식으로 함께 표기하는 경우가 많음

포트 기반 NAT인 NAPT

  • NAT란 IP주소를 변환하는 기술
  • 주로 네트워크 내부에서 사용되는 사설 IP주소와 외부에서 사용되는 공인 IP주소를 변환하는데 사용

NAT 변환 테이블

  • 사설, 공인 IP 변환을 위해 주로 사용되는 테이블
  • 테이블에는 변환의 대상이 되는 IP 주소 쌍 명시

  • 테이블에는 변환의 대상이 되는 IP 주소가 일대일로 대응 (사설 1 : 공인 1)
  • 이 방식만으로는 많은 사설 IP를 변환하기에는 어려움이 있음
    • 사설 IP만큼이나 공인 IP가 필요하기 때문에...
  • 오늘 날에는 1대1이 아닌, 다수의 사설 IP를 그보다 더 적은 공인 IP 주소로 변환하는 과정을 거침
  • 이를 NAPT라고 함

NAPT

  • 포트 기반의 NAT
  • 포트를 활용하여 하나의 공인 IP 주소를 여러 사설 IP 주소가 공유할 수 있도록 함

  • 같은 공인 IP로 변환되더라도, 포트번호가 다르기 때문에 구분 지을 수 있음
  • NAPT를 사용하면 네트워크 내부에서 사용할 IP주소와, 외부에서 사용할 IP를 N:1로 관리가 가능

포트 포워딩 (Port Forwarding)

  • 네트워크 내 특정 호스트에 IP 주소와 포트 번호를 미리 할당하여, 해당 IP 주소: 포트번호로 호스트에게 패킷을 전달하는 기능
  • 네트워크 외부에서 내부로 통신을 시작할 때, 네트워크 내부의 서버를 외부에서 접속할 수 있도록 접속 정보를 공개하기 위해 자주 사용하는 기법

네트워크 계층에서 비신뢰성과 비연결형을 보완하기위한 프로토콜, ICMP

  • Internet Control Message Protocol
  • IP 패킷의 전송과정에 대한 피드백 메세지를 얻기위해 사용
  • 타입과 코드로 정의되어, ICMP 패킷 헤더에 포함됨
  • 타입 필드에는 메시지 유형이 번호로 명시, 코드 필드에는 구체적인 메세지 내용이 명시
  • 오류 보고는 아래와 같음

  • 네트워크 정보 제공을 위한 ICMP 메시지

  • 우리가 흔히 사용하는 traceroute, tracert나 ping 등은 이 ICMP 메세지를 기반으로 구현
  • 그러나 ICMP가 IP의 신뢰성을 보장하는 것이 아님
    • 보완만 하는 것이지, 완벽한 전달을 보장하는 것은 아님
    • 완벽하게 보장하기 위해서는 전송계층의 프로토콜인 TCP 가 필요

TCP와 UDP (Transmission Control Protocol & User Datagram Protocol)

  • TCP 는 신뢰할 수 있는 통신을 위한 연결형 프로토콜
  • UDP는 TCP보단 신뢰성은 떨어지나 빠른 통신이 가능한 비연결형 프로토콜

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

  • TCP 통신은 다음과 같이 세 단계로 나뉘어짐

  • TCP는 통신 전에 연결을 수립 후, 끝나면 연결 종료
  • 데이터 송수신 과정에서는 재전송을 통해 오류, 흐름, 혼잡 제어등 기능 수행

MSS와 TCP 세그먼트 구조 (Maximum Segment Size)

  • TCP의 연결 수립과 종료를 이해하기 위해 필요한 개념
  • MSS는 TCP로 전송할 수 있는 최대 페이로드 크기
    • MTU와 다르게, TCP 헤더 크기는 제외

  • TCP의 세그먼트 구조는 다음과 같음

  • 송신지 포트와 수신지 포트 ( Source Port & Destination Port)
    • 송신지 또는 수신지 애플리케이션을 식별하는 포트번호가 명시
  • 순서 번호 (Sequence Number)
    • 순서 번호가 명시
    • 송수신되는 세그먼트의 올바른 순서를 보장하기 위해 세그먼트 데이터의 첫 바이트에 부여되는 번호
  • 확인 응답 번호 (Acknowledgment Number)
    • 상대 호스트가 보낸 세그먼트에 대한 응답으로, 다음으로 수신하기를 기대하는 순서 번호 명시
  • 제어 비트 ( Control Bits )
    • 플래그 비트라고도 부름, 현재 세그먼트에 대한 부가정보를 나타냄
  • 윈도우 
    • 수신 윈도우의 크기가 명시
    • 수신 윈도우란, 한번에 수신하고자 하는 데이터의 양 

제어 비트

  • 제어 비트 필드는 기본적으로 8비트로 구성
  • 각 자리의 비트는 각각 다른 의미를 가짐
  • TCP의 기본동작을 논할 때 자주 언급되는 세 개의 제어비트는 다음과 같음

순서 번호와 확인 응답 번호

  • TCP의 신뢰성을 보장하기 위해 사용되는 중요한 필드
    • 한 쌍으로 묶어서 생각하면 편함
  • 순서 번호란 세그먼트의 올바른 송수신 순서를 보장하기 위한 번호, 데이터의 첫 바이트에 부여

  • 위의 1900바이트 크기의 데이터는 MSS 단위로 전송 가능
    • MSS가 500바이트 일 때, 4개의 세그먼트로 쪼개기 가능

  • 처음 통신을 위해 연결을 수립하면, SYN가 1로 설정된 세그먼트의 경우 순서번호는 무작위 값이 됨
    • 이를 초기 순서 번호(ISN, Initial Sequence Number)라고 함

  • 연결 수립 이후에 순서 번호는 송신한 바이트를 더해가는 형태로 누적 값을 가짐
    • 초기 순서 번호 + 송신한 바이트 수
    • 혹은 초기 순서 번호 + 떨어진 바이트 수
    • 이 때 순서번호는 세그먼트 상에서 32비트로 표현, 만약 표현 가능한 수를 넘어서면 0부터 다시 증가

  • 확인 응답 번호는 순서 번호에 대한 응답
    • 수신자가 다음으로 받기를 기대하는 순서 번호
    • 일반적으로 수신한 순서 번호에 1을 더한 것으로 설정

TCP 연결 수립과 종료

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

  • 송수신을 위한 준비를 마치기 위해 다음과 같이 3단계를 거치는 것을 의미

  • 처음 연결을 시작하는 호스트의 연결 수립 과정을 액티브 오픈이라고 함
  • 주로 서버 - 클라이언트 관계에서 클라이언트에 의해 수행
  • 연결 요청을 받고나서 요청에 따라 연결 수립해주는 호스트도 있는데, 이를 패시브 오픈이라고 함
  • 주로 서버에 의해 수행

연결 종료

  • 데이터 송수신이 끝난 연결을 종료할 때 FIN과 ACK를 주고 받으며 연결 종료
  • 포 웨이 핸드셰이크 라고도 함

TCP 상태

  • 상태는 어떤 통신 과정에 있는지 나타내는 정보
  • TCP는 상태를 유지하고 활용하는 점에서 스테이트풀(Stateful) 프로토콜이라 함
  • TCP의 상태는 다음과 같음

연결이 수립되지 않은 상태

  • 연결 수립이 이루어지기 전의 호스트는 주로 CLOSED나 LISTEN 상태를 유지
  • CLOSED
    • 아무런 연결이 없는 상태
  • LISTEN
    • 일종의 연결 대기 상태
    • 서버로서 동작하는 패시븐 오픈 호스트는 LISTEN 상태 유지
    • LISTEN 상태는 SYN 세그먼트를 기다리는 상태
    • 클라이언트 호스트가 LISTEN 상태인 호스트에게 SYN 세그먼트를 보내면 쓰리 웨이 핸드 셰이크 시작

연결 수립 상태

  • TCP 연결 수립에선 SYN-SENT, SYN-RECEIVED, ESTABLISHED 상태를 볼 수 있음

  • SYN-SENT
    • 액티브 오픈 호스트가 SYN 세그먼트를 보낸 뒤 그에 대한 응답인 SYN + ACK 세그먼트를 기다리는 상태
  • SYN-RECEIVED
    • 패시브 오픈 호스트가 SYN-ACK 세그먼트를 보낸 뒤 그에 대한 ACK 세그먼트를 기다리는 상태
  • ESTABLISHED
    • 연결이 확립되었음을 나타내는 상태
    • 마지막 ACK 세그먼트를 주고받으면 이 상태로 접어들게 됨

연결 종료 상태

  • TCP 연결 종료에서는 FIN-WAIT-1, CLOSE-WAIT, FIN-WAIT-2, LAST-ACK, TIME-WAIT, CLOSED 상태를 볼 수 있음

  • FIN-WAIT-1
    • FIN 세그먼트로서 연결 종료 요청을 보낸 액티브 클로즈 호스트는 이 상태로 접어듬
  • 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 상태로 전이하지만
    • 액티브 클로즈 호스트는 일정 시간 기다린 뒤 CLOSED 상태로 전이
  • CLOSING 상태
    • 동시에 연결을 종료하려 할 때 전이되는 상태
    • 서로가 FIN 세그먼트를 보내고 그에 대한 ACK를 보냈으나 아직 받지 못한 경우 접어드는 상태
    • 이후에 ACK를 수신하면 일정 시간 기다린 뒤 CLOSED 상태로 전이
  •  

TCP 상태를 종합한 그림은 다음과 같음
- 터미널에서 netstat을 입력하면 TCP의 상태를 확인 가능

UDP 데이터그램 구조

  • 비연결, 비신뢰성 프로토콜
  • 상태를 유지하지도 않고, 활용하지도 않기 때문에 스테이트리스 프로토콜의 일종
  • 구조는 다음과 같음

  • 송신지 포트와 수신지 포트
    • 송수신지의 포트 번호가 담김
  • 길이
    • 헤더를 포함한 UDP 데이터그램의 바이트가 담김
  • 체크섬
    • 데이터 그램 전송 과정에서 오류 발생이 됐는지 검사하는 필드
    • 수신지가 이 값을 토대로 훼손 정보를 파악
      • 문제가 있으면 폐기
      • 훼손만 판단하지, 잘 도달했는지는 판단하지 않음
  • UDP는 적은 오버헤드로 패킷을 빠르게 처리 가능

TCP의 오류, 흐름, 혼잡 제어

  • TCP는 오류 제어, 흐름 제어, 혼잡 제어를 재전송 기반으로 수행

오류 제어: 재전송 기법

오류 검출과 재전송

  • 체크섬만으로는 신뢰성을 보장하기 힘듬
  • TCP가 신뢰성을 제대로 보장하려면 
    • 송신호스타가 송신한 세그먼트에 문제가 발생함을 인지할 수 있어야 함
    • 오류를 감지하게 되면 해당 세그먼트를 재전송
  • TCP가 오류를 검출하고 세그먼트를 재전송하는 상황에는 크게 두 가지가 있음

첫째 중복된 ACK 세그먼트를 수신했을 때

  • TCP는 중복된 ACK 세그먼트를 수신했을 때 오류가 생겼음을 감지
  • 중복적인 세그먼트 송신이 발생한 경우

둘째 타임아웃이 발생한 경우

  • TCP 세그먼트를 송신하는 호스트는 모두 재전송 타이머라는 값을 유지
  • 타이머의 카운트 다운이 끝나면 타임아웃 상황 발생
  • ACK 세그먼트를 제 시간안에 받지 못하면 상대 호스트에게 정상적으로 도착하지 않음으로 간주, 재전송

ARQ: 재전송 기법 (Automatic Repeat Request)

  • TCP의 재전송 기법중 하나
    • ACK와 타임아웃 발생을 토대로, 문제를 진단하고 메세지를 재전송함으로써 신뢰성을 확보하는 방식
    • 대표적으로 세가지 방식이 존재
      • Stop-and-Wait ARQ
      • Go-Back-N ARQ
      • Selective Repeat ARQ

Stop-and-Wait ARQ

  • ARQ 중 가장 단순한 방식
  • 제대로 전달했음을 확인하기 전까지는 새로운 메세지를 보내지 않는 방식

  • 높은 신뢰성을 보장하지만, 네트워크의 이용효율이 낮아질 수 있음
  • 다음 전송이 가능해도 A의 입장에선 B의 응답이 오기 전 까진 데이터를 전송할 수 없음

Go-Back-N ARQ

  • Stop-and-Wait ARQ와는 다르게 연속해서 메세지를 전송하는 파이프라이닝 기술 활용
  • 여러 세그먼트를 전송하고, 오류가 발생한 세그먼트가 있을 경우 그 세그먼트부터 전부 다시 전송하는 방식

  • 순서번호 n번에 대한 ACK 세그먼트는, n번 만의 확인이 아닌 n번 까지의 누적 확인 응답으로 볼 수 있음

Selective Repeat ARQ

  • 선택적으로 재전송하는 방법
  • Go-Back-N은 하나에 문제가 발생해도 그 이후를 전부 재전송해야하는 단점이 있음
  • 이와 다르게 Selective Repeat ARQ는 수신 호스트 측에서 제대로 전송받은 각각의 패킷들에 대해 ACK 세그먼트를 보내는 방식임
  • 개별 확인 응답이라고도 함

  • 대부분의 호스트가 TCP 통신에서 지원하는 방식

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

  • 파이프라이닝 기반의 ARQ가 동작하려면 흐름제어를 고려해야 함
    • 호스트가 한번에 처리할 수 있는 세그먼트 양에 한계가 있기 때문

수신 버퍼와 버퍼 오버플로

  • 수신버퍼
    • 수신된 세그먼트가 애플리케이션 프로세스에 의해 읽히기 전에 임시로 저장되는 공간
  • 버퍼 오버플로
    • 송신 호스트가 흐름제어를 고려하지 않고 수신 버퍼의 크기보다 많은 데이터를 전송한 경우
    • 일부 세그먼트가 처리되지 못할 수 있음
    • 이런 경우를 버퍼 오버플로라고 함
  • 오늘날 TCP는 흐름 제어로 슬라이딩 윈도우를 사용
    • 각 번째 세그먼트에 대한 ACK 세그먼트를 받았다면, 윈도우는 다음 칸으로 이동
    • 미끄러지듯이 이동해서 슬라이딩 윈도우

혼잡 제어

  • 혼잡이란, 많은 트래픽으로 인해 패킷의 처리 속도가 느려지거나, 유실될 우려가 있는 상황

  • 혼잡으로 인해 전송률이 크게 떨어지는 경우를 혼잡 붕괴라고 함
  • TCP의 혼잡제어는 이러한 혼잡을 제어하기 위한 기능
  • 혼잡 윈도우는 혼잡 없이 전송할 수 있는 데이터의 양을 의미
    • 혼잡 윈도우가 크면 한번에 전송 가능한 세그먼트가 많다는 의미
    • 반대면, 혼잡한 상황이므로 적다는 의미
  • 혼잡 윈도우 크기는 혼잡 제어 알고리즘을 통해 결정
    • 혼잡 제어를 수행하는 일련의 방법

기본적인 알고리즘인 AIMD

  • Additive Increase/Multiplicative Decrease
  • 합으로 증가, 곱으로 감소라는 의미
    • 혼잡이 감지되지 않으면 혼잡 윈도우를 Round Trip Time 마다 1씩 증가
    • 혼잡이 감지될 경우 절반으로 떨어뜨림
    • 그래서 혼잡 윈도우는 톱니 모양으로 변화하는 특징이 있음

  • 이것만으로는 혼잡 제어가 이루어지지는 않음, 그래서 다음 알고리즘이 존재
    • 느린 시작
    • 혼잡 회피
    • 빠른 회복

느린 시작 알고리즘

  • 혼잡 윈도우를 1부터 시작해 문제 없이 수신된 ACK 세그먼트 하나당 1씩 증가
  • 결과적으로 RTT마다  2배씩 지수적으로 증가
  • AIMD와 다르게 지수적인 증가를 활용해 초기 전송속도를 어느정도 보장

  • 그러나 지수적으로 증가하면 혼잡을 마주칠 확률이 높아짐
  • 느린 시작 임계치를 통해 타임아웃이나 혼잡이 발생하면 다음과 같은 방법 채택

혼잡 회피 알고리즘

  • RTT마다 혼잡 윈도우를 1MSS씩 증가시키는 알고리즘
  • 혼잡 윈도우 크기를 선형적으로 증가
  • 느린 시작 임계치를 넘어선 순간부터 혼잡을 마주칠 확률이 있으므로, 이 알고리즘 사용

  • 회피 도중 타임아웃 발생시 혼잡 윈도우 값을 1로, 느린 시작 임계치는 감지 시점의 절반으로 초기화 한 후 다시 느린 시작 수행
  • 세 번의 중복 ACK 세그먼트 발생시, 혼잡 윈도우와 느린 시작 임계치를 절반 쯤으로 떨어뜨리고 빠른 회복 알고리즘 수행

빠른 회복 알고리즘

  • 세 번의 중복된 ACK 세그먼트를 수신 시, 빠른 재전송 및 빠른 회복 알고리즘 수행
  • 느린 시작은 건너 뛰고 혼잡 회피를 바로 수행하는 알고리즘
  • 빠르게 전송률을 회복하기 위함
  • 회복 도중이라도 타임아웃 발생시, 혼잡 윈도우크기는 1로, 느린 시작 임계치는 혼잡 감지 시점의 절반으로 떨어 뜨리고 느린 시작 수행

  • 이 셋을 적절하게 섞어 사용

ECN- 명시적 혼잡 알림

  • 혼잡을 회피하기 위해 네트워크 중간 장치의 도움을 받는 것
  • 선택적인 기능임
  • IP 헤더와 TCP 헤더에 ECN 관련 필드가 추가되어, 각 오른쪽 두 비트가 ECN으로 사용

  • ECN을 통한 혼잡 제어의 대략적인 동작은 다음 그림과 같음

  1. 호스트 A가 호스트 B에게 메세지를 전송하기 위해 라우터에 메세지 전송
  2. 라우터 입장에서 네트워크 혼잡 판단시, IP 헤더의 ecn 비트들을 설정한 채 수신지 호스트 B에게 메세지 전달, 이 때 ECN 비트가 11일 경우 혼잡을 감지했다는 의미
  3. 호스트 B가 전달받은 IP 패킷 내 혼잡 표시가 있으면 TCP ACK 세그먼트 내 ECE비트 세팅을 통해 송신 호스트에게 네트워크 혼잡을 알림
  4. 응답 세그먼트에서 ECE 비트가 설정되어있을 경우 CWR 비트를 세팅 후 혼잡 윈도우를 반으로 줄임
ECN을 사용할 경우 ACK 세그먼트를 통해 더 빠르게 혼잡을 감지할 수 있음