TCP와 UDP의 목적과 특징
포트를 통한 프로세스 식별
- 패킷의 최종 송수신 대상 : 호스트가 실행하는 프로세스
- ex) 하나의 호스트는 여러 프로세스(인터넷, 게임, 채팅 등) 동시 실행 → 네트워크를 통해 주고받는 패킷 → 프로세스에 전달되어야함
- port를 통해, 특정 호스트가 실행하는 특정 프로세스를 식별할 수 있음
- 형식 → IP 주소 : 포트번호 (ex. 192.168.0.1:8000)
- TCP와 UDP 헤더에는 모두 포트 번호 필드인 송신지 포트번호와 수신지 포트 번호를 포함하고 있음.
- 16비트로 표한할 수 있는 포트 번호의 총 개수는 2^16 == 65536개 ( 0 ~ 65535 )
- 잘 알려진 포트 (well known port) : 0 ~ 1023 번
- 20, 21 : FTP
- 22 : SSH
- 23 : TELNET
- 53 : DNS
- 67, 68 : DHCP
- 80 : HTTP
- 443 : HTTPS
- 등록된 포트 (registered port) : 1024 ~ 49151 번
- 1194 : OpenVPN
- 1433 : Microsoft SQL Server DB
- 3306 : MySQL DB
- 6379 : Redis
- 8080 : HTTP 대체
- 사설 포트(임시 포드) : 49152 ~ 65535
(비) 신뢰성과 (비) 연결형 보장
TCP | UDP |
![]() 순서 번호 필드 : ACK 플래그 확인 응답 번호 필드 : SYN 플래그 일부 제어 비트 : FIN 플래그 |
![]() 송신지 포트 : 송신 프로세스가 할당된 포트 번호 수신지 포트 : 수신 프로세스가 할당된 포트 번호 길이 : 헤더를 포함한 UDP 패킷의 바이트 크기 명시 체크섬 : 송수신 과정에서의 데이터그램 훼손 여부 정보 명시 |
신뢰할 수 있는 연결형 송수신 가능 | 신뢰할 수 없는 연결형 송수신 가능 |
신뢰할 수 있는 프로토콜 & 연결형 프로토콜 | 신뢰할 수 없는 프로토콜 & 비연결형 프로토콜 |
패킷을 주고받기 전 연결 수립 과정 → 패킷을 주고받을 때 신뢰성 보장을 위해 상태 관리, 흐름 제어, 오류 제어, 혼잡 제어 등의 기능 제공 → 송수신 끝나면 연결 종료 | 그런거 없음 |
송수신 속도가 느림 | 송수신 속도가 빠름 |
패킷의 유실 없는 송수신에 적합 | 빠른 송수인에 적합 |
- 순서 번호
- TCP 패킷의 올바른 순서를 보장하기 위해 첫 바이트에 매겨진 번호 → 송수신하고자 하는 데이터의 몇번째 바이트에 해당하는지 알 수 있음
- 확인 응답 번호
- 상대 호스트가 보낸 세그먼트에 대한 응답으로, 수신하길 기대하는 순서 번호 (일반적으로 순서 번호 +1 )
- 제어 비트
- 현재 세그먼트에 대한 부가 정보를 나타내는 정보로, 플래그 비트라고도 부름
- 기본적으로 8비트
- ACK : 세그먼트의 승인을 나타내기 위한 비트
- SYN : 연결을 수립하기 위한 비트
- FIN : 연결을 종료하기 위한 비트
- 순서 번호, 확인 응답 번호 예
- 호스트 B는 A에게 다음으로 101번 세그먼트를 받기 희망 : 확인 응답 필드에 101번
- 이때, 확인 응답 번호를 포함하고 있음을 알리기 위해 ACK 플래그를 1로 설정해야함
TCP의 연결부터 종료까지
TCP의 연결 수립
- 쓰리 웨이 핸드셰이크 (three-way handshake)를 통해 연결 수립이 이루어짐
- 1. 송수신 방향 (A → B) SYN 세그먼트 전송
- 호스트 A가 SYN 비트가 1로 설정된 세그먼트를 호스트 B에게 전송
- 세그먼트의 순서 번호에는 호스트 A의 순서 번호가 포함
- 2. 송수신 방향 (B → A) SYN + ACK 세그먼트 전송
- 1.에 대한 호스트 B의 응답
- ACK 비트와 SYN비트가 1로 설정된 세그먼트를 호스트 A에게 전송
- 세그먼트 순서 번호에, 호스트 B의 순서 번호와 1.에서 보낸 세그먼트에 대한 확인 응답번호 포함
- 3. 송수신 방향 ( A → B ) ACK 세그먼트 전송
- 호스트 A는 ACK 비트가 1로 설정된 세그먼트를 호스트 B에게 전송
- 세그먼트의 순서 번호에는 호스트 A의 순서번호와 2. 에서 보낸 세그먼트에 대한 확인 응답 번호 포함
- 호스트 A와 같이 처음 연결을 시작하는 과정 → 액티브 오픈 (Active open)
- 호스트 B와 같이 연결 요청을 수신한뒤, 그에 대한 연결을 수립하는 과정 → 패시브 오픈(passive open)
- 1. 송수신 방향 (A → B) SYN 세그먼트 전송
TCP의 오류, 흐름, 혼잡 제어
- 1. 재전송을 통한 오류 제어
- TCP 가 잘못 전송된 세그먼트가 있음을 인지 하는 타이밍
- 중복된 ACK 세그먼트가 도착했을때
- 타임아웃이 발생했을 때 == 재전송 타이머의 카운트 다운이 끝난 상황
- 파이프라이닝
- 중복된 ACK 세그먼트가 도착했을때
- TCP 가 잘못 전송된 세그먼트가 있음을 인지 하는 타이밍
- 2. 흐름 제어
- 주체 : 수신 호스트
- 수신 호스트가 한번에 받아 처리할 수 있을 만큼만 전송하는 것
- 즉, 송신 호스트가 수신 호스트의 처리 속도를 고려하며 송수신 속도를 균일하게 맞추는 기능
- TCP 헤더에 window 라는 필드에 수신 호스트가 처리할 수 있는 수신 윈도우 크기가 명시됨!!
- 3. 혼잡 제어
- 혼잡(congestion) : 많은 트래픽으로 인해 패킷의 처리 속도가 느려지거나 유실될 수 있는 상황
- 주체 : 송신 호스트
- 중복 ACK 세그먼트가 도착했을때, 타임아웃이 발생했을때 → 혼잡하다 판단함
- 혼잡 없이 전송할 수 있는 세그먼트의 양 : 혼잡 윈도우 → 클수록 한번에 전송할 수 있는 세그먼트의 수가 많다
- 혼잡 윈도우는 계산하는 과정이 필요함 → 해당의 과정을 혼잡 제어 알고리즘이라 함
- 혼잡 제어 알고리즘
- AIMD(Additive increase/Mutiplicative Decrease) : 합으로 증가, 곱으로 감소라는 의미
- 세그먼트를 보냄 → 응답이 오기까지 혼잡 감지 X → 혼잡 윈도우를 1씩 선형적 증가
- 세그먼트를 보냄 → 응답이 올때 혼잡 감지 O → 혼잡 윈도우를 절반으로 떨어뜨림
- 반복 반복 반복 (아래는 사진)
- RTT(Round Trip Time) : 패킷을 보내고 그에 대한 응답이 수신되기 까지의 시간
- 즉, AIMD는 혼잡이 감지X → RTT마다 1씩 선형적 증가, 혼잡 감지O → 혼잡 윈도우 반토막
- AIMD(Additive increase/Mutiplicative Decrease) : 합으로 증가, 곱으로 감소라는 의미
TCP의 종료
- 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에게 전송함
- 호스트 A와 같이 먼저 연결을 종료하려는 호스트에 의해 수행되는 동작 : 액티브 클로즈(active close)
- 호스트 B와 같이 연결 종료 요청을 받아들이는 호스트에 의해 수행되는 동작 : 패시브 클로즈(passive close)
TCP의 상태 관리
- 상태 관리 프로토콜이라는 점에서 스테이트풀 프로토콜이라고도 함.
- 상태 : 현재 어떤 통신 과정에 있는지 나타내는 정보
- 상태 정보 → 현재 TCP 송수신 현황 판단 및 디버깅의 힌트로 활용될 수 있음
- TCP를 통해 여러 상태가 오가게 됨. 아래 사진은 그것.
- TCP 상태의 항목화
- 1. 연결이 수립되지 않았을때 주로 활용되는 상태
- CLOSED
- 아무런 연결이 없는 상태
- LISTEN
- 연결 대기상태 (SYN 세그먼트를 대기하는 상태)
- CLOSED
- 2. 연결 수립 과정에서 주로 활용되는 상태
- SYN-SENT
- 액티브 오픈 호스트가 SYN 세그먼트를 보낸 뒤, 그에 대한 응답인 SYN + ACK 세그먼트를 기다리는 상태 (연결 요청 전송)
- SYN-RECEIVED
- 패시브 오픈 호스트가 SYN + ACK 세그먼트를 보낸 뒤, 그에 대한 ACK 세그먼트를 기다리는 상태 (연결 요청 수신)
- ESTABLISHED
- 쓰리 웨이 핸드셰이크가 끝난 뒤 데이터를 송수신할 수 있는 상태 (연결 수립)
- SYN-SENT
- 3. 연결 종료 과정에서 주로 활용되는 상태
- FIN-WAIT-1
- 액티브 클로즈 호스트가 FIN 세그먼트로 연결 종료 요청을 보낸 상태 (연결 종료 요청 전송)
- CLOSE-WAIT
- FIN 세그먼트를 받은 패시브 클로스 호스트가 그에 대한 응답으로 ACK 세그먼트를 보낸 후, 대기하는 상태 (연결 종료 요층 승인)
- FIN-WAIT-2
- FIN-WAIT-1 상태에서 ACK 세그먼트를 받은 상태
- LAST-ACK
- CLOSE-WAIT 상태에서 FIN 세그먼트를 전송한 뒤 대기하는 상태
- TIME-WAIT
- 액티브 클로즈 호스트가 마지막 ACK 세그먼트를 전송한 뒤 접어드는 상태
- FIN-WAIT-1
- 1. 연결이 수립되지 않았을때 주로 활용되는 상태
1. 2 수립 전 및 수립 | 3. 연결 종료 과정 |
![]() |
![]() |
- 유의할 점
- 패시브 클로즈 호스트가 마지막 ACK 세그먼트 수신시, CLOSE 상태가 바로 됨
- TIME-WAIT 상태에 접어든 액티브 클로즈 호스트는 일정 시간을 기다린 뒤, CLOSED 상태가 됨!!!
- 마지막 ACK T세그먼트가 올바르게 전송되지 않았을 경우, 재전송이 필요하기 때문에!!
- CLOSING 상태
'CS > 기타' 카테고리의 다른 글
(CS) 네트워크 - 프록시와 안정적인 트래픽 (0) | 2025.03.30 |
---|---|
(CS) 네트워크 - 응용 계층, HTTP의 기초와 응용 (0) | 2025.03.28 |
(CS) 네트워크 - 네트워크 계층 IP (0) | 2025.03.22 |
(CS) 네트워크 - 물리 계층과 데이터 링크 계층 (0) | 2025.03.19 |
(CS) 네트워크 - 기본구조 (1) | 2025.03.18 |