TCP 와 UDP 에 대해 알아보기 위해서는 우선 프로토콜(Protocol) 이 무엇인지 알아야한다.
그럼 프로토콜(Protocol) 이란 무엇일까?
Protocol 이란?
프로토콜(Protocol)은 두 개체 간에 통신을 원활하게 하기 위해 필요한 통신 규약을 말하며, 둘 이상의 통신 개체 간에 교환되는 메세지 포맷과 순서 뿐만 아니라, 메세지의 송수신과 다른 이벤트에 따른 행동들을 정의한다.
Protocol 에 대해 알아보았으니 이제 TCP와 UDP에 대해 알아보도록 하자.
두 프로토콜은 Transport layer 에 해당한다.
TCP (Transmission Control Protocol)
TCP 는 연결 지향적인(connection-oriented) 프로토콜로, 연결이 설정되면 데이터를 두 방향으로 전송할 수 있게 된다.
TCP 의 특징은 데이터를 전송하는 과정에서 오류가 발생하는지 확인하고, 데이터가 전송된 순서대로 전송되도록 보장하는 시스템이 내장되어 있어 데이터 파일, 웹 페이지와 같은 정보를 전송하기에 적합한 프로토콜이다. 즉, 데이터 전송과정에서 오류가 발생할 경우, 재전송을 하여 데이터 손실이 발생하지 않아 신뢰성(reliable)이 높다.
하지만, 그만큼 오버헤드가 증가하여 네트워크에서 사용 가능한 대역폭을 더 많이 사용하게 된다는 단점을 가지고 있다.
사용 예시) HTTPS, HTTP, SMTP, FTP, etc
TCP 헤더 구조는 아래와 같이 구성되어있다.
struct tcpheader {
unsigned short int tcph_srcport;
unsigned short int tcph_destport;
unsigned int tcph_seqnum;
unsigned int tcph_acknum;
unsigned char tcph_reserved:4, tcph_offset:4;
unsigned char tcph_flags;
unsigned short int tcph_win;
unsigned short int tcph_chksum;
unsigned short int tcph_urgptr;
}; /* total tcp header length: 20 bytes (= 160 bits) */
1. tcph_srcport (Source port, 16 bit): 출발지 포트 번호를 표시하는데 사용되며, 사용되지 않을 경우 0 값이 삽입된다.
2. tcph_destport (Destination port, 16 bit): 목적지 포트 번호를 표시하는데 사용되며, 특정 서버에 연결할 수 있는 대상(목적지) 포트 번호를 저장
3. tcph_seqnum (Sequence number, 32 bit): TCP Segment 를 열거하는데 사용되며, TCP 연결의 데이터는 Segment 에 얼마든지 포함될 수 있으며, Segment는 순서대로 정렬되고 승인된다.
4. tcph_acknum (Acknowledgment number, 32 bit): ACK 제어 비트가 설정된 경우 Sequence number 값이 포함되며, tcph_acknum 필드를 사용하여 전송되고 연결의 유효한 부분을 확인하는데 사용. 즉, 상대방으로부터 세그먼트가 잘 전달 받았는지 확인하고 알려준다.
5. tcph_reserved (Reserved, 4 bit): 나중에 사용할 수 있도록 4bit 를 예약해놓은 공간이며, 사용되지 않으므로 0으로 채워져 있다.
6. tcph_offset (Offset, 4 bit): TCP 헤더의 길이를 4 byte 단위로 나타내어 저장, TCP 헤더 옵션이 없을 경우 5가 저장
7. tcph_flags (Flags, 8 bit): 세그먼트의 종류를 표시
7-1. TH_URG(Urgent): 연결 종료 또는 프로세스 중지 (Telnet protocol 사용)에 사용되는 세그먼트가 더 빠르게 라우팅 됨.
7-2. TH_ACK(Acknowledgement): TCP 연결 시작의 두 번째 (SYN + ACK) 및 세 번째 단계 (ACK) 에서 데이터를 확인하는데 사용
7-3. TH_PSH (Push): 시스템 IP 스택은 세그먼트를 버퍼링 하지 않고 즉시 애플리케이션으로 전달 (대부분 Telnet 과 함께 사용)
7-4. TH_RST (Reset): peer 에게 연결이 종료 되었음을 알림.
7-5. TH_SYN (Synchronization): SYN Flag가 설정된 세그먼트는 클라이언트가 대상 포트에 대한 새 연결을 시작하려고 한다는 것을 나타냄.
7-6. TH_FIN (Final): 연결을 닫아야 하며, peer 는 FIN 플래그가 설정된 마지막 세그먼트로 응답해야함.
8. tcph_win (Window, 16 bit): 더 많은 세그먼트들이 전송되기 전에 ACK를 사용하여 데이터를 승인하기 전에 보낼 수 있는 바이트 수
9. tcph_chksum (Checksum, 16 bit): 헤더와 데이터에 에러가 존재하는지 확인하기 위한 부분이며, TCP는 에러가 발생할 경우 에러 복구를 수행한다.
10. tcph_urgptr (Urgent Pointer, 16 bit): TH_URG 플래그가 설정된 경우에만 사용 가능하며, 그렇지 않을 경우 0 이다. 우선 순위에 따라 전송해야하는 페이로드 데이터의 끝을 가리킨다.
UDP (User Datagram Protocol)
UDP 는 오류 검사 및 복구 서비스 없이 간단하고 연결이 없는(connectionless) 인터넷 프로토콜이다.
UDP 의 특징은 연결을 열거나, 연결을 유지하거나, 연결을 종료하는 것에 대한 오버헤드는 없으며, 데이터를 수신하든 받든 받지 않던 데이터가 수신자에게 계속 전송되어 신뢰성(unreliable)이 낮다.
사용 예시) Video conferencing, streaming, DNS, etc
UDP 헤더 구조는 아래와 같이 구성되어있다.
struct udpheader {
unsigned short int udph_srcport;
unsigned short int udph_destport;
unsigned short int udph_len;
unsigned short int udph_chksum;
}; /* total udp header length: 8 bytes (= 64 bits) */
1. udph_scrport (Source port, 16 bit): 출발지 포트 번호를 표시하는데 사용되며, 사용되지 않을 경우 0 값이 삽입된다.
2. udph_destport (Destination port, 16 bit): 목적지 포트 번호를 표시하는데 사용되며, 특정 서버에 연결할 수 있는 대상(목적지) 포트 번호를 저장
3. udph_len (length, 16 bit): UDP 헤더와 byte 단위인 Payload 데이터를 포함한 이 사용자의 데이터 그램(datagram)의 바이트 길이이다.
4. udph_chksum (checksum, 16 bit): 헤더와 데이터의 에러를 확인하기 위한 부분이며, TCP와 달리 UDP는 에러 복구를 수행하지 않으므로 간단하다. 계산된 checksum 이 0인 경우, 모든 checksum으로 전송되었음을 의미. 전송된 checksum 값이 모두 0이면, 송신기가 checksum을 생성하지 않았음을 의미
위에서 TCP 와 UDP 에 대해 설명하였다. TCP 와 UDP 를 비교해보았을 때 TCP가 UDP 보다 안전성도 높고 유용해보이는데 UDP를 아직까지도 사용하는 이유가 무엇일까?
두 프로토콜의 차이점을 통해 그 이유에 대해 알아보도록 하자.
TCP 와 UDP 의 차이점
1. 속도(Speed): TCP < UDP
2. 에러 탐지(Error checking):
TCP: 광범위한 에러 탐지와 데이터 확인
UDP: 체크썸(checksum)을 이용하여 에러 탐지
3. 데이터 재전송 (Retransmission of data)
TCP: 패킷 손실 시 재전송 O
UDP: 패킷 손실 시 재전송 X
4. 브로드캐스트
TCP: 브로드캐스트 지원 X ( 1대1 통신 )
UDP: 브로드캐스트 지원 O ( 다중 통신 가능 )
5. 데이터 순서 (data sequencing)
TCP: 전달 순서 존재 O
UDP: 전달 순서 존재 X
6. 전달 방식
TCP: Byte stream
UDP: Datagram
이와 같이, TCP 와 UDP 의 차이점에 대해 알아본 결과, 두 프로토콜 모두 특정 상황에 따라서 유용하게 사용된다는 것을 알 수 있었다.
참고 문헌
[1] TCP UDP https://www.tenouk.com/download/pdf/Module43.pdf