[네트워크] TCP & UDP
TCP 와 UDP 는 TCP/IP 의 데이터의 전달을 담당하는 전송 계층에서 사용되는 프로토콜입니다.
TCP 와 UDP 는 모두 포트 번호를 이용하여 주소를 지정한다는 점과, 데이터 오류검사를 위한 체크섬이 존재한다는 공통점이 있지만 이보다 훨씬 많은 차이점을 가지고 있습니다.
TCP (Transmission Control Protocol)
TCP 는 클라이언트와 서버가 1:1 로 연결된 상태에서 데이터를 주고받는 연결 지향형 (Connection-Oriented) 프로토콜입니다.
TCP 는 클라이언트와 서버의 연결을 위해 포트를 확인하고 이를 연결을 설정하기 위해 3번의 응답을 주고받는 과정인 3-way handshake 이라는 방식을 이용하고, 연결을 해제하기 위해서는 4-way handshake 라는 방식을 이용합니다.
그 과정은 다음과 같습니다.
3-way handshake
- 클라이언트는 서버로 연결 요청을 위해서 SYN 패킷을 보내고 SYN_SENT 상태로 변경됩니다.
- 서버는 해당 포트 LISTEN 상태에서 클라이언트에게 요청을 수락했다는 ACK 와 SYN flag 가 설정된 패킷을 전송하고 SYN_RCV 상태로 변경됩니다.
- 클라이언트는 SYN 과 ACK 를 받고 서버에 응답을 잘 받았다는 ACK 를 보냅니다. 이후 ESTABLISHED 상태로 변경됩니다.
- 서버도 ACK 를 받고 ESTABLISHED 상태가 됩니다. 이후부터는 연결이 이루어진 것이고 데이터가 오가게 됩니다.
4-way handshake
- 클라이언트는 연결을 종료하겠다는 FIN flag 를 전송하고 FIN_WAIT1 상태로 대기합니다.
- 서버는 요청을 받았다는 ACK 를 전달하고 해당 포트의 어플리케이션에게 close() 요청을 보냅니다. 이후 CLOSE_WAIT 상태로 변경됩니다.
- 서버가 보낸 ACK 를 받은 클라이언트는 FIN_WAIT2 상태로 변경됩니다.
- close() 요청을 받은 서버 어플리케이션은 종료 프로세스를 진행하고, FIN 을 클라이언트에게 보낸 후 LAST_ACK 상태로 변경됩니다.
- FIN 을 받은 클라이언트는 ACK 를 서버에 다시 전송하고, TIME_WAIT 상태로 변경됩니다.
- 클라이언트는 TIME_WAIT 에서 분실되었을지 모르는 세그먼트를 위해 일정시간을 기다린 후 CLOSED 가 되고, ACK 를 받은 서버도 포트를 CLOSED 로 닫습니다.
TCP 상태
상태 | 내용 |
LISTEN | 접속 요청을 기다리는 상태 |
SYN-SENT | 클라이언트가 서버로 연결을 요청한 상태 |
SYN-RECEIVED | 서버가 클라이언트로부터 연결 요청을 받아 클라이언트에게 응답을 보냈지만, 아직 클라이언트에게 확인 메세지는 받지 못한 상태 |
ESTABLISHED | 3-way handshake 가 완료된 후 서로 연결된 상태 |
FIN-WAIT 1,2 CLOSE-WAIT |
연결을 종료하기 위해 서버와 클라이언트가 서로 연결 종료를 요청하고 이를 대기하는 상태 |
TIME-WAIT | 연결은 종료되었지만 분실되었을지 모르는 느린 세그먼트를 위해 당분간 소켓을 열어두고 있는 상태 |
CLOSING | 확인 메세지가 전송 도중 분실된 상태 (흔치 않음) |
CLOSED | 종료 상태 |
이러한 과정을 거쳐 고정된 선로를 통해 데이터가 전달되기 때문에 TCP 는 신뢰성 있는 데이터를 전달할 수 있습니다.
하지만 연결을 생성하고 해제하는 과정에서 시간이 소요되기 때문에 UDP 보다 속도가 느리다는 단점을 가지고 있습니다.
TCP 는 신뢰성 있는 데이터를 전송하기 위해 패킷이 정상적으로 전달되었을때 ACK 값을 전송합니다.
ACK 는 수신측에서 송신측으로 보내는 긍정 응답입니다. ACK 번호를 사용해 패킷이 제대로 도착했는지 확인할 수 있습니다.
정상적인 상황에서는 ACK 값이 연속적으로 전송되어야 하지만, ACK 값이 제대로 도착하지 않으면 경우에 따라 패킷을 재전송할지 말지 결정합니다.
Dupack-based Retransmission
- ACK 값이 중복으로 도착할 경우 패킷 이상을 감지하고 재전송을 요구
Timeout-based Retransmission
- ACK 값이 일정시간동안 도착하지 않을 경우 재전송을 요구
TCP 는 이 외에도 신뢰성있는 데이터의 전달을 위해 흐름제어와 혼잡제어를 수행합니다.
흐름제어 (Flow Control) 는 송신하는 곳에서 감당이 되지 않을 정도로 많은 데이터를 보내 수신하는 곳에서 문제가 발생하는 것을 방지합니다. 데이터 처리 속도를 조절하거나 수신자가 Window Size 값을 이용해 수신량을 조정할 수 있습니다.
혼잡제어 (Congestion Control) 는 네트워크 내의 패킷 수가 넘치지 않도록 방지합니다. 만약 정보의 소통량이 과다하다면 패킷을 조금만 전송해서 혼잡 붕괴 현상을 방지합니다.
이처럼 TCP 는 신뢰성 있는 데이터를 전송하기 때문에 파일 전송 등의 서비스에서 주로 이용됩니다.
위에서 설명한 TCP 의 특징을 정리해보겠습니다.
TCP 특징
- 연결지향형 서비스이기 때문에 연결이 성공해야 통신이 가능
- 연결 설정 (3-way handshake), 연결 해제 (4-way handshake)
- 바이트 스트림 서비스로 데이터 경계를 구분하지 않음
- 데이터 순서 보장 위해 각 바이트마다 번호 부여
- 신뢰성 있는 데이터 전송
- 시퀀스 넘버, ACK 넘버
- 흐름제어, 혼잡제어
- 전이중 방식 (Full-Duplex) : 전송이 양방향으로 동시에 일어날 수 있음
- 점대점 서비스 (Point to Point) : 각 연결이 정확히 2개의 종단점을 가지고 있음
- UDP 에 비해서 속도가 느림
TCP 헤더 정보
필드 | 내용 | 크기 (bit) |
송수신자의 Port Number | TCP 로 연결되는 가상 회선 양단의 송수신 프로세스에 할당되는 포트 주소 | 16 |
Sequence Number | 송신자가 지정하는 순서 번호, 전송되는 바이트 수를 기준으로 증가 SYN = 1 : 초기 시퀀스 번호, ACK 번호는 이에 1 을 더한 값 SYN = 0 : 현재 세션 해당 세그먼트 데이터의 최초 바이트값의 누적 시퀀스 번호 |
32 |
ACK Number | 수신 프로세스가 제대로 수신했는지, 해당 바이트 수를 응답하기 위해 사용 | 32 |
Data Offset | TCP 세그먼트의 시작 위치를 기준으로 데이터의 시작 위치를 표현 (TCP 헤더 크기) | 4 |
예약 필드 (Reserved) | 사용하지 않지만 나중을 위한 예약 필드이며 0으로 채워져야함 | 6 |
제어 비트 (Flag Bit) | SYN, ACK, FIN 등의 제어번호 | 6 |
Window Size | 수신 윈도우의 버퍼 크기를 지정할 때 사용, 0 이면 프로세스 전송 중지 | 16 |
Checksum | TCP 세그먼트에 포함되는 프로토콜 헤더와 데이터에 대한 오류 검출 용도 | 16 |
Urgent Pointer | 긴급 데이터를 처리하기 위함, URG 플래그 비트가 지정된 경우에만 유효 | 16 |
TCP 제어 비트 (Flag Bit) 정보
종류 | 내용 |
ACK | 응답 번호 필드가 유효한지 설정할 때 사용하며 상대방으로부터 패킷을 받았다는 걸 알려주는 패킷 클라이언트가 보낸 최초의 SYN 패킷 이후 전송되는 모든 패킷은 이 플래그가 설정되어야 함 |
SYN | 연결 설정 요구, 동기화 시퀀스 번호 양쪽이 보낸 최초의 패킷에만 이 플래그가 설정되어 있어야 함 가장 먼저 보내는 패킷으로 시퀀스 번호를 임의적으로 설정하여 세션을 연결하는데 사용되며 초기에 시퀀스 번호를 보내게 됨 |
PSH | 수신 어플리케이션에 버퍼링된 데이터를 상위 계층에 즉시 전달할 때 사용 |
RST | 연결의 리셋이나 유효하지 않은 세그먼트에 대한 응답용으로 사용 |
URG | 긴급 위치를 필드가 유효한지 설정 (긴급한 데이터는 다른 데이터에 비해 우선순위가 높음) |
FIN | 세션 연결을 종료시킬 때 사용되며 더 이상 전송할 데이터가 없을 때 연결 종료 의사 표시 |
UDP
UDP 는 데이터를 주고받을 때 연결 절차를 거치지 않고, 발신자가 일방적으로 데이터를 발신하는 비연결 지향적 프로토콜 입니다.
UDP 는 연결 과정이 없기 때문에 TCP 보다 속도는 빠르지만, 데이터의 신뢰성은 떨어지는 편입니다.
예를 들어 발신자가 데이터 패킷을 순차적으로 전송하더라도 패킷들은 서로 다른 통신 선로를 통해 전달될 수 있고, 만약 먼저 보낸 패킷이 느린 선로를 통해 전송되는 경우 나중에 보낸 패킷보다 느리게 도착할 수 있습니다.
최악의 경우에는 잘못된 선로로 전송되어 패킷이 유실되는 경우도 있습니다.
TCP 는 경우에 따라 패킷을 재전송하기도 하지만, UDP 는 패킷이 유실된다 하더라도 패킷을 재전송하지 않습니다.
하지만 UDP 의 데이터 처리 속도는 TCP 보다 빠르기 때문에 실시간 스트리밍과 온라인게임 등에 적합합니다. 이미지가 한 두장 빠지더라도 앞뒤로 보정하여 문제를 커버할 수 있습니다.
UDP 특징
- 비연결형 서비스로 연결 없이 통신이 가능하며 데이터그램 방식을 제공함
- 데이터그램 서비스로 데이터 경계를 구분함
- 데이터 송수신 시 보내거나 받는다는 신호절차를 가지지 않음
- TCP 보다 빠르지만, 신뢰성이 떨어지는 데이터 전송
- 데이터 재전송과 데이터 순서 유지위한 별도의 작업 수행하지 않음
- 패킷 관리 필요
- 패킷 오버헤드가 적어 네트워크 부하 감소
UDP 헤더 정보
UDP 는 수신측이 데이터를 제대로 받았는지 그렇지 않았는지 검증하는 절차가 없기 때문에 TCP 보다 훨씬 간결한 헤더를 가집니다.
필드 | 내용 | 크기 |
송신자 포트번호 (Source Port) | 데이터를 보내는 어플리케이션의 포트 번호 | 16 |
수신자 포트번호 (Destination Port) | 데이터를 받을 어플리케이션의 포트 번호 | 16 |
데이터의 길이 (Length) | UDP 헤더와 데이터의 총 길이 | 16 |
Checksum | 데이터 오류 검사에 사용 | 16 |
TCP & UDP 공통점과 차이점
공통점
- 포트번호를 이용하여 주소를 지정함
- 데이터 오류 검사를 위한 체크섬이 존재함
차이점
TCP | UDP | |
연결 방식 | 연결 지향형 프로토콜 - 바이트 스트림을 통한 연결 | 비연결 지향형 프로토콜 - 메세지 스트림을 통한 연결 |
패킷 교환 방식 | 가상 회선 방식 | 데이터그램 방식 |
패킷 | 세그먼트 | 데이터그램 |
수신 여부 확인 | 수신 여부 확인함 | 수신 여부 확인하지 않음 |
신뢰성 | 순서 보장, 혼잡제어와 흐름제어 -> 신뢰성 있는 데이터 |
순서 보장되지 않음 -> 신뢰성 떨어지는 데이터 |
속도 | 느리다 | 빠르다 |
통신 방식 | 1:1 통신 | 1:1, 1:N, N:N 통신 |
사용 예시 | HTTP, Email,파일 전송 등 | DNS, 실시간 스트리밍 서비스 등 |
참고 링크
https://coding-factory.tistory.com/614
https://mangkyu.tistory.com/15
https://velog.io/@hidaehyunlee/TCP-%EC%99%80-UDP-%EC%9D%98-%EC%B0%A8%EC%9D%B4
'Studies > Computer Science' 카테고리의 다른 글
[네트워크] 쿠키와 세션 (0) | 2022.07.13 |
---|---|
[네트워크] JSON & XML (0) | 2022.07.05 |
[네트워크] RESTful, REST API (0) | 2022.06.03 |
[네트워크] OSI 7계층 (0) | 2022.05.29 |
[운영체제] 프로세스와 스레드 (Process & Thread) (0) | 2022.05.26 |