본문 바로가기
computer science/네트워크

[네트워크] TCP와UDP

by 박연호의 개발 블로그 2020. 3. 26.

이번 시간에는 TCP와 UDP에 대해서 공부해보겠습니다.

 

우리가 어떤 서버로부터 이미지 파일을 내려받는다면 해당 이미지 파일은 네트워크 상에서 한꺼번에 오는게 아니라 이미지 파일이 여러개의 조각으로 나누어져 패킷이라는 단위로 오게 됩니다. 이렇게 "어디"에서 "어디"에 대한 정보 즉, 목적지와 도착지의 정보는 3계층의 ip 프로토콜이 담당합니다. ip프로토콜은 그저 패킷을 전달하는 역할만 합니다. 패킷이 도중에 손실되었는지, 순서대로 도착했는지에 대해서는 관심이 없습니다. 하지만 TCP와 UDP는 ip와 달리 패킷이 "어떻게" 도착하는지에 대해 관리를 합니다.


TCP

TCP(Transmission Control Protocol)은 연결지향 서비스 입니다. 통신(데이터 교환)이 시작되기 전에 송수신측 간에 논리적인 연결이 설정되어 있으며 실제 데이터 전달은 패킷교환망을 통해 이루어 지지만 사용자 입장에서 통신의 상대쪽과 하나의 전용선이 존재하는 것 처럼 보이는데 이런 방식을 가상회선 이라고 합니다.

 

두 호스트간에 가상회선을 통해 패킷을 주고 받으며 송신측은 패킷을 무조건 보내는 것이 아니라 수신측이 패킷을 제대로 받았는지 확인한 후, 다음 패킷을 전송합니다. 또한 패킷 손실, 중복, 순서바뀜 등이 없도록 보장할 수 있습니다. 많은 기능을 하는 만큼 복잡한 프로토콜 이며 TCP Header의 각각의 field가 TCP의 안전한 전송을 담당하고 있습니다.

 

- 신뢰성 

패킷 손실, 중복, 순서바뀜 등이 없도록 보장하며 TCP 하위계층인 IP 계층의 신뢰성 없는 서비스에 대해 다방면으로 신뢰성을 제공합니다.

 

- 연결 지향적(connection - oriented)

같은 전송계층의 UDP가 비연결성인 것과는 달리, TCP는 연결지향적입니다. 두 호스트가 서로 연결상태를 유지한 상태로 데이터 교환이 가능한 서비스로 데이터가 지속적으로 연속적인 흐름에 적합합니다. 또한 연결된 상태를 유지하기 위해선 실제 데이터를 전송하기 전 논리적 연결(3 way handshake)을 하고 데이터 전송이 끝나면 연결을 해제(4 way handshake)합니다.

 

- 전이중 전송방식/양방향석(full - duplex)

 두 호스트의 프로세스가 서로 동시에 패킷을 전달할 수 있으며 각각 "송수신 버퍼"와 "데이터 흐름용 순서번호"를 유지합니다.

 

- 멀티캐스트 불가능

1:1 전송 방식이며 단일 송신자와 단일 수신자 간에 단일 경로 연결이 설정됩니다. 

 

- 세그먼트화 처리

데이터를 패키징 처리합니다. byte들을 모아서 세그먼트화 하고 이에 TCP header에 붙여 이들을 순서제어 합니다. 두 호스트의 TCP 모듈간에 서로 교환되는 데이터 단위를 TCP 세그먼트 라고 합니다.

 ※ TCP 세그먼트(한번에 보낼 수 있는) 최대 크기 : MMS

 

- 흐름 제어

슬라이딩 윈도우 : 송신 및 수신 속도를 일치시키는 것으로 주로 TCP header의 순서번호, 확인응답번호, 수신윈도우 크기로 흐름제어를 합니다.

 

- 혼잡 제어

네트워크가 혼잡하다가 판단될 때 송신률을 줄입니다. TCP는 혼잡 제어를 위해 수신 윈도우(rwnd) 및 혼자 윈도우(cwnd) 2개의 변수를 관리하며 이 중 최소가 되는 크기를 윈도우 크기로 설정합니다.

 

- 비 실시간적에 사용

TCP는 데이터의 정확한 전달을 보장하지만 전달에 따른 지연에 취약하므로 스트리밍 같은 실시간 서비스에는 통산 UDP를 사용합니다.


TCP Header

전송계층을 건너온 세그먼트는 TCP Header가 붙어 전송되며 수신측에서는 TCP Header의 정보를 보고 패킷의 무결성을 보장합니다.

 

