네트워크
[04] 전송 계층
BGK97
2024. 6. 23. 16:33
전송 계층 개요: IP의 한계와 포트
네트워크 계층 IP의 한계
- 전송계층은, 신뢰할 수 있는 통신과 연결형 통신이 가능
- 응용 계층의 애플리케이션 프로세스들을 식별하는 역할 수행
- 네트워크 계층의 핵심 프로토콜인 IP는 단편화와 주소 지정을 수행
- 이외에 IP의 한계점이 크게 두가지 있는데
- 비신뢰성 통신
- 비연결형 통신
비신뢰성 통신
- 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을 통한 혼잡 제어의 대략적인 동작은 다음 그림과 같음
- 호스트 A가 호스트 B에게 메세지를 전송하기 위해 라우터에 메세지 전송
- 라우터 입장에서 네트워크 혼잡 판단시, IP 헤더의 ecn 비트들을 설정한 채 수신지 호스트 B에게 메세지 전달, 이 때 ECN 비트가 11일 경우 혼잡을 감지했다는 의미
- 호스트 B가 전달받은 IP 패킷 내 혼잡 표시가 있으면 TCP ACK 세그먼트 내 ECE비트 세팅을 통해 송신 호스트에게 네트워크 혼잡을 알림
- 응답 세그먼트에서 ECE 비트가 설정되어있을 경우 CWR 비트를 세팅 후 혼잡 윈도우를 반으로 줄임
ECN을 사용할 경우 ACK 세그먼트를 통해 더 빠르게 혼잡을 감지할 수 있음