STUDY

[네트워크] TCP와 UDP 정리: 연결형 통신과 비연결형 통신

sed 2026. 5. 28. 20:01
SMALL

TCP와 UDP

전송 계층의 대표적인 프로토콜에는 TCP와 UDP가 있다.

 

TCP(Transmission Control Protocol)는 신뢰할 수 있는 통신을 제공하는 연결형 프로토콜이다.

UDP(User Datagram Protocol)는 TCP보다 신뢰성은 낮지만 비교적 빠른 통신이 가능한 비연결형 프로토콜이다.

 

네트워크 통신에서 신뢰성과 속도는 종종 서로 충돌한다.  

데이터가 제대로 도착했는지 확인하고, 손실된 데이터를 다시 보내고, 전송 속도를 조절하려면 그만큼 추가 작업이 필요하다.

 

TCP는 이런 작업을 수행해 신뢰성 있는 전송을 제공한다.  

반면 UDP는 연결 수립이나 재전송, 흐름 제어, 혼잡 제어 같은 기능을 최소화하여 더 단순하고 빠르게 데이터를 보낸다.

TCP
신뢰성 있는 통신
연결형 프로토콜
상대적으로 오버헤드가 큼

UDP
빠른 통신
비연결형 프로토콜
상대적으로 오버헤드가 작음

 

전송 계층의 중요한 기능들은 대부분 TCP에서 제공된다.

 

TCP 통신 과정

TCP는 데이터를 보내기 전에 먼저 연결을 수립한다.

 

두 호스트가 데이터를 주고받기 전에 서로 통신할 준비가 되었는지 확인하고, 연결이 만들어진 뒤 데이터 송수신이 이루어진다.

 

데이터 송수신 중에는 신뢰성 있는 전송을 위한 여러 기능이 동작한다.

 

대표적으로 다음 기능들이 있다.

재전송을 통한 오류 제어
흐름 제어
혼잡 제어
순서 보장

 

데이터 송수신이 끝나면 연결을 종료한다.

 

TCP 통신 흐름은 다음과 같이 볼 수 있다.

연결 수립
데이터 송수신
연결 종료

 

TCP는 연결을 만들고, 상태를 유지하고, 통신이 끝나면 연결을 정리하는 프로토콜이다.

MSS

MSS(Maximum Segment Size)는 TCP로 전송할 수 있는 최대 페이로드 크기이다.

 

여기서 중요한 점은 MSS가 TCP 헤더 크기를 제외한 값이라는 것이다.

 

MTU와 MSS는 헷갈리기 쉽다.

 

MTU는 한 번에 전송할 수 있는 IP 패킷의 최대 크기이며, IP 헤더와 TCP 헤더까지 포함한다.

반면 MSS는 TCP 세그먼트에서 실제 데이터 부분, 곧 페이로드의 최대 크기를 의미한다.

MTU
IP 패킷 전체의 최대 크기
IP 헤더와 TCP 헤더 포함

MSS
TCP로 보낼 수 있는 최대 데이터 크기
TCP 헤더 제외

 

예를 들어 일반적인 이더넷 MTU가 1500바이트라고 하자.
IPv4 헤더가 20바이트이고 TCP 헤더가 20바이트라면, TCP가 실제 데이터로 보낼 수 있는 크기는 보통 1460바이트가 된다.

 

TCP 세그먼트 구조

TCP에서 주고받는 데이터 단위를 TCP 세그먼트라고 한다.

TCP 세그먼트에는 여러 필드가 있다.

대표적으로 다음과 같은 필드가 포함된다.

송신지 포트
수신지 포트
순서 번호
확인 응답 번호
데이터 오프셋
예약 필드
제어 비트
윈도우
체크섬
긴급 포인터
옵션
데이터

 

 

 

이 중에서 핵심적으로 봐야 할 필드는 송신지 포트, 수신지 포트, 순서번호, 확인 응답 번호, 제어 비트(ACK, SYN, FIN), 윈도우이다.

 

 

