컴퓨터 네트워크 — 3강: 전송 계층·TCP 상세와 네트워크 계층
전송 계층 개요
전송 계층 (Transport Layer, L4):
→ 종단 간(End-to-End) 통신 제공
→ 포트 번호로 프로세스 식별
→ 두 핵심 프로토콜: TCP / UDP
포트 번호 범위:
→ 잘 알려진 포트 (Well-Known): 0~1023
HTTP: 80 / HTTPS: 443 / SSH: 22
FTP: 21 / SMTP: 25 / DNS: 53
→ 등록된 포트: 1024~49151
→ 동적/사설 포트: 49152~65535
다중화 (Multiplexing):
→ 여러 프로세스의 데이터를 하나의 네트워크 연결로
→ (출발지 IP, 출발지 포트, 목적지 IP, 목적지 포트): 소켓 식별
→ TCP: 4-튜플로 연결 구분
→ UDP: 목적지 포트로만 구분 가능
UDP (User Datagram Protocol)
UDP 특성:
→ 비연결형 (Connectionless)
→ 비신뢰성: 전달 보장 없음
→ 순서 보장 없음
→ 흐름·혼잡 제어 없음
→ 낮은 오버헤드, 빠름
UDP 헤더 (8 bytes):
→ 출발지 포트 (2B) / 목적지 포트 (2B)
→ 길이 (2B) / 체크섬 (2B)
UDP 활용 사례:
→ DNS 조회 (빠른 응답 우선)
→ 실시간 스트리밍 (지연 최소화)
→ 온라인 게임 (일부 패킷 손실 허용)
→ VoIP, 화상 통화
→ DHCP (브로드캐스트 필요)
→ QUIC 프로토콜 (HTTP/3의 기반 — UDP 위에 신뢰성 추가)
UDP vs TCP 선택:
→ 신뢰성 > 속도: TCP
→ 속도·실시간 > 신뢰성: UDP
→ 브로드캐스트/멀티캐스트 필요: UDP
TCP (Transmission Control Protocol)
TCP 특성:
→ 연결 지향 (Connection-Oriented)
→ 신뢰성: 재전송·ACK
→ 순서 보장: 시퀀스 번호
→ 흐름 제어·혼잡 제어
→ 전이중 통신
TCP 헤더 주요 필드:
→ 출발지·목적지 포트 (각 2B)
→ 시퀀스 번호 (4B): 데이터 바이트 순서
→ ACK 번호 (4B): 다음 기대 바이트
→ 헤더 길이, 플래그 비트:
SYN, ACK, FIN, RST, PSH, URG
→ 윈도우 크기 (2B): 수신 버퍼 크기
→ 체크섬 (2B)
3-Way Handshake (연결 설정):
→ 클라이언트 → 서버: SYN (seq=x)
→ 서버 → 클라이언트: SYN-ACK (seq=y, ack=x+1)
→ 클라이언트 → 서버: ACK (ack=y+1)
4-Way Handshake (연결 종료):
→ 클라이언트: FIN
→ 서버: ACK
→ 서버: FIN
→ 클라이언트: ACK (TIME_WAIT 상태)
TIME_WAIT:
→ 마지막 ACK 유실 대비 (2MSL 대기)
→ 지연 패킷 처리
신뢰성 메커니즘:
→ 시퀀스 번호 + ACK: 수신 확인
→ 재전송 타이머 (RTO): 응답 없으면 재전송
→ 중복 ACK: 3번 중복 → 빠른 재전송
→ 선택적 ACK (SACK): 수신한 범위 세밀히 알림
TCP 흐름 제어·혼잡 제어
흐름 제어 (Flow Control):
→ 수신자 버퍼 넘침 방지
→ 슬라이딩 윈도우:
수신 윈도우 크기 = 수신 버퍼 여유 공간
→ 수신자가 윈도우 크기를 헤더에 알림
→ 송신자는 ACK 없이 윈도우 크기만큼만 전송
혼잡 제어 (Congestion Control):
→ 네트워크 혼잡 방지 (라우터 큐 오버플로)
→ 혼잡 윈도우 (cwnd): 송신자 측 제한
→ 실제 전송 = min(수신 윈도우, 혼잡 윈도우)
슬로우 스타트 (Slow Start):
→ cwnd = 1 MSS 에서 시작
→ ACK마다 cwnd 2배 증가 (지수)
→ ssthresh 도달 시 혼잡 회피로 전환
혼잡 회피 (Congestion Avoidance):
→ RTT마다 cwnd += 1 (선형 증가)
→ 패킷 손실 감지 시:
타임아웃: ssthresh = cwnd/2, cwnd = 1 (슬로우 스타트)
3-중복 ACK: ssthresh = cwnd/2, cwnd = ssthresh (빠른 복구)
AIMD (Additive Increase / Multiplicative Decrease):
→ 혼잡 없음: cwnd 선형 증가
→ 혼잡 감지: cwnd 절반 감소
→ 공정성: 여러 TCP 연결이 대역폭 공평히 공유
TCP 버전:
→ TCP Tahoe: 타임아웃/중복 ACK → cwnd=1
→ TCP Reno: 중복 ACK → 빠른 복구 (cwnd=ssthresh)
→ TCP CUBIC: 리눅스 기본, 대역폭 손실 후 빠른 회복
→ TCP BBR: 구글 개발, 지연 기반 혼잡 제어
네트워크 계층: IP
IP (Internet Protocol):
→ 비연결형, 비신뢰성 (Best Effort)
→ 단편화 (Fragmentation): MTU 초과 시 분할
→ TTL (Time-to-Live): 라우터마다 1씩 감소 → 0이면 폐기
IPv4 주소:
→ 32비트 (4 옥텟): 192.168.1.1
→ 약 43억 개 → 고갈 문제
서브네팅 (Subnetting):
→ 네트워크를 여러 서브넷으로 분할
→ 서브넷 마스크: /24 = 255.255.255.0
→ CIDR (Classless Inter-Domain Routing):
192.168.1.0/24 → 앞 24비트 네트워크
호스트 수: 2^(32-24) - 2 = 254개
사설 IP 대역:
→ 10.0.0.0/8
→ 172.16.0.0/12
→ 192.168.0.0/16
NAT (Network Address Translation):
→ 사설 IP → 공인 IP 변환
→ IPv4 주소 부족 해결
→ 포트 번호 함께 변환 (NAPT/PAT)
IPv6:
→ 128비트 주소: 사실상 무한
→ 헤더 단순화 (단편화 라우터에서 불허)
→ IPsec 내장
→ 이중 스택: IPv4·IPv6 동시 운영
→ 터널링: IPv6 패킷을 IPv4로 캡슐화
라우팅 프로토콜
라우팅 기본:
→ 포워딩 테이블: 목적지 IP → 출력 인터페이스
→ 정적 라우팅: 관리자가 직접 설정
→ 동적 라우팅: 프로토콜로 자동 계산
라우팅 알고리즘:
링크 상태 알고리즘 (Link State):
→ 전체 네트워크 토폴로지 정보 수집
→ 다익스트라(Dijkstra) 알고리즘으로 최단 경로
→ 빠른 수렴, 오버헤드 큼
거리 벡터 알고리즘 (Distance Vector):
→ 이웃 라우터에서 거리 정보 교환
→ 벨만-포드(Bellman-Ford) 알고리즘
→ 카운트-투-인피니티 문제
→ 수렴 느림
AS (자율 시스템):
→ 하나의 관리 정책 하 라우터 그룹
→ IGP: AS 내부 라우팅
→ EGP: AS 간 라우팅
OSPF (Open Shortest Path First):
→ 링크 상태 프로토콜
→ AS 내부 (IGP)
→ 빠른 수렴, 계층적 구조 (영역)
BGP (Border Gateway Protocol):
→ AS 간 라우팅 (EGP)
→ 인터넷 백본의 핵심
→ 경로 벡터 방식 (AS 경로 포함)
→ 정책 라우팅 가능
RIP (Routing Information Protocol):
→ 거리 벡터 (홉 수 기준, 최대 15)
→ 소규모 네트워크, 단순
자주 묻는 질문
Q. TCP의 혼잡 제어와 흐름 제어는 어떻게 다른가요? A. 흐름 제어는 수신자의 처리 능력에 맞추기 위한 것으로, 수신 버퍼가 넘치지 않도록 수신자가 윈도우 크기를 송신자에게 알립니다. 혼잡 제어는 네트워크 중간 경로(라우터 등)의 혼잡을 방지하기 위한 것으로, 패킷 손실이나 지연 증가를 감지해 송신 속도를 조절합니다. 두 메커니즘 모두 전송 속도를 제한하지만 관심 대상이 다릅니다.
Q. IPv6로 전환이 왜 이렇게 오래 걸리나요? A. IPv4와 IPv6는 호환되지 않아 동시 지원 인프라가 필요합니다. NAT로 IPv4 주소 부족 문제를 임시 해결하면서 전환 동기가 줄었고, 수많은 레거시 장치·소프트웨어의 업그레이드 비용이 큽니다. 인터넷 서비스 제공자(ISP), 기업 네트워크, 가정용 라우터까지 전체 생태계가 바뀌어야 하므로 전환이 점진적으로 이루어지고 있습니다. 현재는 이중 스택(IPv4+IPv6 동시 지원)이 일반적입니다.
O
OIYO 편집부
Content Editor지식 인큐베이터이자 전문 콘텐츠 크리에이터. 경영, 경제, 법률 및 실생활에 유용한 실무/자격증 중심의 깊이 있는 정보를 연구하고 공유합니다.