본문 바로가기
카테고리 없음

TCP와 UDP

by 원톄로 2023. 8. 10.

1. 전송 계층 프로토콜 TCP와 UDP

Transmission Control Protocol을 TCP라고 하고, User Datagram Protocol를 UDP라고 한다.

두 프로토콜 모두 송신 프로세스와 수신 프로세스 간의 연결 기능을 제공하는 전송계층(Transport Layer)에서 사용되는 프로토콜이다.

 

TCP는 여러 과정을 통해 신뢰성 보장한다. UDP는 비교적 단순한 과정을 거치며 신뢰성 보장을 하지 않는 대신에 빠르다는 장점이 있다. 

신뢰성이 요구되는 애플리케이션에서는 TCP를 사용하고, 간단한 데이터를 빠른 속도로 전송하는 애플리케이션에서는 UDP를 사용한다.

 

 

2. 헤더 구조

- TCP 헤더 구조

1. 송신측의 포트 번호 (Source Port, 16비트): 데이터를 보내는 애플리케이션의 포트 번호

2. 수신측의 포트 번호 (Destination Port, 16비트): 데이터를 받을 애플리케이션의 포트 번호

3. 순서 번호 (Sequence Number, 32비트): 송신자가 지정하는 순서 번호

4. 확인응답 번호 (Acknowledgment Number, 32비트): 수신 프로세스가 제대로 수신한 데이터의 수를 응답하기 위해 사용하며 다음에 수신을 기대하는 데이터의 순서 번호를 표시

5. 헤더 길이 (Data Offset, 4비트): TCP 헤더의 길이를 32비트 워드로 표시

6. 예약 필드 (Reserved, 6비트): 예약 필드. 현재는 사용하지 않음

7. 플래그 (Flags, 플래그별 각 1비트): URG(Urgent), ACK(Acknowledgment), PSH(Push), RST(Reset), SYN(Synchronize), FIN(Finish)과 같은 다양한 제어 신호를 나타내는 플래그 정보 포함

8. 윈도우 크기 (Window Size, 16비트): 수신측에서 수신할 수 있는 데이터의 크기

9. 체크섬 (Checksum, 16비트): 데이터 오류 검사에 필요한 정보

10. 긴급 포인터 (Urgent Pointer, 16비트): 긴급 데이터를 처리하기 위한 것으로, URG 플래그 비트가 지정된 경우에만 유효

11. 옵션 (Options, 가변 길이): 기타 정보를 위한 부분

 

- TCP 플래그

1. URG (Urgent): Urgent Pointer 필드가 유효한지를 나타낸다. 긴급 데이터를 전송하기 위해 사용한다.

2. ACK (Acknowledgment): Acknowledgment Number, 확인응답 번호 필드가 유효한지를 나타낸다. 수신한 데이터에 대해 확인응답을 전송한다는 것을 의미한다.

3. PSH (Push): 현재 세그먼트에 포함된 데이터를 상위 계층에 즉시 전달하도록 지시할 때 사용한다.

4. RST (Reset): 연결을 강제로 초기화하는 데 사용되는 플래그이다. 오류가 발생하거나 연결이 불가능한 상황에서 연결을 빠르게 종료하고 재시작하도록 설정할 수 있다.

5. SYN (Synchronize): 연결 설정 요구를 의미하는 플래그다.

6. FIN (Finish): 연결 종료 요청을 나타내는 플래그다.

 

- UDP 헤더 구조

1. 송신측의 포트 번호(Source Port, 16비트): 데이터를 보내는 애플리케이션의 포트 번호

2. 수신측의 포트 번호(Destination Port, 16비트): 데이터를 받을 애플리케이션의 포트 번호

3. 데이터 길이(Length, 16비트): UDP 헤더와 데이터의 총 길이

4. 체크섬(Checksum, 16비트): 데이터 오류 검사에 필요한 정보

 

3. 체크섬 필드에서의 차이점

TCP와 UDP 두 프로토콜 모두 체크섬 필드를 사용하여 오류를 감지하지만, TCP 체크섬은 필수적으로 수행하고 UDP는 선택적으로 수행한다는 차이가 있다.

계산 방법과 고려하는 요소에도 차이점이 존재하는데 UDP 체크섬은 헤더와 페이로드 데이터만 고려하여 계산하는 반면, TCP 체크섬은 가상 헤더를 추가하여 더 확장된 데이터 오류 감지를 제공하는 차이점이 있다.

 

4. TCP 연결방식

- 연결 설정(3-way handshake)

1. 송신자가 수신자에게 SYN 플래그가 설정된 세그먼트를 전송하여 연결 요청. 이 과정에서 송신자의 초기 시퀀스 번호를 전달.

2. 수신자가 연결 설정을 수락하며 송신자의 초기 시퀀스 번호를 확인했음을 나타내기 위해 송신자에게 SYN 플래그와 ACK 플래그가 설정된 세그먼트를 전송. 수신자의 초기 시퀀스 번호도 함께 전달.

3. 송신자가 수신자의 SYN과 ACK 플래그가 설정된 세그먼트를 받으면, ACK 플래그가 설정된 세그먼트를 수신자에게 전송하여 연결이 확립되었음을 알림.

 

- 연결 해제(4-way handshake)

1. 연결 해제를 원하는 송신자가 수신자에게 FIN 플래그가 설정된 세그먼트를 전송.

2. 수신자는 송신자에게 ACK 플래그가 설정된 세그먼트를 전송하여, FIN 플래그가 있는 세그먼트를 받았음을 알림. 그리고 더 이상 전송할 데이터가 없을 때까지 기다린 후에 종료를 진행.

3. 수신자가 모든 데이터 전송이 끝난 시점에서 연결 종료에 대한 동의를 보내기 위해, 송신자에게 FIN 플래그가 설정된 세그먼트를 전송.

4. 송신자는 수신자에게 ACK 플래그가 설정된 세그먼트를 전송하여, 수신자의 FIN 플래그가 있는 세그먼트를 받았음을 확인.

 

- 재전송

TCP 데이터, 세그먼트는 순서 번호와 함께 전송된다. 수신자는 이 번호를 근거로 데이터의 순서를 올바르게 정렬할 수 있다. 순서 번호가 동일한 데이터가 도착하면 중복으로 판단하여 해당 데이터를 버리고, 중간의 순서 번호가 빠지면 데이터를 잃어버렸다고 판단할 수 있다. 데이터 변형과 데이터 분실 오류가 발생하면 수신 프로세스로부터 회신을 받을 수 없으므로 송신 프로세스의 타임아웃(Timeout) 기능에 의해 해당 세그먼트를 재전송한다.

 

5. UDP 연결 방식

1. UDP는 송신자와 수신자가 사전에 연결을 설정하지 않고 데이터를 전송한다. 연결 설정 및 종료 과정이 없다.

2. 데이터 손실이 발생할 경우 재전송하지 않는다. 전송된 데이터의 도착 여부를 확인하지 않는다.

3. 송신자가 순서대로 전송하지만, 수신자는 어떤 순서로 도착하는지 확인하지 않고, 또 재정렬하지 않는다.

4. UDP 헤더는 TCP헤더에 비해 크기가 작아 오버헤드가 적다.

그렇기 때문에 TCP에 비해 낮은 신뢰성을 가진다. 대신에 낮은 대기 시간, 빠른 데이터 전달을 가능하게 하고 전력 소비를 최소화한다.

 

UDP는 지연 최소화, 빠른 전송 속도, 오버헤드 최소화를 중시하는 애플리케이션에 적합하고, 신뢰성이 중요한 통신에서는 TCP를 사용하는 것이 더 효과적이다.