TCP는 연결 지향형 프로토콜이고UDP는 데이터를 데이터 그램 단위로 전송하는 프로토콜이다.
TCP는 가상회선을 만들어 흐름제어, 혼잡제어, 오류제어를 통해 신뢰성을 보장하고UDP는 신뢰성 보장을 위한 절차가 따로 없다.
그렇기에TCP는UDP보다 느리지만 파일 전송과 같은 신뢰성이 중요한 서비스에 사용되고,UDP는 스트리밍, RTP와 같은 연속성이 중요한 서비스에 사용된다.
UDP에 개발자가 직접 신뢰성을 보장하도록 할 수 있다.HTTP/3는UDP에 추가적인 정의를 통해 신뢰성을 보장한QUIC이라는 프로토콜을 기반으로 하고 있다.
TCP와 UDP는 TCP/IP 4 Layer에서 전송계층에 사용되는 프로토콜로 목적지 장비까지 전송한 패킷을 상위 특정 응용 프로토콜에게 전달하는 목적을 가진다.
전송계층: IP에 의해 전달되는 패킷의 오류 검사를 하고 재전송 요구 등의 제어를 담당하는 계층이다.패킷: 인터넷 내에서 데이터를 보내기 위한 라우팅(경로배정)을 효율적으로 하기 위해 여러 개로 나눈 데이터 조각이다.- HTTP 웹 통신, 이메일, 파일 전송에 사용된다.
인터넷 상에서 데이터를 메시지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜이다
- 장치들간의 논리적인 접속을 성립시키기 위해 연결을 설정하여 신뢰성을 보장하는 연결형 서비스이다.
- 네트워크에 연결된 컴퓨터에서 실행되는 프로그램 간에 일련의
옥텟 (데이터, 메시지, 시그먼트라는 블록 단위)를 안정적, 순차적, 에러 없이 교환할 수 있게 한다.- 일반적으로 TCP와 IP를 함께 사용하는데, IP가 데이터 배달 처리를 하면 TCP는 패킷을 추적하고 관리한다.
- A, B, C 패킷이 순차적으로 전달되는 상황에서 B가 분실된 경우 목적지에서 A, B, C가 모두 필요한지 모르고 A, C만 보고 다 왔다고 착각할 수 있다.
- A, B, C 패킷에 1, 2, 3이라는 번호를 부여하고 목적지에서 이를 재조립하여 패킷의 분실 확인 및 추적을 한다.
📢TCP Header

TCP는 응용 계층으로부터 받은 데이터에 Header를 추가한 뒤 IP로 보낸다.
송수신자의 포트 번호: TCP로 연결되는 가상 회선 양단의 송수신 프로세스에 할당되는 포트 주소시퀀스 번호(Sequence Number): 송신자가 지정하는 순서 번호, 전송되는 바이트 수를 기준으로 증가.응답 번호(ACK Number): 수신 프로세스가 제대로 수신한 바이트의 수를 응답하기 위해 사용.데이터 오프셋(Data Offset): TCP 세그먼트의 시작 위치를 기준으로 데이터의 시작 위치를 표현(TCP 헤더의 크기)제어 비트(Flag Bit): SYN, ACK, FIN 등의 제어 번호윈도우 크기(Window): 수신 윈도우의 버퍼 크기를 지정할 때 사용체크섬(Checksum): CP 세그먼트에 포함되는 프로토콜 헤더와 데이터에 대한 오류 검출 용도
📢TCP 특징
연결형 서비스로
가상 회선 방식을 제공한다.
가상 회선 방식을 제공한다는 의미 : 발신지와 수신지를 연결하여 패킷 전송하기 위한 논리적 경로를 배정한다는 의미3-way handshaking: 목적지와 수신지를 확실히 정하여 정확한 전송을 보장하기 위해 세션을 수립한다. 👉 TCP Connection4-way handshaking: 세션을 해제한다. 👉 TCP Disconnection
데이터 처리 속도를 조절하여
수신자의 버퍼 오버플로우를 방지한다.
- 송신자가 과도한 데이터를 빠르게 보내는 것을 막아 수신자의 문제발생을 방지한다.
- 수신자가
윈도우 크기 (Window Size)값을 조절하여 수신량을 정할 수 있다.
네트워크 내의 패킷 수가 넘치지 않게 방지
- 정보의 소통량이 과다할 경우, 패킷 전송량을 줄여
혼잡 붕괴 현상을 막는다.
👉 CPU를 사용하는흐름제어,혼잡제어기능 때문에UDP보다 속도가 느리게 된다.
- Dupack-based Retransmission
- 정상적인 상황에서 ACK 패킷이 연속적으로 전송되어야 한다
- ACK 패킷이 중복수신되면 패킷 이상을 감지하고 재전송을 요청한다
- Timeout-based Retransmission
- 일정 시간동안 ACK 패킷 수신을 못하면 재전송을 요청한다 (by
Retransmission Timer라는 커널 타이머)
- 전이중
Full-Duplex: 전송이 양방향으로 동시에 일어날 수 있다- 점대점
Point-to-Point: 각 연결이 정확히 2개의 종단점을 가진다.
👉 멀티캐스팅, 브로드캐스팅을 지원하지 않는다.
📢TCP 연결과 해제

