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대다, 다대다 통신 |