송신지 포트와 수신지 포트

포트 번호는 실행 중인 응용 프로그램 프로세스를 식별하는 번호이다.

 

IP 주소가 호스트를 찾기 위한 주소라면, 포트 번호는 그 호스트 안에서 어떤 응용 프로그램과 통신할지를 구분하는 번호이다.

 

예를 들어 하나의 컴퓨터에서 웹 브라우저, 메신저, 게임 클라이언트가 동시에 실행되고 있을 수 있다.
전송 계층은 포트 번호를 이용해 데이터를 어떤 응용 프로그램으로 전달해야 하는지 구분한다.

 

TCP 세그먼트에는 송신지 포트와 수신지 포트가 들어 있다.

송신지 포트
데이터를 보낸 응용 프로그램의 포트 번호

수신지 포트
데이터를 받을 응용 프로그램의 포트 번호

 

포트 번호는 16비트로 표현된다.

 

따라서 표현할 수 있는 포트 번호의 범위는 0에서 65535(2^16-1)까지이다.

 

순서 번호

순서 번호(sequence number)는 송수신되는 데이터의 순서를 보장하기 위해 사용된다.

 

TCP는 데이터를 바이트 단위의 흐름으로 본다.
순서 번호는 세그먼트에 담긴 데이터의 첫 번째 바이트에 부여되는 번호이다.

 

TCP 세그먼트가 네트워크를 통해 이동하다 보면 순서가 바뀌어 도착할 수 있다.
순서 번호가 있으면 수신자는 도착한 세그먼트들을 올바른 순서로 재조립할 수 있다.

또한 어떤 데이터가 손실되었는지도 파악할 수 있다.

 

확인 응답 번호

확인 응답 번호(acknowledgement number)는 상대 호스트가 보낸 데이터에 대한 응답이다.

확인 응답 번호에는 다음으로 수신하기를 기대하는 순서 번호가 들어간다.

 

예를 들어 수신자가 100번부터 599번까지의 데이터를 받았다면, 다음으로 기대하는 순서 번호는 600번이다.

이때 확인 응답 번호는 600이 된다.

 

확인 응답 번호를 유효하게 사용하려면 TCP 제어 비트 중 ACK 비트가 1로 설정되어야 한다.

 

TCP 통신은 순서 번호와 확인 응답 번호를 주고받으며 진행된다.

 

순서 번호 계산 예시

응용 계층으로부터 1900바이트 크기의 데이터를 전달받았다고 하자.

MSS가 500바이트라면 이 데이터는 TCP에서 4개의 세그먼트로 나뉠 수 있다.

전체 데이터 크기: 1900바이트
MSS: 500바이트

세그먼트 A: 500바이트
세그먼트 B: 500바이트
세그먼트 C: 500바이트
세그먼트 D: 400바이트

 

초기 순서 번호를 100이라고 하자.

 

초기 순서 번호는 ISN(Initial Sequence Number)이라고 하며, 보통 무작위 값으로 정해진다.

 

순서 번호는 다음처럼 계산할 수 있다.

순서 번호 = 초기 순서 번호 + 지금까지 송신한 바이트 수

 

세그먼트별 순서 번호는 다음과 같다.

세그먼트 A
순서 번호: 100
데이터 크기: 500바이트

세그먼트 B
순서 번호: 100 + 500 = 600
데이터 크기: 500바이트

세그먼트 C
순서 번호: 100 + 1000 = 1100
데이터 크기: 500바이트

세그먼트 D
순서 번호: 100 + 1500 = 1600
데이터 크기: 400바이트

 

수신자가 세그먼트 A를 정상적으로 받았다면 다음으로 기대하는 번호는 600이다.

수신자가 세그먼트 B까지 정상적으로 받았다면 다음으로 기대하는 번호는 1100이다.

