4계층 — 전송 계층 (Transport Layer)
PDU: 세그먼트(TCP) / 데이터그램(UDP) | 장비: L4스위치, 로드밸런서
TCP — Transmission Control Protocol
연결지향형 / 신뢰성 보장
3-way 핸드셰이크로 연결
4-way 핸드셰이크로 종료
흐름제어(슬라이딩 윈도우)
혼잡제어 / 오류제어(ARQ)
헤더: 최소 20 bytes
PDU: 세그먼트
UDP — User Datagram Protocol
비연결형 / 신뢰성 없음
연결 수립 과정 없음
확인·재전송 없음
속도 빠름 / 오버헤드 최소
체크섬만 존재
헤더: 고정 8 bytes
PDU: 데이터그램
| 플래그 | 풀네임 | 역할 | 사용 시점 |
|---|---|---|---|
| SYN | Synchronize | 연결 요청 | 3-way 핸드셰이크 1·2단계 |
| ACK | Acknowledgment | 수신 확인 | 연결 후 거의 모든 패킷 |
| FIN | Finish | 정상 종료 요청 | 4-way 핸드셰이크 |
| RST | Reset | 강제 연결 초기화 | 오류·비정상 종료 시 |
| PSH | Push | 즉시 전달 요청 | 버퍼 기다리지 말고 바로 |
| URG | Urgent | 긴급 데이터 표시 | 우선 처리 필요 데이터 |
4-way: FIN→ / ACK← / FIN← / ACK→
3-way로 열고 4-way로 닫는 이유: 서버가 FIN 받아도 보낼 데이터가 남아있을 수 있어서 ACK 먼저, FIN 나중에
| 기능 | 내용 |
|---|---|
| 분할 · 재조립 Segmentation | 상위에서 내려온 큰 데이터를 세그먼트로 쪼개고, 받는 쪽에서 다시 합친다 |
| 다중화 · 역다중화 | 포트 번호로 어느 프로세스의 데이터인지 구분. 한 IP에서 여러 앱이 동시에 통신 가능 |
| 연결 설정 · 해제 | TCP는 3-way 핸드셰이크로 열고 4-way로 닫는다 |
| 순서 제어 | Sequence Number 로 순서를 매겨, 뒤섞여 도착해도 원래 순서로 복원 |
| 흐름 제어 | 슬라이딩 윈도우 — 수신 측 버퍼가 감당할 만큼만 보낸다 |
| 오류 제어 | 체크섬으로 검출, ACK가 안 오면 재전송(ARQ) |
| 혼잡 제어 | 네트워크가 막힐 때 전송량을 줄인다 (흐름 제어와 다름) |
• 흐름 제어 = 수신자가 못 따라올까 봐 조절 → 슬라이딩 윈도우
• 혼잡 제어 = 네트워크가 막힐까 봐 조절 → Slow Start, 혼잡 회피
"혼잡 시 윈도우를 1로 줄인다"는 혼잡 제어(Slow Start) 이지 슬라이딩 윈도우의 특성이 아니다.
| 필드 | 크기 | 역할 |
|---|---|---|
| 출발지 / 목적지 포트 | 각 16비트 | 0 ~ 65535. 어느 프로세스인지 지정 기출: 32비트 아님 |
| 순서 번호 | 32비트 | 이 세그먼트 데이터의 첫 번째 바이트 번호 기출: 마지막 아님 |
| 확인 응답 번호 | 32비트 | 다음에 받기를 기대하는 바이트 번호 |
| 플래그 | 6비트 | SYN · ACK · FIN · RST · PSH · URG |
| 윈도우 크기 | 16비트 | 수신 가능한 버퍼 크기 → 흐름 제어 |
| 체크섬 | 16비트 | 헤더 + 데이터 오류 검출 |
3-way 핸드셰이크 (연결)
① A → B : SYN
② B → A : SYN + ACK
③ A → B : ACK
→ 연결 수립 (ESTABLISHED)
4-way 핸드셰이크 (해제)
① A → B : FIN
② B → A : ACK
③ B → A : FIN
④ A → B : ACK → TIME_WAIT
실제 전송량 = min(cwnd, rwnd) — 혼잡 윈도우(네트워크 사정)와 수신 윈도우(상대 버퍼) 중 작은 쪽을 따른다. 흐름 제어는 rwnd, 혼잡 제어는 cwnd를 조절하는 것이다.
| 단계 | 동작 | 증가 방식 |
|---|---|---|
| ① 느린 시작 Slow Start |
cwnd = 1 MSS로 시작, ACK 하나마다 cwnd를 1씩 증가 → RTT마다 2배 임계값(ssthresh)에 도달하면 ②로 전환 |
지수적 1 → 2 → 4 → 8 |
| ② 혼잡 회피 Congestion Avoidance |
ssthresh 이후에는 조심스럽게 RTT마다 1 MSS씩만 증가 | 선형 8 → 9 → 10 |
| ③ 빠른 재전송 Fast Retransmit |
중복 ACK 3개를 받으면 재전송 타이머 만료를 기다리지 않고 즉시 재전송 | — |
| ④ 빠른 회복 Fast Recovery |
재전송 후 cwnd를 1로 떨어뜨리지 않고 ssthresh부터 혼잡 회피로 복귀 (TCP Reno) | 선형 재개 |
· 타임아웃 (심각한 혼잡으로 판단) → ssthresh = cwnd2, cwnd = 1 → 느린 시작부터 다시 TCP Tahoe
· 중복 ACK 3개 (경미한 손실로 판단) → ssthresh = cwnd2, cwnd = ssthresh → 혼잡 회피로 복귀 TCP Reno
이 증감 방식을 AIMD(Additive Increase / Multiplicative Decrease)라 한다 — 늘릴 땐 더하기, 줄일 땐 반으로.
| 상태 | 의미 |
|---|---|
| LISTEN | 서버가 SYN을 기다리는 대기 상태 |
| ESTABLISHED | 연결 수립 완료. 실제 데이터 송수신 중 |
| CLOSE_WAIT | 상대 FIN을 받고 ACK를 보낸 상태. 내 쪽 close() 호출을 기다리는 중 |
| TIME_WAIT | 마지막 ACK를 보낸 뒤 2MSL 동안 대기 (능동적으로 먼저 닫은 쪽만 거침) |
① 마지막 ACK가 유실되면 상대가 FIN을 재전송하는데, 이때 응답할 수 있어야 한다
② 이전 연결의 지연된 패킷이 같은 포트로 열린 새 연결에 섞여 들어가는 것을 막는다
· TIME_WAIT 누적 → 먼저 연결을 끊는 쪽(주로 클라이언트·프록시)에서 발생. 포트 고갈의 원인
· CLOSE_WAIT 누적 → 애플리케이션이 close()를 호출하지 않은 것. 코드 버그의 신호
| 구분 | 범위 | 설명 |
|---|---|---|
| 잘 알려진 포트 Well-known | 0 ~ 1023 | IANA 지정. 서버가 열려면 관리자 권한 필요. HTTP 80, HTTPS 443, SSH 22 |
| 등록 포트 Registered | 1024 ~ 49151 | 제조사·서비스 등록용. MySQL 3306, PostgreSQL 5432, 8080 |
| 동적 · 사설 포트 Dynamic / Ephemeral | 49152 ~ 65535 | 클라이언트가 통신할 때마다 임시로 배정받는 출발지 포트 |
하나의 TCP 연결은 4-tuple(출발지 IP · 출발지 포트 · 목적지 IP · 목적지 포트)로 유일하게 식별된다. 그래서 같은 서버의 80번 포트에 수천 명이 동시 접속해도 서로 구분된다 — 클라이언트의 임시 포트가 다르기 때문이다.
| 타이머 | 역할 |
|---|---|
| 재전송 타이머 RTO | ACK가 오지 않으면 재전송. RTT를 측정해 동적으로 계산(Karn 알고리즘 — 재전송된 세그먼트는 RTT 측정에서 제외) |
| 지속 타이머 Persistence | 수신 측이 윈도우 0을 통보한 뒤 "이제 받을 수 있다"는 갱신 통보가 유실되면 교착에 빠진다. 이를 막으려 주기적으로 Window Probe를 보낸다 |
| 킵얼라이브 타이머 | 유휴 연결의 생존 확인 (기본 2시간) |
| TIME_WAIT 타이머 | 2MSL 대기 |
MSS = MTU − IP헤더(20) − TCP헤더(20) = 1500 − 40 = 1460 byte
MSS는 3-way 핸드셰이크의 SYN 옵션으로 서로 알려주고 더 작은 값을 채택한다.
| 항목 | 내용 |
|---|---|
| 데이터 오프셋 4bit | 헤더 길이를 4바이트 단위로 표시. 최소 5(=20byte), 최대 15(=60byte) 옵션이 없으면 항상 5 |
| MSS 옵션 | 최대 세그먼트 크기 협상 (SYN에만 포함) |
| 윈도우 스케일 | 윈도우 필드가 16비트라 최대 64KB가 한계. 이를 곱셈으로 확장해 고속·장거리 회선에서 처리량 확보 |
| SACK 선택적 확인응답 | 중간에 빠진 조각만 골라서 재전송 요청. 전체 재전송 낭비를 줄임 |
| 타임스탬프 | 정밀한 RTT 측정, 순서번호 순환(PAWS) 방지 |
· Nagle 알고리즘(송신 측) — 작은 데이터를 모아 한 번에 전송해 효율을 높이지만 지연이 생긴다. 실시간 통신에서는 TCP_NODELAY로 끈다
· Silly Window Syndrome — 아주 작은 윈도우를 반복 광고해 효율이 무너지는 현상. 수신 측은 Clark 해법, 송신 측은 Nagle로 대응
| 프로토콜 | 포트 | UDP를 쓰는 이유 |
|---|---|---|
| DNS | 53 | 질의·응답 1회로 끝나 연결 수립이 낭비 단, 응답 512byte 초과·존 전송(AXFR)은 TCP 기출 |
| DHCP | 67 / 68 | 주소가 없는 상태라 브로드캐스트가 필요 — TCP는 브로드캐스트 불가 |
| TFTP | 69 | 단순 파일 전송. 자체적으로 최소한의 확인만 |
| SNMP | 161 / 162 | 다수 장비를 가볍게 폴링 |
| NTP | 123 | 지연이 정확도를 해침 |
| RIP | 520 | 주기적 브로드캐스트 방식 |
| Syslog | 514 | 로그 유실보다 부하 최소화가 우선 |
| RTP / VoIP | 가변 | 재전송된 늦은 음성은 쓸모없다 — 지연 > 유실 |
| 프로토콜 | 특징 |
|---|---|
| SCTP | TCP + UDP의 장점 결합. 멀티스트리밍(HOL 블로킹 회피) · 멀티호밍(경로 이중화). 연결은 4-way(쿠키 방식). SS7 시그널링 전송에 사용 |
| DCCP | 비신뢰 전송 + 혼잡 제어. 스트리밍용 |
| QUIC | UDP 기반으로 TCP+TLS 기능을 구현. HTTP/3의 전송 프로토콜 |
| OSI TP0~TP4 | ISO 전송계층 클래스. TP0 최소 기능 ~ TP4 오류 검출 + 복구(= TCP에 해당) |
장비
L4 스위치 / 로드밸런서 — IP + 포트를 보고 서버로 분산
방화벽 — 포트 기반 접근 제어 (ACL)
NAT / PAT 장비 — 포트를 바꿔 주소 변환
보안 장비로는 방화벽이 이 계층의 대표
계측 · 점검 항목
• RTT (왕복 지연) · 지터
• 재전송률 — 높으면 회선·혼잡 문제
• 윈도우 크기 · 처리량(Throughput)
• 동시 연결 수 · TIME_WAIT 누적
• 포트 스캔 탐지
• PDU = 세그먼트(TCP) / 데이터그램(UDP), 주소 = 포트 번호
• 포트는 각 16비트 (출발지+목적지 합쳐 32비트)
• Sequence Number = 데이터의 첫 바이트 번호
• 흐름 제어 = 슬라이딩 윈도우 / 혼잡 제어 = Slow Start (구분!)
• 연결 3-way, 해제 4-way
• UDP 헤더는 고정 8바이트, 멀티캐스트 가능