모든 TCP connection은 통신을 시작하기 전, 최초의 연결을 위해 3-way handshake를 진행한다.
- ✍ 1. SYN (synchronize)
- 첫 번째 단계에서 클라이언트는 서버와 연결하기 위해
SYN 플래그 비트가 설정된 세그먼트를 전송한다. 해당 세그먼트는 TCP 통신의 시작을 알린다.- 클라이언트는 SYN 을 보냈으므로
SYN-SENT상태가 된다- ✍ 2. SYN + ACK (Acknowledge)
- 두 번째 단계에서 서버는 클라이언트로부터 SYN을 받는다. 그리고 나서
SYN + ACK의 플래그 비트가 설정된 세그먼트를 클라이언트에게 전송한다.- 서버는 SYN 응답을 받은 상태이므로
SYN-RECEIVED상태가 된다.- ✍ 3. ACK
- 마지막 단계에서 클라이언트는 서버의 응답(SYN + ACK)을 수신 받았다는 의미로
ACK 플래그가 설정된 세그먼트를 서버로 전송한다.- 이후로 클라이언트는 실제 데이터를 전송할 수 있는 상태인
ESTABLISHED상태가 된다- 서버 역시 클라이언트로부터 ACK를 전달받고
ESTABLISHED상태가 된다
3-way handshake은 SYN FLOODING 공격을 받을 수 있다.

공격자가 사용자에게 SYN만 계속 보내면, 사용자는 정상적 클라이언트로 판단하여
SYN + ACK를 응답하지만
공격자로부터ACK를 받지 못해SYN-RECEIVED상태의 세션이 계속 쌓이게 된다.
👉 세션이 쌓이면 SYN Backlog가 가득차 SYN 소켓 정보를 더 이상 쌓을 수 없어 SYN Drop 이 발생하는 문제점이 생긴다.
🥦 해결 방법 : 커널 파라미터net.ipv4.tcp_max_syn_backlog,net.ipv4.tcp_synack_retries
net.ipv4.tcp_max_syn_backlog: 세션을 쌓는 공간인 SYN Backlog의 크기를 설정한다. 👉 더 많이 쌓을 수 있게 조절하여 어느 정도 수준의 Backlog도 버틸 수 있도록 한다.net.ipv4.tcp_synack_retries: SYN에 대한 응답인 SYN + ACK의 재전송 횟수를 설정한다. 👉SYN-RECEIVED상태의 소켓 유지를 막을 수 있다.
TIME_OUT 과 재전송
클라이언트는 SYN에 대한 ACK를 받지 못하면
Retransmission Timer라는 커널 타이머에 의해 SYN을 재전송하게 된다.
- RTT > RTO인 경우 재전송이 일어난다.
RTO (Retransmission Timeout): 응답이 오지 않을 때 재전송을 하기까지의 기다릴 시간RTT (RoundTripTime): 요청을 보낸 직후 응답을 수신받기까지의 시간- 어플리케이션에서 Connection Timeout
Connection Timeout: 최초 handshake 과정에서 SYN, SYN + ACK에서 InitRTO를 사용할 때 재전송이 일어나면 발생하는 에러
InitRTO: 리눅스가 자체적으로 지정한 RTO값이며 1초로 지정되어있다.- InitRTO는 1초로 설정되어 있기 때문에 어플리케이션에서의 Connection Timeout은 3초 이상으로 설정해야 한다.
- 내가 보낸 SYN (1초) + 상대방의 SYN + ACK (1초) 보다 큰 3초 이상으로 설정한다.