확인 응답 번호는 이런 식으로 다음에 받을 바이트 번호를 알려준다.

 

제어 비트

제어 비트는 현재 TCP 세그먼트의 성격을 나타내는 비트들이다.

제어 비트는 플래그 비트라고도 부른다.

 

각 비트는 고유한 의미를 가진다.

 

그중 TCP 연결 수립과 종료에서 특히 중요한 것은 ACK, SYN, FIN이다.

 

ACK
확인 응답 번호가 유효함을 나타내는 비트

SYN
연결 수립을 요청할 때 사용하는 비트

FIN
연결 종료를 요청할 때 사용하는 비트

 

ACK는 상대방이 보낸 세그먼트를 확인했다는 의미로 사용된다.

SYN은 TCP 연결을 시작할 때 사용된다.

FIN은 TCP 연결을 끝낼 때 사용된다.

 

윈도우

윈도우(window) 필드에는 수신 윈도우의 크기가 명시된다.

 

수신 윈도우는 수신자가 한 번에 받고자 하는 데이터의 양을 의미한다.

 

TCP는 수신자가 처리할 수 있는 양보다 더 많은 데이터를 한꺼번에 보내지 않도록 조절한다.

 

수신 윈도우는 흐름 제어와 관련된다.

윈도우
수신자가 받을 수 있는 데이터 양

흐름 제어
수신자의 처리 능력을 넘지 않도록 송신량을 조절하는 기능

 

 

TCP 연결 수립

TCP는 데이터를 주고받기 전에 연결을 수립한다.

 

TCP 연결 수립 과정은 세 단계로 이루어진다.

이를 3-way handshake라고 한다.

 

호스트 A가 호스트 B에게 연결을 요청한다고 하자.

 

첫 번째 단계에서 A는 B에게 SYN 세그먼트를 보낸다.

A가 B에게 SYN 전송
연결을 시작하고 싶다는 의미
A의 초기 순서 번호 포함
SYN = 1

 

두 번째 단계에서 B는 A에게 SYN+ACK 세그먼트를 보낸다.

B가 A에게 SYN+ACK 전송
A의 연결 요청을 확인했다는 의미
B도 연결을 시작하겠다는 의미
B의 초기 순서 번호 포함
A의 세그먼트에 대한 확인 응답 번호 포함
SYN = 1
ACK = 1

 

세 번째 단계에서 A는 B에게 ACK 세그먼트를 보낸다.

A가 B에게 ACK 전송
B의 연결 요청을 확인했다는 의미
ACK = 1

 

이 세 단계가 끝나면 TCP 연결이 수립된다.

1. A → B: SYN
2. B → A: SYN + ACK
3. A → B: ACK

 

연결을 먼저 시작하는 호스트의 동작을 액티브 오픈(active open)이라고 한다.
연결 요청을 기다리고 받아들이는 호스트의 동작을 패시브 오픈(passive open)이라고 한다.

 

TCP 연결 종료

TCP 연결을 종료할 때는 송수신 호스트가 각각 한 번씩 FIN과 ACK를 주고받는다.

 

일반적인 연결 종료 과정은 네 단계로 설명할 수 있다.

이를 4-way handshake라고 부르기도 한다.

 

호스트 A가 연결 종료를 시작한다고 하자.

 

첫 번째 단계에서 A는 B에게 FIN 세그먼트를 보낸다.

A가 B에게 FIN 전송
연결을 종료하고 싶다는 의미
FIN = 1

 

두 번째 단계에서 B는 A에게 ACK 세그먼트를 보낸다.

B가 A에게 ACK 전송
A의 종료 요청을 확인했다는 의미
ACK = 1

 

세 번째 단계에서 B도 A에게 FIN 세그먼트를 보낸다.

B가 A에게 FIN 전송
B도 연결을 종료하겠다는 의미
FIN = 1

 

