이 글은 강민철님의 혼자 공부하는 네트워크(인프런) 강의를 수강하고 개인적으로 정리한 내용입니다.
들어가기에 앞서
4계층인 전송 계층이 어떠한 기능을 제공하는지, 3계층의 IP프로토콜의 어떠한 한계를 극복하는지, port란 무엇인지에 대해서 알아본다.
전송 계층이 필요한 이유?
전송 계층은 네트워크 계층과 응용 계층 사이에 존재하는 계층이다.
전송 계층은 크게 2가지 이유로 필요하다.
1) IP 한계점 보완 - 신뢰할 수 있는 통신 제공
2) 응용 계층의 프로세스 식별 - port 번호로 사용자가 실행 중인 프로그램을 식별
IP 프로토콜의 한계
IP 프로토콜은 신뢰할 수 없고, 비연결형으로 통신한다는 한계점을 가진다.
즉, IP 패킷을 전달하는 것은 신뢰성 없고 비연결형으로 통신하는 것이라고 생각하면 된다.
신뢰할 수 없다는 것은 패킷이 수신지까지 제대로 전송되었다는 보장을 할 수 없다는 것이고, (보내긴 하나 책임지지는 않음)
비연결형으로 통신하는 것은 송신지와 수신지 간에 사전 연결없이 그저 패킷을 보내기만 한다는 것이다.
그렇다면 IP는 왜 이런 신뢰할 수 없는 비연결형 통신을 할까?
그 이유는 신뢰성 있고, 연결형 통신을 하면 성능이 저하되는 문제가 있기 때문이다. 모든 통신이 신뢰성과 연결형을 필요로 하는 것은 아니다.
따라서 IP는 성능을 보장하고 빠른 연결에 초점을 맞춘다면, 4계층인 전송 계층에서 TCP와 UDP라는 선택지를 두어 이 문제를 해결했다.
TCP와 UDP : IP의 한계를 보완하는 전송 계층의 프로토콜
1) TCP : 신뢰성 있고, 연결형 통신을 가능하게 한다.
2) UDP : 신뢰할 수 없는 통신과 비연결형 통신을 가능하게 한다. TCP보다는 빠르다.
Port : 어플리케이션을 식별하는 도구
전송 계층에서는 응용 계층에서 동작하는 프로그램의 종류를 식별해야 한다. 이를 식별할 수 있는 번호가 port 번호이다.
통신을 하기 위해서는 해당 컴퓨터에 패킷을 전달한다고 끝이 아니고, 해당 컴퓨터의 특정 프로그램에 패킷을 보내야 한다.
포트는 16비트(2^16 = 65536개)로 표현 가능하며, 번호의 형태로 할당된다.
그리고 포트의 종류는 아래와 같다.
포트 종류 | 포트 번호 범위 | 예시 |
잘 알려진 포트 | 0 ~ 1023 | 22(SSH), 23(TELNET), 53(DNS), 67/68(DHCP), 80(HTTP), 443(HTTPS) |
등록된 포트 | 1024 ~ 49151 | OpenVPN(1194), 6379(Redis), 8080(HTTP 대체) |
동적 포트 | 49152 ~ 65535 | 보통 브라우저가 동적 포트 사용 |
NAT : IP를 변환하는 기술
포트를 이해하면 NAT를 더 잘 이해할 수 있다.
NAT 프로토콜은 NAT 변환 테이블에 네트워크 외부(공인 IP)와 네트워크 내부(사설 IP)에서 쓰이는 IP 주소를 구분해서 저장한다.
네트워크 내부에서 외부로 나갈때는 네트워크 외부 IP에 해당하는 IP로 변환하고, 외부에서 내부로 들어올 때는 네트워크 내부 IP로 변환한다.
여기서 문제점은 사설 IP 주소의 수만큼 공인 IP의 주소가 필요하다는 것이다. 즉, 하나의 공인 IP에 여러개의 사설 IP를 공유하는 형태로 사용할 수 없다. 공인 IP는 ISP로부터 할당받아야 하고 비용이 발생하기 때문에 공인 IP 주소를 적게 사용하는 것이 좋기 때문이다.
NAPT : 포트 기반의 NAT
위에서 발생하는 하나의 공인 IP를 여러 개의 사설 IP가 공유하도록 하는 것이 NAPT이다.
NAT 테이블에 저장하는 IP 주소와 포트 번호를 함께 기록하며 변환한다.
NAPT를 사용한다면 여러 개의 사설 IP를 하나의 공인 IP로 사용할 수 있다.
예를 들어 위의 그림에서 포트를 기반으로 공인 IP를 공유하지 않았다면, 2개의 통신 과정에서 공인 IP는 2개를 할당해야 했을 것이다.
하지만 공인 IP를 1개만 할당해도, 각각의 사설 IP에 대해서 내부적인 포트 번호는 다르기 때문에 하나의 공인 IP만 할당해도 통신을 할 수 있는 것이다.
포트 포워딩
앞서 네트워크에 속한 여러 호스트들은 하나의 공인 IP를 공유하고, 각각의 사설 IP를 가진다고 했다.
그렇다면, 네트워크 외부에서는 내부로 통신할 때 어떤 IP 주소를 수신지로 삼아야 할까?
이를 외부에게 알려주는 기술이 포트포워딩이다.
예를 들어 위의 공유기는
공인 IP:1234로 전송한 패킷은 192.168.100.100:1025로 전달하고,
공인 IP:4321로 전송한 패킷은 192.168.100.101:1026으로 전달한다는 의미를 가진다.
ICMP : IP의 전송 특성을 일부 보완하는 프로토콜
IP 패킷 전송 과정에 대한 피드백 메세지를 제공함으로써 IP가 신뢰할 수 없는 비연결형 통신이라는 문제를 해결하는 프로토콜
IP의 보조일 뿐 신뢰성을 완전히 보장하지는 않는다. (원천적인 해결 방법은 아님)
피드백 메세지(ICMP 메세지) = 타입(ICMP 메세지 유형) + 코드(구체적인 메세지)
1) 전송 과정에서 발생한 문제 상황에 대한 오류 보고
2) 네트워크에 대한 진단 정보를 제공
정리
1. 전송 계층은 네트워크 계층과 응용 계층 사이에 존재하며, IP 프로토콜의 한계점과 응용 계층의 프로그램을 식별하는 기능을 한다.
2. IP 프로토콜은 신뢰할 수 없고, 비연결성이라는 문제점이 있는데, 해결하기 위해 4계층에는 신뢰성있고 연결형인 TCP 프로토콜이 있다.
3. 응용 계층의 어플리케이션은 Port 번호를 통해 식별한다. Port 번호는 16비트로 나타낼 수 있는 숫자이며, 호스트: 뒤에 붙는다.
4. IP 프로토콜의 전송 과정에서 피드백 메세지를 제공함으로서 일부 문제를 해결(근본적인 문제는 해결하지 못함)하는 ICMP 프로토콜도 있다.
TCP (Transmission Control Protocol)
신뢰할 수 잇는 통신을 위한 연결형 프로토콜
TCP의 통신 과정
크게 3가지 단계를 거치며, 아래와 같다.
1. 연결 수립
2. 데이터 송수신 (재전송을 통한 오류 제어, 흐름 제어, 혼잡 제어 등)
3. 연결 종료
MSS (maximum segment size)
TCP 프로토콜로 전송할 수 있는 최대 페이로드 크기 (헤더 제외)
TCP 세그먼트의 헤더 구조
필드명 | 의미 | 비트 수 |
송신지 / 수신지 포트 | 송수신하는 포트번호 | 16비트 |
순서 번호 | 송수신되는 세그먼트의 첫 바이트에 부여되는 번호 세그먼트의 올바른 송수신 순서를 보장하기 위한 번호 |
32비트 |
확인 응답 번호 | 상대 호스트가 보낸 세그먼트에 대한 응답 다음으로 수신하기를 기대하는 순서 번호 |
32비트 |
제어 비트 | 현재 세그먼트에 대한 부가 정보 - ACK : 세그먼트의 승인 - SYN : 연결 수립 - FIN : 연결 종료 |
8비트 |
윈도우 | 수신 윈도우의 크기 | 16비트 |
순서 번호
초기 순서 번호(무작위 값) + 송신한 바이트 수
예를 들어 응용 계층으로부터 1900바이트를 전달받았을 때,
MSS가 500바이트라면 전체 세그먼트를 500바이트에 맞게 4개의 세그먼트로 쪼갠다.
확인 응답 번호
수신한 순서 번호 + 1
TCP 연결 수립과 종료
연결 수립 : 3 way handshake
그렇다면 TCP는 어떻게 연결할까? 이 과정을 쓰리웨이 핸드셰이크라고 한다.
3-way-handshake
3단계로 이루어진 TCP의 연결 수립 과정
연결 수립 과정에서의 상태
액티브 오픈 : 연결을 시작하는 호스트의 연결 수립 과정
패시브 오픈 : 연결을 수락하는 호스트의 연결 수립 과정
연결 종료 : 4 way handshake
송수신 호스트가 각자 한 번씩 FIN과 ACK를 주고받으며 TCP가 종료된다.
액티브 클로즈 : 종료 시작 호스트의 종료 과정
패시브 클로즈 : 종료 수락 호스트의 종료 과정
TCP 상태
현재 어떤 통신 과정에 있는지를 나타내는 정보
TCP는 이러한 상태를 유지하고 활용하는 스테이트풀 프로토콜이지만, UDP는 상태를 유지하지 않는 스테이트리스 프로토콜이다.
TCP 상태 분류 | 주요 상태 |
연결이 수립되지 않는 상태 | CLOSED, LISTEN |
연결 수립 과정에서 주로 볼 수 있는 상태 | SYN-SENT, SYN-RECEIVED, ESTABLISHED |
연결 종료 과정에서 주로 볼 수 있는 상태 | FIN-WAIT-1, CLOSE-WAIT, FIN-WAIT-2, LAST-ACK, TIME-WAIT, CLOSING |
TCP의 기능
TCP가 안전하고 신뢰성 있는 전송을 하기 위해 처리하는 기능들은 아래와 같다.
1. 재전송을 기반으로 다양한 오류 제어
2. 흐름 제어로 처리할 수 있을 만큼만 데이터 송수신
3. 혼잡 제어로 네트워크가 혼잡한 정도에 따라 전송량 조절
1. 재전송 기반의 오류 제어
TCP가 신뢰성을 제대로 보장하려면
1. 세그먼트를 보낸 호스트가 세그먼트에 문제가 발생했다는 사실을 인지해야 한다.
2. 오류를 감지하고 해당 세그먼트를 재전송한다.
세그먼트에 문제가 발생한 상황
1. 중복된 ACK 세그먼트를 수신했을 때
- n+1번이 제대로 전달되지 않아서, 호스트 B로 부터 n+1번을 달라는 메세지를 한 번 더 받게 된다.
2. 타임 아웃이 발생했을 때
- 호스트가 세그먼트를 전송할 때마다 재전송 타이머를 시작하는데, 타임아웃이 발생할 때까지 ACK 세그먼트를 다시 받지 못한다면 재전송한다.
ARQ : 자동 재전송 프로토콜
수신 호스트의 답변과 타임아웃을 토대로 문제를 진단하고, 문제가 생긴 메세지를 재전송함으로써 신뢰성을 확보하는 방식
이렇게 문제가 발생할 때, 해당 세그먼트를 재전송할 때 사용하는 기법이 ARQ 프로토콜이다.
ARQ에는 대표적으로 3가지 방식이 있다.
1) Stop and wait ARQ
2) Go Back N ARQ
3) Selective Repeat ARQ
각각의 특징에 대해서 알아보자.
1. Stop and wait ARQ
제대로 전달했음을 확인하기 전까지는 새로운 메세지를 보내지 않는 방식
장점 : 단순하지만 높은 신뢰성 보장
단점 : 네트워크의 이용 효율이 낮아지고 성능 저하
이러한 문제를 해결하기 위해 연속해서 메세지를 전송하는 기술인 파이프라이닝을 사용한다.
2. Go Back N ARQ
여러 세그먼트를 전송했을 때, 오류가 발생하면 해당 세그먼트부터 전부 재전송하는 방식
n+1에서 문제가 생기면 n+2를 올바로 받았다고 할지라도 n+2 세그먼트를 폐기한다.
그리고 문제가 발생했던 세그먼트부터 다시 재전송한다.
3. Selective Repeat ARQ
각각의 패킷들에 대해 ACK 세그먼트를 보내는 방식
n+2번에서만 문제가 생겼기 때문에 n+2번만을 다시 주고 받는다.
2. 흐름 제어
송신 호스트가 수신 호스트의 처리 속도를 고려하고, 송수신 속도를 균일하게 유지하는 기능을 말한다.
파이프라이닝 기반이 아닌 Stop and wait ARQ는 무조건 제대로 전달했음을 확인하기 전까지는 새로운 세그먼트를 보내지 않기 때문에 흐름 제어가 필요하지 않고, 파이프라이닝 기반의 Go BAck N ARQ와 Selective Repeat ARQ에서는 흐름을 제어할 필요가 있다.
슬라이딩 윈도우 : TCP 흐름 제어 기법
오늘날 TCP 흐름 제어를 위해 슬라이딩 윈도우 알고리즘을 사용한다.
윈도우란 수신 호스트가 확인 응답 없이도 한 번에 받아서 처리할 수 있는 양을 의미한다.
위 그림에서는 확인 응답 없이도 한 번에 전송가능한 세그먼트가 최대 5개, 즉 윈도우의 크기는 5이다.
즉, 송수신 호스트는 아래와 같이 각각의 윈도우를 가지고 슬라이딩 윈도우 알고리즘을 통해 데이터를 주고 받는다.
첫 세그먼트를 보내면, 수신 호스트의 윈도우는 한 칸 옆으로 이동하고,
수신 호스트에서 확인 응답을 보내면 송신 호스트에서 한 칸 이동한다. (이때 첫 세그먼트는 데이터가 안전하게 전달되었다는 것을 의미한다.)
이런식으로 윈도우 값을 조정하면서 송수신량을 조정하는 기능을 흐름 제어라고 한다.
3. 혼잡 제어
혼잡
많은 트래픽으로 인해 패킷의 처리 속도가 늦어지거나 유실될 우려가 있는 네트워크 상황
송신 호스트가 혼잡한 정도에 맞춰서 유동적으로 전송량을 조절하는 기능을 말한다.
흐름 제어의 주체가 수신 호스트라면 혼잡 제어의 주체는 송신 호스트이다.
혼잡 윈도우
혼잡 없이 전송할 수 있을 법한 데이터양
혼잡 윈도우가 크면 한 번에 전송할 수 있는 세그먼트 수가 많고, 혼잡 윈도우가 작으면 한 번에 전송할 수 있는 세그먼트 수가 적다.
수신 윈도우는 수신 호스트가 헤더로 알려주고, 혼잡 윈도우는 송신 호스트가 알아서 직접 계산해서 알아내야 한다. (따라서 헤더에 포함되지 않음)
혼잡 제어 알고리즘
혼잡 윈도우는 송신 호스트가 알아서 직접 계산해야 한다고 하는데, 이 연산하는 방법을 혼잡 제어 알고리즘이라고 한다.
가장 기본적인 알고리즘은 AIMD라고하며, 혼잡이 감지되지 않으면 혼잡 윈도우를 RTT(메세지 전송 후 답변까지 걸리는 시간)마다 1씩 증가시키고, 혼잡이 감지되면 혼잡 윈도우를 절반으로 떨어뜨리는 동작을 반복한다.
이때 혼잡을 감지하는 척도는 중복된 ack를 수신하거나 타임아웃이 발생할 때이다.
1) 느린 시작 알고리즘
혼잡 윈도우를 1부터 시작해 문제 없이 수신된 ACK 세그먼트 하나당 1씩 증가시키는 방식
이때 혼잡 윈도우는 RTT마다 2배씩 증가한다.
2) 혼잡 회피 알고리즘
RTT 마다 혼잡 윈도우를 1MSS씩 증가시키는 방식
혼잡 윈도우 크기가 선형적으로 증가한다.
3) 빠른 회복 알고리즘
세 번의 중복 ACK를 수신했을 때, 빠른 전송률 회복을 위해 느린 시작은 건너뛰고 혼잡 회피를 수행하는 알고리즘
정리하면, 아래와 같다.
UDP
비연결형 통신을 수행하는 신뢰할 수 없는 프로토콜
TCP와 다르게 상태를 유지하지 않는 스테이트리스 프로토콜이다. 하지만 오버헤드가 적기에 패킷을 빠르게 처리할 수 있다.
주로 실시간 스트리밍 서비스, 인터넷 전화처럼 실시간성이 강조되는 상황에서 TCP보다 더 많이 쓰인다.
TCP와 UDP 비교
TCP는 하나씩 확실히 순차적으로 주고 받는다.
UDP는 연결된지도 모른 채 마구잡이로 데이터를 보낸다.
정리
1. TCP는 신뢰할 수 있는 통신을 위한 연결형 프로토콜이며, 연결-데이터 송수신-종료를 순서로 한다.
2. TCP 연결 수립은 3-way-handshake(SYN-SYN+ACK-ACK), 연결 종료는 4-way-handshake(FIN-ACK-FIN-ACK)으로 진행된다.
3. TCP의 주요 기능중에는 오류 제어, 흐름 제어, 혼잡 제어가 있다.
4. 오류 전송 - TCP가 신뢰성을 보장하려면 세그먼트에 문제가 발생하는 사실을 인지해야 하는데, 이를 중복된 ACK 세그먼트를 수신했을 때, 타임아웃이 발생했을 때로 인지한다. 그리고 세그먼트를 다시 전송하는 프로토콜이 ARQ 프로토콜이다.
5. ARQ 프로토콜은 Stop and wait ARQ, Go Back N ARQ, Selective Repeat ARQ 프로토콜로 나눠져 있다.
6. 흐름 제어 - 송신 호스트가 수신 호스트의 처리 속도를 고려하고, 송수신 속도를 균일하게 유지하기 위해 흐름을 제어한다.
7. 혼잡 제어 - 송신 호스트가 혼잡도에 맞춰서 유동적으로 전송량을 제어한다.
마무리
TCP나 UDP 등 평소에 들어봤던 키워드들의 의미를 전체적으로 정리할 수 있었고,
특히 IP의 한계점을 보완하기 위한 4계층의 역할을 보면서 TCP와 UDP 프로토콜에 대해 깊이있게 이해할 수 있었다.
'💻 CS > 🫧 네트워크' 카테고리의 다른 글
[혼자 공부하는 네트워크] (6) 응용 계층 (0) | 2025.01.25 |
---|---|
[혼자 공부하는 네트워크] (4) 네트워크 계층 (0) | 2025.01.21 |
[혼자 공부하는 네트워크] (3) 물리 계층과 데이터 링크 계층 (1) | 2025.01.19 |
[혼자 공부하는 네트워크] (2) 컴퓨터 네트워크 시작하기 (0) | 2025.01.17 |
[혼자 공부하는 네트워크] (1) 목차 (1) | 2025.01.16 |