TCP Header는 여러개의 필드로 구성되며 총 20 byte 헤더를 사용하며 각 필드의 정보를 0,1로 표현합니다. 하지만 20 bytes라는 것은 아무 옵션도 없는 기본적인 헤더일 때의 용량이고, TCP의 여러가지 옵션들을 사용하면 최대 40 bytes가 더해진 60 bytes까지도 사용할 수 있습니다.

- Source Port, Destination Port

각각 2byte의 크기를 가지며 패킷을 송/수신하는 시스템의 포트를 의미합니다.

 

- Sequence Number

시퀀스 번호는 8byte를 가지며 4294967296 까지의 수를 가질 수 있습니다. 패킷을 보낼때 각 패킷마다 고유번호를 지정해주는데 이 고유번호가 Sequence Number가 됩니다. 각각의 패킷은 고유 번호가 주어지기 때문에 수신측에서 순서없이 패킷을 받아도 이 번호를 보고 순서대로 조합할 수 있습니다. 또한 어떤 패킷이 유실됐는지 판단하여 재전송 요청을 할 수 있습니다. 

 

- Acknowledgment Number

승인 번호 역시 8byte를 가지며 4294967296 까지의 수를 가질 수 있습니다. 시퀀스 번호는 ACK bit가 1일때만 유효하며 송신측이 패킷에 숫자를 매겨 보내는 것이라면 승인 번호는 수신측이 다음번에 받으려고 하는 번호를 의미합니다. 쉽게 설명하면 "내가 보낸 100번째 데이터까지 잘 받았어, 내가 101을 보낼게 그러면 너는 101부터 데이터를 보내면 돼" 입니다. 또한 승인번호는 데이터가 없는 연결 설정/해제 과정에서 1씩 증가하게 됩니다.

 

- Data Offset(Header Length)

데이터 오프셋은 4bit의 크기를 가지며, 전체 세그먼트 중에서 헤더가 아닌 데이터의 시작되는 위치가 어디부터인지를 표시합니다. 이 오프셋을 표기할 때는 32bit 워드 단위를 사용하며, 32 bit 체계에서의 1word = 4bytes를 의미합니다. 즉, 이 필드의 값에 4를 곱하면 세그먼트에서 헤더를 제외한 실제 데이터의 시작위치를 알 수 있습니다. 이 필드에 할당된 4bits를 표현할 수 있는 값의 범위는 0000 ~ 1111, 즉 0 ~ 15word이므로 기본적으로 0 ~ 60bytes의 오프셋까지 표현할 수 있습니다. 하지만 옵션 필드를 제외한 나머지 필드는 필수로 존재해야 하기 때문에 최소 값은 20bytes, 즉 5 word로 고정되어 있습니다.

 

- Reserved

미래에 사용될 수 있도록 예약된 필드며, 모두 0으로 채워져 있습니다.

 

-Flag(NS ~ FIN)

플래그는 모두 9bit를 가지며 각각의 비트자리는 다른 의미를 가집니다. 기존에는 6개의 bit만 사용했지만 혼잡 제어의 기능을 위 Reserved 필드를 사용하여 NS, CWR, ECE가 추가되었습니다.

 

1. URG

Urgent Pointer 필드에 값이 채워져있음을 알리는 플로그로 Urgent Pointer가 가리키는 긴급한 데이터는 높게 처리되어 먼저 처리됩니다.

 

2. ACK

Acknowledgment Number 필드에 값이 채워져 있음을 알리는 플로그로 이 플래그가 0이면 Acknowledgment Number는 무시됩니다.

 

3. PSH

수신 측에게 이 데이터를 최대한 빠르게 응용프로그램에게 전달해달라는 플로그로 이 플래그가 0이라면 수신 측은 자신의 버퍼가 다 채워질 때까지 가디라고 1이 되면 이 세그먼트 이후에 더 이상 연결된 세그먼트가 없음을 의미합니다.

 

4. RST

이미 연결이 확립되어 ESTABLISHED 상태인 상대방에게 연결을 강제로 리셋해달라는 요청의 의미입니다.

 

5. SYN

Synchroniz 플래그로, 상대방과 연결을 생성할 때 시퀀스 번호의 동기화를 맞추기 위한 플래그 입니다.

 

6. FIN

상대방과 연결을 종료하고 싶다는 요청을 의미합니다.

 