네 번째 단계에서 A는 B에게 ACK 세그먼트를 보낸다.

A가 B에게 ACK 전송
B의 종료 요청을 확인했다는 의미
ACK = 1

 

정리하면 다음과 같다.

1. A → B: FIN
2. B → A: ACK
3. B → A: FIN
4. A → B: ACK

 

연결 종료를 먼저 시작하는 호스트의 동작을 액티브 클로즈(active close)라고 한다.
종료 요청을 받는 호스트의 동작을 패시브 클로즈(passive close)라고 한다.

 

 

 

 


TCP는 상태를 유지한다

TCP는 현재 통신이 어떤 단계에 있는지 상태를 유지한다.

 

상태란 현재 연결이 대기 중인지, 연결 수립 중인지, 데이터 송수신 중인지, 종료 중인지를 나타내는 정보이다.

 

TCP처럼 상태를 유지하고 활용하는 프로토콜을 스테이트풀(stateful) 프로토콜이라고 한다.

반대로 상태를 유지하지 않고 동작하는 프로토콜을 스테이트리스(stateless) 프로토콜이라고 한다.

 

UDP는 대표적인 스테이트리스 프로토콜이다.
HTTP도 기본적으로는 스테이트리스 프로토콜로 설명된다.

 

 

TCP 상태

TCP 상태는 크게 세 흐름으로 나누어 볼 수 있다.

연결이 수립되지 않은 상태
연결 수립 과정의 상태
연결 종료 과정의 상태

 

연결이 수립되지 않은 상태

CLOSED는 아무 연결도 없는 상태이다.

연결이 시작되기 전이나 연결이 완전히 종료된 뒤의 상태이다.

 

LISTEN은 연결 요청을 기다리는 상태이다.

서버로 동작하는 패시브 오픈 호스트는 일반적으로 LISTEN 상태에 있다.
LISTEN 상태의 호스트에게 SYN 세그먼트가 도착하면 3-way handshake가 시작된다.

CLOSED
연결 없음

LISTEN
연결 요청 대기
SYN 세그먼트를 기다리는 상태

 

 

연결 수립 과정의 상태

SYN-SENT는 연결 요청을 보낸 뒤 응답을 기다리는 상태이다.

액티브 오픈 호스트가 SYN 세그먼트를 보낸 뒤, 상대방의 SYN+ACK 세그먼트를 기다릴 때 이 상태가 된다.

 

SYN-RECEIVED는 SYN을 받은 뒤 SYN+ACK를 보내고, 그에 대한 ACK를 기다리는 상태이다.

패시브 오픈 호스트가 연결 요청을 받고 응답을 보낸 뒤 이 상태가 된다.

 

ESTABLISHED는 연결이 확립된 상태이다.

이 상태에서는 실제 데이터 송수신이 이루어진다.

SYN-SENT
SYN 전송 후 SYN+ACK 대기

SYN-RECEIVED
SYN+ACK 전송 후 ACK 대기

ESTABLISHED
연결 수립 완료
데이터 송수신 가능

 

연결 종료 과정의 상태

FIN-WAIT-1은 연결 종료를 먼저 시작한 호스트가 FIN 세그먼트를 보낸 뒤의 상태이다.

ESTABLISHED 상태에서 FIN을 먼저 보내면 액티브 클로즈가 시작되고, 이때 FIN-WAIT-1 상태가 된다.

 

FIN-WAIT-2는 FIN-WAIT-1 상태에서 상대방의 ACK를 받은 뒤, 상대방의 FIN을 기다리는 상태이다.

 

CLOSE-WAIT은 상대방의 FIN을 받고 ACK를 보낸 뒤 대기하는 상태이다.

패시브 클로즈 호스트는 상대방의 종료 요청을 확인한 뒤, 자신도 종료 준비를 마치고 FIN을 보낼 때까지 CLOSE-WAIT 상태에 있을 수 있다.

 

