////
Search

4. 전송 계층 - TCP와 UDP

전송 계층(L4)에서 가장 중요한 프로토콜 : TCP, UDP

TCP와 UDP의 목적과 특징

TCP와 UDP가 어떤 기능과 차이점이 있는지 각각의 목적과 특징에 집중

포트를 통한 프로세스 식별

IP, MAC 주소 : 패킷을 송수신하는 호스트 특정 가능
포트 번호 : 호스트가 실행하는 프로세스 식별 가능
패킷의 최종 송수신 대상은 호스트가 실행하는 프로세스
IP주소:포트번호 형식으로 표기
IP주소와 포트번호 조합을 통해 특정 호스트가 실행하는 특정 프로세스 식별 가능
️ 전송계층(TCP, UDP)의 주요 목적 : 포트를 통한 프로세스 식별
TCP, UDP 모두 포트를 통해 프로세스를 식별
포트 번호는 16bit로 표현 가능 → 총 개수는 2^16개(65536개)
3가지 종류의 포트 번호 : 잘 알려진 포트, 등록된 포트, 동적 포트
포트 종류
포트 번호 범위
잘 알려진 포트
0 ~ 1023
등록된 포트
1024 ~ 49151
동적 포트
49152 ~ 65535
잘 알려진 포트(well known port)
가장 대중적으로 사용되는 애플리케이션을 위한 포트 번호
범용적으로 사용되는 프로토콜이 주로 사용하는 포트 번호
잘 알려진 포트 번호
설명
20,21
FTP
22
SSH
23
TELNET
53
DNS
67, 68
DHCP
80
HTTP
443
HTTPS
등록된 포트(registered port)
흔하게 사용되는 애플리케이션 프로토콜에 할당하기 위한 포트 번호
등록된 포트 번호
설명
1194
OpenVPN
1433
Microsoft SQL Server 데이터베이스
3306
MySQL 데이터베이스
6379
Redis
8080
HTTP 대체
동적 포트(dynamic port)
사설 포트(private port), 임시 포트(ephemeral port) 라고도 불림
클라이언트로서 동작하는 프로그램의 경우에는 동적 포트 번호 중에서 임의 번호가 할당되는 경우가 대부분
EX : 웹 브라우저를 통해 특정 웹사이트에 접속하는 경우 (웹 브라우저 프로그램과 서버 프로그램이 서로 패킷을 주고 받는 상황)
웹 브라우저 프로그램에는 동적 포트 내 임의의 포트 번호가 자동으로 할당됨

(비)신뢰성과 (비)연결형 보장

TCP

신뢰할 수 있는 연결형 송수신
패킷을 주고받기 전에 연결 수립 과정을 거침
연결 수립 이후 패킷을 주고받을 때, 신뢰성 보장을 위해 상태 관리, 흐름 제어, 오류 제어, 혼잡 제어 등의 각종 기능 제공
시간 & 연산 소요 → UDP에 비해 느림
패킷의 유실 없는 송수신을 원한다면 TCP
TCP 헤더 내 필드(알아야 할 피드 3가지만)
TCP는 연결 수립 및 종료, 신뢰성 보장을 위한 여러 기능을 제공하므로 헤더 필드 수가 매우 많음
1.
순서 번호 필드
TCP 패킷(TCP 세그먼트)의 올바른 송수신 순서 보장을 위해 세그먼트 첫 바이트에 매겨진 번호
현재 주고받는 TCP 세그먼트가 송수신하고자 하는 데이터의 몇 번째 바이트에 해당하는지 확인 가능
2.
확인 응답 번호 필드
상대 호스트가 보낸 세그먼트에 대한 응답으로, 다음으로 수신하길 기대하는 순서 번호
수신측 호스트가 송신측 호스트에 ‘해당 세그먼트는 확인 응답 번호를 포함하고 있음’을 알리기 위해 먼저 ACK 플래그를 1로 설정 필요
ACK 플래그 : 제어 비트에서 승인을 나타내는 비트
즉, 확인 응답 번호 값을 보내기 위해서는 제어 비트의 ACK 플래그가 1로 설정되어 있어야 함
확인 응답 번호를 통해 상대 호스트가 다음으로 받고자 하는 패킷이 무엇인지를 확인 가능
→ 즉, TCP 신뢰성 보장은 대부분 확인 응답 번호를 통해 이뤄진다고 봐도 무방
3.
일부 제어 비트(ACK 플래그, SYN 플래그, FIN 플래그)
현재 세그먼트에 대한 부가 정보를 나타냄
8비트 구성
각 자리의 비트가 각각 다른 의미 가짐
3가지 중요 제어 비트
ACK : 세그먼트 승인을 나타내기 위한 비트
SYN : 연결 수립을 위한 비트
FIN : 연결 종료를 위한 비트

