소켓 프로그래밍 4 - Data Boundary

프로그래밍 2022. 6. 23. 08:40

TCP 와 UDP의 차이

둘의 차이에 대하여 몇가지 중요한 부분만 얘기해 보려고 합니다.

1. TCP는 연결 지향형 Protocol이고 UDP 는 비 연결 지향형 Protocol 입니다.

이 말의 의미는 TCP는 서버와 클라이언트간에 서로 연결되는 과정이 있어야 이후 서로 message를 주고 받을 수가 있지만

UDP는 상대방이 message 를 받던 말던 신경쓰지 않고 보내 버릴 수 있다는 의미입니다. 즉 UDP는 클라이언트를 대기하는 Listen 과정이 없고 서로 연결하는 connect 과정이 필요 없습니다.

 

가끔 UDP를 서버와 클라이언트 구조로 설명하는 경우가 있습니다만, 그것은 개발자가 Design 한 개념적인 의미, 즉 "서버와 클라이언트를 이렇게 두고 어떻게 message를 주고 받겠다" 를 정의에 의한 것입니다. 만약 따지고 물어서 그럼 TCP도 마찬가지 아니냐고 할 수 있겠지만... TCP는 Listen, Accept 하는  API가 명확히 있으니까요.

 

2. Data Boundary

TCP는 data에 boundary 가 없다고 합니다. Boundaryless protocol 이라고 하고 반대로 UDP는 boundary가 있지요.

이 둘의 차이는 매우 큽니다. Software로 data receive 부분을 구현할 때에 많은 차이가 있기 때문입니다.

 

- TCP

예를 들어 TCP 클라이언트가 처음에 100byte를 서버로 send 했다고 가정하면... 이 data가 서버에 도달했을 때에 수신하는 socket에 감지되는 것은 100 byte가 아닐 수 있습니다.

이 100 byte라는 데이터는 network를 통해 전달되는 과정에 쪼개질 수 있기 때문입니다. network의 부하라던지 환경 등에 의해 데이터가 전달되는 경로, packet size 등이 달라질 수 있기 때문에 원본 데이터는 여러개의 조각으로 나뉠 수 있습니다.

 

위 예에서 TCP socket은 data를 받았을 때(  Receive API 호출 )에  20, 10, 50, 20  byte로 나누어 수신될 수 있습니다.

또 클라이언트가 100 byte 100 byte를 연속으로 보냈다면 수신하는 측에서는 120 byte 80byte 로 받는 경우도 생깁니다.

이 의미는 TCP를 사용할 때에는 서버와 클라이언트 간에 주고 받는 데이터에 대한 규약(Protocol)이 따로 있어야 한다는 의미가 됩니다. 

 

즉,  개발자가 Coding할 때에 수신하는 부분에서는 100 byte가 모두 오지 않았을 때에는 기다릴 수 있어야 하면 수신한 데이터를 별도로 정의한 protocol에 맞추어 조립할 수도 있어야 합니다.

 

유의할 것은 실제 내 PC에서 개발할 경우에는 오류를 접하기 쉽지 않습니다. data loss가 생길 리가 없고 워낙 빠르게 전달되기 때문에 100 byte를 보내면 그대로 100 byte를 받게 되기 때문입니다.

그런데 위와 같은 경우에 대한 처리가 없이 완성된 software를 실제 netowork 상에서 test해 보면 많은 문제점이 발생 하곤 합니다.

 

- UDP

TCP와 다르게 UDP는 100 byte를 전송하게 되면 받는 측에서도 100byte를 받게 됩니다.

만약 보내는 측이 50, 200, 10, 100 byte 씩 나누어 보냈다면 수신측 에서도 50, 200, 10, 100 byte 씩 받게 됩니다.

하지만 결정적으로 데이터가 유실 되거나 순서가 바뀔 수 있습니다.

 

3. Data Loss

- TCP

Network를 통해 전달되는 data packet들은  Router를 통해 길을 찾아 가면서 쪼개지고 서로 다른 network path를 따라 날아 가기도 합니다. 당연히 이때에 Data loss가 발생하는 경우가 있습니다.

 

그런데 TCP는 protocol자체가, data가 checksum이 맞지 않거나 data를 못 받는 경우에 데이터를 재전송 하게 되므로 마지막에 socket으로 data를 받았다( Receive API )는 의미는 그 데이터가 중간에 빠진 데이터가 없이 완전한 것이다는 의미 입니다. 즉, 일단 데이터를 Receive API로 받았다면 그때까지 받은 데이터에 대하여 유실을 고민할 필요가 없습니다.

 

- UDP

TCP와는 다르게 UDP는 수신한 데이터의 CheckSum이 맞지 않으면  바로 버려 버립니다. 그리고는 재전송 해달라는 요청은 하지 않습니다. 그렇기 때문에 데이터의 유실을 감수하고 빠른 데이터 전송이 필요한 경우에는 UDP가 적합합니다.

 

또, 보내는 측이 50, 200, 10, 100 byte 를 순서대로 나누어 보냈는데 수신측 에서는 50, 100, 10 byte 를 받을 수 있습니다.

즉, Router를 통해 데이터가 전달될 때에 packet의 순서가 바뀔 수 있고 이 예에서 처럼 200 byte가 유실 될 수도 있습니다. UDP는 이것을 신경쓰지 않습니다.

 

 

 

TO BE CONTINUED...

728x90
반응형
admin