LAST-ACK은 CLOSE-WAIT 상태에서 FIN을 보낸 뒤, 그에 대한 ACK를 기다리는 상태이다.

 

TIME-WAIT은 액티브 클로즈 호스트가 상대방의 FIN을 받고 ACK를 보낸 뒤 일정 시간 기다리는 상태이다.

 

패시브 클로즈 호스트는 마지막 ACK를 받으면 CLOSED 상태로 전이한다.


액티브 클로즈 호스트는 TIME-WAIT 상태에서 일정 시간을 기다린 뒤 CLOSED 상태로 전이한다.

 

TIME-WAIT은 마지막 ACK가 유실될 가능성이나 이전 연결의 지연된 세그먼트 문제를 처리하기 위해 존재한다.

FIN-WAIT-1
FIN 전송 후 ACK 대기

FIN-WAIT-2
ACK 수신 후 상대방 FIN 대기

CLOSE-WAIT
상대방 FIN 수신 후 ACK 전송, 이후 종료 준비

LAST-ACK
FIN 전송 후 ACK 대기

TIME-WAIT
마지막 ACK 전송 후 일정 시간 대기

 

 

 

 

UDP

UDP(User Datagram Protocol)는 TCP와 달리 비연결형 통신을 수행하는 프로토콜이다.

 

UDP는 연결 수립과 연결 종료 과정을 거치지 않는다.
재전송을 통한 오류 제어, 혼잡 제어, 흐름 제어도 TCP처럼 제공하지 않는다.

상태도 유지하지 않는다.

UDP
비연결형 프로토콜
신뢰성을 보장하지 않음
상태를 유지하지 않음
오버헤드가 작음

 

UDP는 TCP보다 기능이 단순하다.
그만큼 빠르게 패킷을 처리할 수 있다.

UDP 데이터그램 구조

UDP에서 주고받는 전송 단위를 UDP 데이터그램이라고 한다.

UDP 헤더는 TCP보다 단순하다.

 

대표적인 필드는 다음과 같다.

송신지 포트
수신지 포트
길이
체크섬
데이터

 

 

송신지 포트와 수신지 포트는 어떤 응용 프로그램이 데이터를 보내고 받는지 구분하는 데 사용된다.

 

길이 필드는 UDP 헤더와 데이터 전체 길이를 나타낸다.

 

체크섬은 데이터가 전송 중 손상되었는지 확인하는 데 사용된다.

 

UDP는 TCP처럼 순서 번호나 확인 응답 번호를 사용하지 않는다.

연결 수립을 위한 SYN, 연결 종료를 위한 FIN 같은 제어 비트도 없다.

 

UDP가 사용되는 경우

UDP는 신뢰성보다 빠른 전송이 중요한 상황에서 자주 사용된다.

 

예를 들어 실시간 스트리밍, 인터넷 전화, 온라인 게임처럼 약간의 손실보다 지연 시간이 더 문제가 되는 상황이 있다.

 

동영상 스트리밍에서 일부 데이터가 조금 손실되더라도, 재전송 때문에 영상이 멈추는 것보다 계속 재생되는 편이 나을 수 있다.

인터넷 전화도 마찬가지이다.

 

일부 음성이 조금 끊기더라도 재전송을 기다리느라 대화가 늦게 전달되면 더 큰 문제가 된다.

 

 

TCP와 UDP 비교

TCP와 UDP를 비교하면 다음과 같다.

 

구분 TCP UDP
연결 방식 연결형 비연결형
신뢰성 높음 낮음
속도 상대적으로 느림 상대적으로 빠름
상태 유지 상태 유지 상태 유지 안 함
오류 제어 제공 제한적
흐름 제어 제공 제공하지 않음
혼잡 제어 제공 제공하지 않음
데이터 단위 세그먼트 데이터그램
대표 사용 예 웹, 파일 전송, 이메일 스트리밍, 인터넷 전화, DNS

LIST