UDP

신뢰할 수 없는 비연결형 송수신
연결의 수립이나 종료 단계를 거치지 않음
신뢰성 보장을 위한 기능들을 제공하지 않음
비교적 빠른 송수신을 원한다면 UDP
UDP 헤더 내 4가지 필드
1.
송신지 포트 : 송신 프로세스가 할당된 포트 번호
2.
수신지 포트 : 수신 프로세스가 할당된 포트 번호
3.
길이 : 헤더를 포함한 UDP 패킷(UDP 데이터그램)의 바이트 크기 명시
4.
체크섬 : 송수신 과정에서의 데이터그램 훼손 여부를 알 수 있는 정보 명시

TCP의 연결부터 종료까지

송수신 이전에 연결을 수립하고, 송수신 이후에는 연결을 종료
송수신 전후로 상태라는 값을 관리

TCP의 연결 수립

쓰리 웨이 핸드셰이크(three-way handshake)
쓰리 웨이 핸드셰이크 : 세 단계로 이뤄진 TCP의 연결 수립 과정
1.
[송수신 방향 A → B] SYN 세그먼트 전송
호스트 A : SYN 비트가 1로 설정된 세그먼트(SYN 세그먼트)를 호스트 B에게 전송
세그먼트 순서 번호에는 호스트 A의 순서 번호가 포함됨
2.
[송수신 방향 B → A] SYN + ACK 세그먼트 전송
1에 대한 호스트 B의 응답 : ACK비트와 SYN 비트가 1로 설정된 세그먼트(SYN + ACK 세그먼트)를 호스트 A에 전송
세그먼트 순서 번호에는 호스트 B의 순서 번호와 1에서 보낸 세그먼트에 대한 확인 응답 번호가 포함됨
3.
[송수신 방향 A → B] ACK 세그먼트 전송
호스트 A : ACK 비트가 1로 설정된 세그먼트(ACK 세그먼트)를 호스트 B에게 전송
호스트 A의 순서 번호와 2에서 보낸 세그먼트에 대한 확인 응답 번호가 포함됨
SYN 비트 : 연결을 수립하기 위한 비트
SYN 비트가 설정된 패킷을 처음으로 보내는 호스트가 곧 처음으로 연결 요청을 보내는 호스트
액티브 오픈(active open) : 호스트 A처럼 처음 연결을 시작하는 과정
주로 클라이언트에 의해 수행됨
패시브 오픈(passive open) : 호스트 B처럼 연결 요청을 수신한 뒤 그에 대한 연결을 수립하는 과정
주로 서버에 의해 수행됨

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

TCP는 송수신하는 패킷의 신뢰성을 보장하기 위해 크게 3가지 기능(오류 제어, 흐름 제어, 혼잡 제어) 제공
재전송을 기반으로 다양한 오류를 제어
송수신의 흐름을 제어해 처리 가능한 만큼의 데이터만 주고받음
혼잡 제어를 통해 네트워크 혼잡 정도에 따라 데이터 전송량 조절

1. 재전송을 통한 오류 제어

송수신 과정에서 잘못 전송된 세그먼트가 있는 경우, 이를 재전송해 오류 제어
크게 2가지 상황
1.
중복된 ACK 세그먼트가 도착했을 때
TCP 송수신은 기본적으로 순서 번호를 담은 세그먼트를 보내고, 이에 대한 확인 응답이 담긴 세그먼트를 받고, 다음 순서 번호를 담은 세그먼트를 보내고 다시 확인 응답 세그먼트를 받는 과정을 반복
이때, 송신한 세그먼트의 일부가 전송 중 유실되어 중복으로 ACK 세그먼트를 수신하게 되는 상황
2.
타임아웃이 발생했을 때
TCP 세그먼트를 송신하는 호스트는 모두 재전송 타이머(retransmission timer)라는 특별한 값을 유지
호스트는 세그먼트를 전송할 때마다 이 재전송 타이머를 시작
타임아웃 : 재전송 타이머의 카운트 다운이 끝난 상황
타임아웃 발생 시점까지 ACK 세그먼트를 받지 못하면, 세그먼트 전송 과정에 문제가 발생했다고 간주하여 세그먼트를 재전송

2. 흐름 제어

수신 호스트가 한 번에 받아 처리할 수 있을 만큼만 전송하는 것. 송신 호스트가 수신 호스트의 처리 속도를 고려하며 송수신 속도를 균일하게 맞추는 기능
TCP 헤더 내 윈도우(window) 필드 : 수신 호스트가 한 번에 처리할 수 있는 양을 송신 호스트에서 아는 방법
수신 윈도우 : 수신 호스트가 한 번에 처리할 수 있는 크기

