전송 계층(L4)에서 가장 중요한 프로토콜 : TCP, UDP
TCP와 UDP의 목적과 특징
TCP와 UDP가 어떤 기능과 차이점이 있는지 각각의 목적과 특징에 집중
포트를 통한 프로세스 식별
•
IP, MAC 주소 : 패킷을 송수신하는 호스트 특정 가능
•
포트 번호 : 호스트가 실행하는 프로세스 식별 가능
◦
패킷의 최종 송수신 대상은 호스트가 실행하는 프로세스
•
IP주소:포트번호 형식으로 표기
◦
IP주소와 포트번호 조합을 통해 특정 호스트가 실행하는 특정 프로세스 식별 가능
•
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 세그먼트가 올바르게 전송되지 않았을 때, 재전송을 하기 위함