TCP 소켓을 통한 데이터 전송이 완료된 후, 서버와 클라이언트는 연결 해제를 위한 4-way handshake를 진행한다
서버와 클라이언트 간 구분이 없고 Active_Closer (연결 해제 요청을 한 쪽), Passive_Closer (연결 해제 요청을 받은 쪽) 으로 구분된다.
- ✍ 1. FIN
Active_Closer에서 소켓을 끊기 위해Passive_Closer에게FIN세그먼트를 전송한다.
Active_Closer는Passive_Closer의 종료 요청 확인을 기다리는 의미로FIN-WAIT1상태가 된다.
FIN-WAIT1상태 : 소켓이 프로세스로부터 회수되어 커널이 처리하는 단계에 진입한 상태Passive_Closer는Active_Closer으로부터 종료 요청 세그먼트를 받고CLOSE-WAIT상태가 된다.
CLOSE-WAIT상태 : 자신의 소켓 프로세스에게 종료 요청을하며 기다리는 상태- ✍ 2. ACK
Passive_Closer는 종료 신호를 받아 내부적으로 소켓을 종료하겠다는 의미로 FIN에 대한ACK세그먼트를 보내게 된다.
Active_Closer는 종료 신호를 수신했다는 ACK 세그먼트를 전달받고Passive_Closer가 소켓을 종료했다는 신호를 기다리는 의미로FIN-WAIT2상태가 된다.Passive_Closer는 내부 소켓 종료까지CLOSE-WAIT상태를 유지한다.- ✍ 3. FIN
Passive_Closer는 내부적으로 소켓이 정상종료 될 경우 이를Active_Closer에 알리는 의미로FIN신호를 보낸다.
Passive_Closer는LASK-ACK상태가 된다.Active_Closer는Passive_Closer가 정상 종료되었다는 신호를 전달받고 확인의 의미로 ACK를 보낸다.
- 이때, ACK가 유실되어
Passive_Closer측의 소켓이 제거되지 않은 문제점이 발생할 수 있는 이유로 일정시간 대기하는TIME-WAIT상태가 된다.- 일정 시간 경과 후 소켓을 종료한다.
- ✍ 4. ACK
Active_Closer는Passive_Closer로부터 소켓이 정상 종료되었다는 신호를 받고 응답으로ACK를 보낸다Passive_Closer는Active_Closer로부터 자신의 FIN 신호에 대한 응답을 받고 소켓을 종료한다.
📢TCP 서버의 특징
- TCP 서버와 클라이언트는
1대1로 연결된다.- 전송 데이터의 크기가 무제한이다. 스트림으로 데이터를 전송한다.
- 패킷에 대한 응답을 하기 때문에 성능이 낮다. (시간 지연, CPU 소모)
- 패킷이 손실된 경우 재전송을 요청하기 때문에 Streaming 서비스에 부적합하다.
데이터를 데이터그램 단위로 처리하는 프로토콜이다
데이터그램: 독립적인 관계를 지니는 패킷이다.- UDP는 TCP와 다르게 비연결형 프로토콜로 연결을 위해 할당되는 논리적인 경로가 없다.
그렇기에 각각의 패킷은 독립적인 관계를 지니며 다른 경로로 전송되고 독립적으로 처리된다.- 인터넷 상에서 정보를 주고 받을 때, 정보는 보낸다는 신호, 받는다는 신호 절차 없이 일방적으로 보낸다.
📢UDP Header

송신자의 포트 번호: 데이터를 보내는 애플리케이션의 포트 번호수신자의 포트 번호: 데이터를 받을 애플리케이션의 포트 번호데이터의 길이: UDP 헤더와 데이터의 총 길이체크섬(Checksum): 데이터 오류 검사에 사용
📢UDP 특징
제약조건이 거의 없고 TCP보다 속도가 매우 빨라 실시간 전송이 필요한 부분에 많이 사용된다
- 인터넷 전화, Streaming 서비스에 적합하다
TCP는 connection, disconnection, ACK를 통한 복잡한 트랜잭션이 필요하지만 UDP는 필요없다.
- DNS, DHCP, SNMP 에 사용된다.
전송측과 수신측의 양방 검증이 필요한 TCP와 다르게 UDP에서는 멀티캐스트, 브로드캐스트가 가능하다
- IPTV에 사용된다.
📢UDP 서버의 특징
- UDP에는 연결 자체가 없기에 서버 소켓, 클라이언트 소켓의 구분이 없다
- UDP는 소켓이 아닌 IP 기반으로 데이터 전송을 한다
- 서버와 클라이언트는
1대1 (Unicast),1대다 (Broadcast),다대다 (Multicast)등으로 연결될 수 있다- 흐름제어가 없다 (패킷이 제대로 전송되었는지, 오류가 없는지 확인할 수 없다)
- 신뢰성보다 성능이 중요한 서비스에 사용된다.
📢공통점
📢차이점
| TCP | UDP |
|---|---|
| 연결이 성공해야 통신 가능 : 연결형 프로토콜 | 연결 없이 통신 가능 : 비연결형 프로토콜 |
| 데이터의 경계를 구분하지 않음 : Byte-Stream Service | 데이터의 경계를 구분함 : Datagram Service |
| 신뢰성 있는 데이터 전송 : 데이터 재전송 있음 | 비신뢰성의 데이터 전송 : 데이터 재전송 없음 |
| 1대1 통신 | 1대1, 1대다, 다대다 통신 |