기존의 Reserved 필드를 사용하여 새롭게 추가된 NS, CWR, ECE 플래그는 네트워크의 명시적 혼잡통보(Explicit Congestion Notification, ECN))를 위한 플래그 입니다. ECN을 사용하지 않던 기존의 네트워크 혼잡 상황 인지 방법은 타임아웃을 이용한 방법이었습니다. 그러나 처리 속도에 민감한 어플리케이션에서는 이런 대기 시간 조차 아깝기 때문에 송신자와 수신자에게 네트워크의 혼잡 상황을 명시적으로 알라기 위한 특별한 매커니즘이 필요한데 이것이 ECN입니다. 이때 CWR, ECE, CE 플래그를 사용하여 상대방에게 혼잡 상태를 알려줄 수 있는데 이 중 CWR, ECE는 TCP Header에 존재하고 ECT, CE는 IP Header에 존재하게 됩니다.

 

1. NS

ECN에서 사용하는 CWR, ECE 필드가 실수나 악의적으로 은폐되는 경우를 방어하기 위해 RFC 3540에 추가된 필드입니다.

 

2. ECE

ECN Echo 플래그로, 해당 필드가 1이면서 SYN 플래그가 1일 때는 ECN을 사용한다고 상대방에게 알리는 의미가 됩니다. SYN 플래그가 0이라면 네트워크가 혼잡하니 세그먼트 윈도우의 크기를 줄여달라는 요청의 의미입니다.

 

3. CWR

이미 ECE 플래그를 받아서 전송하는 세그먼트 윈도우의 크기를 줄였다는 의미입니다.

 

- Window Size

윈도우 사이즈는 8byte의 크기( 65535만큼의 수를 표현)를 가지며 단위는 바이트 입니다. 수신 프로세스가 수신할 수 있는 바이트의 수를 표시합니다. 수신자의 버퍼 용량 초과 등으로 인해 데이터를 더이상 수신할 수 없으면 window size 필드의 값을 0으로 지정하며 이 경우에는 송신 프로세스는 데이터를 전송하면 안됩니다.

 

-Checksum

체크섬은 데이터를 송신하는 중에 발생할 수 있는 오류를 검출하기 위한 값입니다. 여기서 오류를 검출하는 방법은 IP 프로토콜에서 사용하는 오류검출 알고리즘을 사용합니다.

 

- Urgent Pointer

긴금 데이터를 처리하기 위한 것으로 URG 플래스 bit가 지정된 경우에만 유효합니다.

 

-Options

옵션 필드는 TCP의 기능을 확장할 때 사용하는 필드들이며, 이 필드는 크기가 고정된 것이 아니라 가변적입니다. 그래서 수신 측의 어디까지가 Header이고 어디서부터 데이터인 지 알 기 위해 Data Offset을 사용하는 것입니다. 


UDP

UDP(User Datagram Protocol)은 비연결지향 서비스 입니다. TCP의 경우 통신이 시작되기 전에 송수신측 간에 논리적인 연결을 하지만 UDP의 경우 논리적인 연결을 필요로 하지 않습니다. 송신측에서 단지 패킷을 보내기만 하며 패킷의 유실, 오류제어, 순서등은 전혀 신경쓰지 않습니다. 신뢰성이 낮은 프로토콜 이지만 TCP 처럼 가상회선을 굳이 확립할 필요가 없고 복잡하지 않으며 유연하기 때문에 효율적 응용의 데이터 전송에 사용됩니다.

 

- 비연결성이고 신뢰성이 없으면 순서화되지 않은 datagram 서비스 제공

(확인 응답 없음) 메세지가 제대로 도착했는지 확인하지 않습니다

(순서제어 없음) 수신된 메시지의 순서를 맞추지 않습니다

(오류제어 거의 없음) check sum을 제외한 특별한 오류 검출 및 제어가 없음

UDP를 사용하는 프로그램 쪽에서 오류제어 기능을 스스로 갖추어야 함

 

- 실시간 응용 및 멀티캐스팅 가능

빠른 요청과 응답이 필요한 실시간 응용에 적합하며 여러 다수 지점에 전송 가능합니다(1 : N)

 

- 헤더가 단순함

헤더는 고정크기의 8byte만 사용하기 때문에 TCP 처럼 헤더 처리에 많은 시간과 노력을 필요로 하지 않습니다. 


UDP Header

- Source Port, Destination Port

각각 2byte의 크기를 가지며 패킷을 송/수신하는 시스템의 포트를 의미합니다.

 

- Length

2byte의 크기를 가지며, UDP header + data의 크기를 byte로 나타냅니다.

 

- Check sum

데이터와 헤더의 에러검사에 사용되며 IPv4의 경우 옵션이지만 IPv6는 필수 입니다.