Reliable service과 Best-Effort service에 대해 알아봅시다. TCP 프로토콜은 전송 계층에서 연결을 유지하며 session을 트래킹합니다. 반면에 UDP 프로토콜은 신뢰성을 덜 신경씁니다. 연결을 유지할 필요도 없습니다. 오직 source port와 destination port만 있다면 바로 데이터그램을 전송할 수 있습니다.
이전 블로그까지 TCP 프로토콜을 간략하게 설명하고 넘어갔었습니다. TCP 프로토콜은 인터넷 계층에서 패킷 혹은 데이터그램을 주고받습니다. 이번 글을 통해 TCP의 핵심 개념인 핸드쉐이크와 Congestion control, Flow control에 대해 더 자세히 알아보겠습니다.
먼저, TCP는 Transimission Control Protocol(전송 제어 프로토콜)로 두 호스트를 연결하고 데이터 스트림을 연결하는 전송 프로토콜입니다. TCP의 특징은 대표적으로 아래와 같습니다.
- 신뢰할 수 있고 정확한 데이터를 전송한다.
- 연결형 통신을 사용하는 프로토콜이다.
- 데이터를 패킷 단위로 분할하여 전송한다.
그럼 TCP가 데이터를 전송하기 위해 필요한 handshake 과정에 대해 더 자세히 알아봅시다.
3-way-handshake는 TCP의 연결을 초기화하기 위한 단계입니다. 신뢰성있는 데이터 전송을 보장하기 위해 3번의 패킷 전송을 통해 상대방 컴퓨터와의 세션 연결을 초기화하는 과정을 의미합니다.
3 way handshake를 쉽게 이해하기 위해, 실생활의 예시를 들어보면 '길 물어보기'와 비슷합니다. 지나가는 사람에게 '실례합니다. 혹시 잠시 길을 여쭈어도 될까요?'라고 인사를 건네고, 상대가 '아, 네. 어디 가시는데요?'라고 응답이 오면 '00를 찾고있는데 알고 계시나요?'라고 다시 물어보면 이제 우린 상대에게 '00를 찾는다'는 정보를 전달할 수 있습니다.
즉, 이 과정은 acknowledges request와 send own request, acknowledge host라는 세 번의 과정안에서 이루어집니다. 이를 그림으로 나타내면 아래와 같습니다.
과정을 컴퓨터 네트워크 용어로 다시 짚어보면 아래와 같습니다.
- SYN : Client A로부터 Server B에 SYN을 보내며 연결을 요청합니다. B는 SYN을 받고, A에게 요청을 받았다는 신호를 보내야 합니다. 이때, SYN bit가 1로 활성화된 세그먼트가 보내집니다.
- SYN + ACK : B는 A에게 전송에 대한 허가를 받기 위해 연결 요청의 SYN을 보냅니다. 또한 이전 요청을 받았다는 신호인 ACK도 함께 보냅니다. 이 과정에서 SYN bit == 1, ACK == 1인 세그먼트가 보내집니다.
- ACK : A는 B에게 연결 요청을 확인했고 허가한다는 신호인 ACK를 보냅니다. ACK bit == 1인 세그먼트가 B로 보내집니다.
4-way-handshake는 TCP의 연결을 종료하기 위한 단계입니다. 이 과정에선 FIN과 ACK를 사용합니다.
- FIN : Client A로부터 Server B에 FIN을 보내며 연결 종료를 요청합니다. B는 FIN을 받고, A에게 요청을 받았다는 신호를 보내야 합니다. 이때, FIN bit가 1로 활성화된 세그먼트가 보내집니다.
- ACK : B는 A에게 연결 종료에 대한 응답인 ACK를 보냅니다. 이 과정에서 ACK == 1인 세그먼트가 보내집니다.
- FIN : 또한 B도 A에게 연결 종료 요청을 위해 FIN을 보냅니다. FIN == 1인 세그먼트가 보내집니다.
- ACK : A는 B에게 연결 종료에 대한 응답인 ACK를 보냅니다. ACK bit == 1인 세그먼트가 B로 보내집니다.
segment에 대한 중복된 3개의 ACK 신호를 받았을 때, segment를 다시 전송하는 것을 말합니다. 발생하는 원인은, 재전송 타이머값이 종종 길어지며 손실된 패킷의 재전송 전에 지연시간이 커지게 되기 때문입니다. 이런 상황이 발생했음을 감지하고 해결하고자 중복된 ACKs를 통해 손실된 세그먼트를 검출합니다.
TCP 의 congestion control은 sender 가 receiver 에게 보낼 데이터 양을 제한함으로써 이루어집니다.
sender가 패킷을 전송할 때, 패킷 로스가 일어나기 전까지 rate를 점진적으로 증가시킵니다. 패킷 로스는 특정한 라우터가 보낼 수 있는 rate 보다 datastream 전송이 빠를 때 발생하며, TCP는 이런 패킷 로스를 congestion으로 생각합니다. 따라서, 패킷 로스의 결과로 rate가 느려집니다.
TCP 프로토콜은 데이터 교환을 위해 Flow Control(흐름 제어)를 사용합니다. 만약 Receiver의 버퍼가 꽉 찼다면, Not Ready 상태가되어 Sender의 전송이 멈춥니다. 시간이 지나고 Receiver의 세그먼트 프로세스가 마무리 되었다면 Buffer가 ready 상태가 되어 Sender의 데이터 전송이 재개됩니다. 따라서, 네트워크나 클라이언트에 이상이 생긴다면 self-throttle을 관리합니다.
이전까지, UDP가 User Datagram Protocol의 약자이며 전송 계층에서 사용되는 프로토콜임을 배웠습니다. 또한 TCP와 다르게 sequencing과 관련한 기능을 제공하지 않습니다. 짧게 UDP의 특징을 복습하고 넘어가면 아래와 같습니다.
- 비연결형으로 신뢰성 없는 전송 프로토콜이다.
- 데이터를 데이터그램 단위로 쪼개며 전송하는 전송 계층에 속한다.
- 체크섬을 통해 수신한 패킷의 오류 여부 정도만을 알 수 있다.
- 연결과 신뢰성 확인등의 기능이 없기 때문에 TCP에 비해 적은 오버헤드로 전송이 가능하다.
- 일정한 전송 속도 제한이 있거나 데이터 손실을 허용하는 애플리케이션에 적합하다.
따라서, 빠른 전송이 필요한 Video application들이나 VoiceOver IP(음성 인터넷 프로토콜)가 UDP를 사용합니다.
위 이미지는 UDP header를 나타난 그림입니다. 데이터 세그먼트에 단순히 몇 가지만 더해집니다. 바로 Source port와 Destination port, UDP Length, UDP checksum입니다. 이때, 대표적인 Destination Port인 DNS의 경우 53번 포트로 연결합니다.
위 헤더 이미지에서 UDP Checksum을 확인할 수 있었습니다. 4 계층의 Checksum은 수학적으로 segment가 트래픽에서 오류가 발생했는지를 확인할 수 있습니다. 2 계층에서도 동일하게 사용할 수 있는 방법으로 하나의 전체 패킷에서 사라진 비트가 있는지 확인하는 방식입니다.
체크섬은 송신할 세그먼트를 16비트 단위로 나누고, 모두 더한 다음 1의 보수를 취해서 만들어 집니다.
이제 이 체크섬을 세그먼트와 같이 전송 합니다.수신자는 수신된 세그먼트에 대해 동일한 방식으로 체크섬을 만들고 헤더의 체크섬과 일치 하는지 비교함으로써신된 세그먼트의 오류를 검출할 수 있습니다.
마지막으로 TCP와 UDP를 비교했을 때, UDP의 장단점에 대해 정리해보겠습니다.
UDP의 장단점
- 장점
- 비연결형 서비스이므로 TCP에 비해 전송 속도가 빠르며 네트워크 오버헤드가 적습니다.
- 1:1, 1:N, N:N 통신이 가능합니다.
- 단점
- 데이터의 신뢰성을 보장할 수 없습니다.
전송후 대기 프로토콜은 패킷을 전송하고 그 패킷에 대한 수신 확인 응답을 받고나서,다음 패킷을 전송하는 방식 입니다. 이러한 방식은 네트워크 링크 이용률이 낮아 속도가 느리다는 단점이 있습니다.
파이프라이닝 프로토콜은 전송한 패킷에 대한 수신 확인 응답을 받지 않고도, 여러 개의 패킷을 연속으로 전송하여 링크 이용률과 전송 속도를 높이는 프로토콜 입니다.
[ 참고 자료 ]
TCP/IP 전송 계층(트랜스포트 계층)과 포트(Port) 번호 [변계사 Sam의 테크 스타트업!:티스토리]
What Is a Three-Way Handshake in TCP?
Connectionless Transport:UDP - JimKurose