3. 혼잡 제어

혼잡(congestion) : 많은 트래픽으로 인해 패킷의 처리 속도가 느려지거나 유실될 수 있는 상황
송신 호스트 : 혼잡 제어의 주체
 송신 호스트 = 데이터를 보내는 쪽(클라이언트라고 생각하면 헷갈릴 여지가 많음)
송신 호스트가 주체적으로 얼마나 네트워크가 혼잡한지를 판단 가능해야하며, 판단된 혼잡의 정도에 따라 세그먼트 전송량 조절 필요
중복된 ACK 세그먼트가 도착했거나 타임아웃이 발생했을 때, 현재 네트워크의 혼잡 가능성이 있다고 판단
네트워크 혼잡 가능성을 검출한 송신 호스트는 혼잡 없이 전송할 수 있을 정도의 양만큼만 송신
혼잡 윈도우(congestion window) : 혼잡 없이 전송할 수 있을 정도의 양의 값
혼잡 윈도우가 크다 → 한 번에 전송 가능한 세그먼트 수가 많음
혼잡 윈도우가 작다 → 한 번에 전송 가능한 세그먼트 수가 적음
참고) 흐름 제어에 사용되는 수신 윈도우와 혼잡 제어에 사용되는 혼잡 윈도우는 모두 커널 내에 정의된 값
혼잡 제어 알고리즘
혼잡 제어를 수행하는 일련의 과정
수신 윈도우는 수신 호스트가 TCP 헤더로 알려주지만, 혼잡 윈도우 크기는 송신 호스트가 직접 계산해서 알아내야함
AIMD(Additive Increase / Multiplicative Decrease) : 기본적인 혼잡 제어 알고리즘
세그먼트를 보내고, 그에 대한 응답이 오기까지 혼잡이 감지되지 않으면 혼잡 윈도우를 1씩 선형적으로 증가 or 혼잡이 감지되면 혼잡 윈도우를 절반으로 떨어뜨리는 동작 반복
혼잡 윈도우가 톱니 모양으로 변화하는 특징 존재
RTT(Round Trip Time) : 패킷을 보내고 그에 대한 응답이 수신되기까지의 시간
즉, AIMD는 혼잡이 감지되지 않으면 혼잡 윈도우를 RTT마다 1씩 선형적으로 증가시키고 혼잡이 감지되면 혼잡 윈도우를 절반으로 떨어뜨리는 알고리즘

TCP의 종료

포 웨이 핸드셰이크(four-way handshake)
연결 종료는 송수신 호스트가 각자 한 번씩 FIN, ACK를 주고받으며 이뤄짐
1.
[송수신 방향 A → B] FIN 세그먼트
호스트 A는 FIN 비트가 1로 설정된 FIN 세그먼트를 호스트 B에게 전송
2.
[송수신 방향 B → A] ACK 세그먼트
1에 대한 호스트 B의 응답. 호스트 B는 ACK 세그먼트를 호스트 A에게 전송
3.
[송수신 방향 B → A] FIN 세그먼트
호스트 B는 FIN 세그먼트를 호스트 A에게 전송
4.
[송수신 방향 A → B] ACK 세그먼트
3에 대한 호스트 A의 응답. 호스트 A는 ACK 세그먼트를 호스트 B에게 전송
액티브 클로즈(active close) : 먼저 연결을 종료하려는 호스트에 의해 수행되는 동작
패시브 클로즈(passive close) : 연결 종료 요청을 받아들이는 호스트에 의해 수행되는 동작

TCP의 상태 관리

TCP의 또 다른 중요한 특징 : 상태 유지
TCP는 상태를 유지하고 관리하는 프로토콜 → 스테이트풀 프로토콜(stateful protocol)이라고도 부름
TCP에는 다양한 상태가 존재
크게 3가지로 항목화하자면 :
1.
연결이 수립되지 않았을 때 주로 활용되는 상태
CLOSED, LISTEN
2.
연결 수립 과정에서 주로 활용되는 상태 : 3-way handshake
SYN-SENT, SYN-RECEIVED, ESTABLISHED
3.
연결 종료 과정에서 주로 활용되는 상태 : 4-way handshake
FIN-WAIT-1, CLOSE-WAIT, FIN-WAIT-2, LAST-ACK, TIME-WAIT
유의할 점
패시브 클로즈 호스트 : ACK 세그먼트를 수신하면 CLOSED 상태로 전환
액티브 클로즈 호스트 : 일정 시간을 기다린 뒤 CLOSED 상태로 전환
마지막 ACK 세그먼트가 올바르게 전송되지 않았을 때, 재전송을 하기 위함