TCP는 Transmission Control Protocol의 약자이다.
UDP는 User Datagram Protocal의 약자이다.
두 프로토콜 모두 패킷을 하나의 컴퓨터에서 다른 컴퓨터로 전달해주는 IP 프로토콜을 기반으로 구현되어 있지만, 서로 다른 특징을 가지고 있다.
TCP는 신뢰성이 요구되는 어플리케이션에서 사용한다. 신뢰성은 높지만 UDP에 비해 속도가 느리다는 점이 있다.
UDP는 데이터를 빠른 속도로 전송하고자 하는 어플리케이션에서 사용한다. 신뢰성은 낮지만 TCP보다 전송 속도가 빠르다.
TCP는 네트워크 계층 중 전송 계층에 해당하는 프로토콜이다.
장치들 사이에 논리적인 접속을 성립하기 위하여 연결을 설정하는 신뢰성을 보장하는 연결형 서비스 이다.
네트워크에 연결된 컴퓨터에서 실행되는 프로그램 간에 일련의 옥텟을 안정적으로, 순서대로, 오류없이 교환할 수 있게 된다.
연결형 서비스
3-way handshaking 과정을 통해 연결을 설정.
4-way handshaking 과정을 통해 연결을 해제.
흐름 제어 (Flow Control)
데이터 처리 속도를 조절하여 수신자의 버퍼 오버플로우를 방지.
송신자가 감당안되는 많은 데이터를 빠르게 보내 수신자가 문제가 일어나는 것을 막는다.
수신자가 윈도우크기(Window Size) 값을 통해 수신량을 정할 수 있다.
혼잡 제어 (Congestion Control)
네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지
정보의 소통량이 과다하면 패킷을 조금만 전송하여 혼잡 붕괴 현상이 일어나는 것을 막는다.
신뢰성이 높은 전송 (Reliable Transmission)
Dupack-based retransmission
정상적인 상황에서는 ACK 값이 연속적으로 전송되어야 한다.
그러나 ACK 값이 중복으로 올 경우 패킷 이상을 감지하고 재전송을 요청한다.
Timeout-based retransmssion
전이중, 점대점 방식
전이중 (Full-Duplex)
점대점 (Point to Point)
ACK는 Acknowledgement의 약자이다.
NAK 또는 NACK는 Negative Acknowledgement의 약자이다.
SYN은 Synchronize의 약자이다.
FIN은 Finish의 약자이다.
먼저 클라이언트가 서버에게 SYN을 보내고 SYN_SENT 상태로 대기한다.
SYN_SENT : 클라이언트가 서버에게 SYN 패킷을 보낸 후, 서버의 SYN-ACK 응답을 기다리는 상태.
SYN 패킷을 받은 서버는 SYN-ACK 패킷을 클라이언트에게 보낸 후 SYN_RCVD 상태로 바꾼다.
SYN_RCVD : 서버가 클라이언트의 SYN 패킷을 받고, SYN-ACK 패킷을 보낸 후 클라이언트의 ACK 응답을 기다리는 상태.
SYN-ACK을 받은 클라이언트는 서버에게 응답 ACK를 보낸 후 ESTABLISHED 상태로 변경한다.
ESTABLISHED : 클라이언트와 서버가 모두 ACK 패킷을 교환하여 연결이 설정된 상태로, 양방향 데이터 전송이 가능한 상태.
클라이언트가 서버에게 FIN 패킷을 보낸 후 FIN_WAIT_1 상태로 대기한다.
FIN_WAIT_1 : 클라이언트가 FIN 패킷을 전송한 후 서버의 ACK 응답을 기다리는 상태.
FIN 패킷을 받은 서버는 클라이언트에게 응답 ACK를 보낸 후 CLOSE_WAIT 상태로 바꾼다. 동시에 해당 포트에 연결되어있는 어플리케이션에게 close() 요청을 한다.
CLOSE_WAIT : 서버가 클라이언트의 FIN 패킷을 수신한 후, 연결 종료를 준비하는 상태.
ACK 패킷을 받은 클라이언트는 FIN_WAIT_2 상태로 변경한다.
FIN_WAIT_2 : 클라이언트가 서버의 ACK 패킷을 수신한 후, 서버의 FIN 패킷을 기다리는 상태.
close() 요청을 받은 서버 어플리케이션은 종료 프로세스를 진행하고 FIN 패킷을 클라이언트에게 보내 LAST_ACK 상태로 바꾼다.
LAST_ACK : 서버가 자신의 FIN 패킷을 전송한 후, 클라이언트의 ACK 응답을 기다리는 상태.
FIN 패킷을 받은 클라이언트는 ACK를 서버에 다시 전송하고 TIME_WAIT 상태로 변경한다.
TIME_WAIT 상태에서 일정 시간이 지나면 CLOSED가 된다. ACK를 받은 서버도 포트를 CLOSED로 닫는다.
TIME_WAIT : 클라이언트가 서버의 FIN 패킷에 대해 ACK 패킷을 보낸 후, 일정 시간 동안 해당 상태를 유지하는 상태.
CLOSED : 연결이 완정히 종료된 상태.
- 반드시 서버만 CLOSE_WAIT 상태를 갖는 것이 아니다.
- 서버가 먼저 종료하겠다고 FIN을 보낼 수 있고, 이러한 경우 서버가 FIN_WAIT_1 상태가 된다.
- 누가 먼저 close()를 요청하느냐에 따라 상태가 달라질 수 있다.
Source Port : 출발지 IP + 포트번호
Destination Port : 목적지 IP + 포트번호
Sequence Number : 시퀀스 번호를 전송하는 데이터의 순서를 의미.
Acknowledgement Number : 수신하기 기대하는 다음 바이트 번호.
HLEN or Data offset
Reserved
Flags
URG(Urgent Pointer) : 긴급 포인터
ACK(Acknowledgment) : 승인 번호
PSH(Push)
RST(Reset) : 강제 연결 초기화
SYN(Synchronize) : 연결 시작
FIN(Finish) : 연결 종료
NS
ECE(ECN Echo)
CWR
Window Size
Checksum
Urgent Pointer
Options
데이터를 데이터크램 단위로 처리하는 프로토콜이다.
테이터그램이란, 독립적인 관계를 지니는 패킷을 뜻하며 UDP는 연결을 위해 할당되는 논리적인 경로가 없어서 데이터를 서로 다른 경로로 독립적으로 처리하는 것을 말한다.
비연결형 서비스로 데이터그램 방식을 제공한다.
정보를 주고 받을 때 정보를 보내거나 받는다는 신호절차를 거치지 않는다.
UDP 헤더의 CheckSum 필드를 통해 최소한의 오류만 검출한다.
신뢰성이 낮다.
TCP보다 속도가 빠르다.
공통점
포트 번호를 이용하여 주소를 지정
데이터 오류 검사를 위한 CheckSum 필드 존재
차이점
TCP
연결이 성공해야 통신이 가능(연결형 프로토콜).
데이터의 경계를 구분하지 않음 (Byte-Stream Service)
신뢰성 있는 데이터 전송 (데이터의 재전송 존재)
일 대 일 (Unicast)통신
UDP
연결 없이 통신이 가능(비연결형 프로토콜).
데이터의 경계를 구분함 (Datagram Service)
비신뢰성 있는 데이터 전송(데이터의 재전송 없음)
일 대 일, 일 대 다(Broadcast), 다 대 다(Multicast)통신