본문 바로가기

네트워크/깊이있는 네트워크 기록들

TCP/UDP 알아보기

TCP/UDP는 대표적인 4계층 프로토콜로서 어떻게 전송할 것인가를 규정하는 프로토콜이라고 할 수 있다.

오늘은 TCP/UDP에 관한 여러가지 개념과 차이점을 정리하는 시간을 가지려고 한다.

해당 정리는 TCP 헤더를 기준으로 하여 진행할 생각이다.

 

 

우선 TCP와 UDP의 가장 큰 차이점은 데이터 분할 여부이다.

TCP는 MSS(Maximum Segment Size)에 따라 데이터를 분할하여 전송하며, 이 때 분할한 각각의 데이터들을 Segment라고 부른다.  TCP 헤더에 존재하는 Sequence Number는 분할한 데이터의 순서번호를 지정하기 위해 존재한다.

 

또한 TCP 헤더의 Acknowledgement Number는 TCP를 신뢰성 있는 프로토콜로 만들어준다. 특정 데이터를 받았을 때 TCP는 이 ACK 필드를 통해 몇번 Segment까지 제대로 받았는지 역으로 전송해준다. 예를 들어 특정 데이터를 전송 후  ACK 332라는 컨트롤 데이터를 받았으면 332번까지 전송받았으니 333번을 전송해달라는 뜻으로 받아들여진다. 만일 TCP Time Out 시간동안 ACK를 받지 못했다면 전송측은 해당 데이터를 다시 전송하여, 데이터의 유실, 변형 등의 문제를 막을 수 있다. 이것을 TCP의 오류 제어라고 한다.

 

TCP의 Window Size 필드는 수신 버퍼의 여유량을 나타낸다. 즉 "내가 이 정도 데이터까지 받을 수 있다"를 나타내어 수신 능력 이상의 데이터를 받을 시 발생하는 여러가지 기능 저하를 제어할 수 있다. Window Size는 송신자 측에서 전달하는 CWND(Congestion Window)와 수신자 측에서 제공하는 RWND(Received Window)가 존재한다. RWND는 수신자가 받을 수 있는 Segment 크기를 나타내며, CWND는 송신자가 보낼 수 있는 Segment 크기를 나타낸다.

즉 RWND는 수신 장비의 상태를 나타내며, CWND는 송신측의 네트워크 상태를 나타낸다고 할 수 있다. 이 중 작은 값을 Window Size로 사용한다. 이것을 TCP의 흐름 제어라고 한다.

 

ACK와 Window Size를 통해 TCP는 슬라이딩 윈도우라는 기능을 제공한다. 해당 기능은 서로의 Window Size를 공유해 여유량 까지는 ACK 번호를 받지 않아도 Segment를 전송하게 만들어주는 기능이다. 처음 전송측에서 CWND를 1로 정하고 Segment를 보내며, 그 후에 CWND를 2배씩 늘려간다. 즉, ACK 없이도 보낼 수 있는 Segment를 매 전송마다 배로 증가시키는 것이다. 그러다가 너무 많은 Segment를 전송해 정해진 시간동안 ACK를 받지 못한다면, CWND는 1로 초기화되며, CWND의 1/2을 ssthresh로 지정해준다. 그 후에 다시 CWND를 1부터 배씩 증가시킨다. 이때 CWND가 ssthresh의 크기와 동일한 시점부터 CWND를 1씩 조심스럽게 증가시킨다.

 

만일 동일한 ACK 번호를 3번 이상 받는다면 그때부터는 CWND의 크기를 절반으로 줄여준다. 예를들어 20번 Segment가 전송 과정에서 유실되었으나, 전송측은 그것을 모르고 연속해서 Data를 보낼 수가 있다. 만일 전송측이 21번 Segment를 보내더라도 20번 Segment를 받지 못한 수신측은 ACK 20번을 보낸다. 22번 Segment를 전송측이 보내어도 수신측은 ACK 20번을 보내다. 23번도 동일하게 진행하여 전송측은 ACK 20번을 3번 받게 된다. 이럴 경우 전송측은 패킷이 유실되었다는 것을 인지하고 CWND 크기를 반으로 줄이며 Segment 20번부터 다시 전송하게 된다.

이처럼 오류와 흐름을 송수신측의 ACK와 Window Size를 통해 제어하기 위해, TCP는 투웨이 커뮤니케이션(양방향 통신)을 사용한다고 할 수 있다.

 

또한 TCP는 연결 과정에서도 UDP와 큰 차이점을 보인다. TCP는 실제 Data를 보내기 전 SYN 비트를 1로 표시하여 전송한다. 즉 보내도 괜찮냐는 뜻, 이것을 받은 수신측은 보내도 좋다는 의미로 ACK와 SYN를 1로 세팅하여 보낸다. 마지막으로 송신측은 이제부터 Data를 보내겠다는 뜻으로 ACK 비트를 1로 세팅하여 전송한다. 또한 Data 전송이 끝난 후 송 수신측인 FIN 비트를 1로 세팅하여 전송하며, 이에 대한 응답으로 ACK 비트를 1로 세팅하여 전송한다. 해당 과정을 끝내고 나서야 비로소 통신이 끊어진다.

실제 Data를 보내기 전 세번의 송수신을 통해 미리 통신 상태를 확인하는 이러한 방식을 3-way Handshaking이라고 하며, 통신이 종료하기전에 4번의 송수신을 하는 방식을 4-way HandShaking이라 한다. 이처럼 TCP는 실제 Data 송수신 전에 항상 커넥션에 문제가 없는지 확인하며, 그래서 TCP를 커넥션 오리엔티드 프로토콜이라고 부르기도 한다.

 

마지막으로 정리하면 TCP는 ACK 번호를 컨트롤 데이터로 받기때문에 신뢰성 있는 프로토콜이라고 할 수 있다.

또한 ACK와 Window Size를 송수신측이 교환하기에 투웨이 커뮤니케이션이라고 부르기도 한다.

마지막으로 SYN, ACK 비트를 통해 실제 Data 교환 전 연결성을 확인하는 커넥션 오리엔티드 프로토콜이라 할 수 있다.

'네트워크 > 깊이있는 네트워크 기록들' 카테고리의 다른 글

MPLS VPN  (0) 2019.05.03
CEF 스위칭에 대해서  (0) 2019.04.24
STP에 관해  (0) 2019.04.21
스위치/허브 구조적 차이  (0) 2019.04.14
L4 스위치/L7 스위치/멀티레이어 스위치  (0) 2019.04.14