하아찡

소켓통신 TCP Boundary 테스트 본문

C++/이것저것테스트

소켓통신 TCP Boundary 테스트

하아찡 2024. 11. 7. 15:36

소켓통신을 공부하다보니 

TCP는 전송 순서와 손실을 보장주지만, 데이터 사이의 경계가 없다.

데이터 사이의 경계가 없는게 무엇일까?

내가 클라이언트에서 5Byte를 10000번을 보냈는데

서버측에서 한번에 받는 리시브 버퍼가 99Byte이면 한번씩 주거니 받거니할땐 상관이 없겠지만

클라이언트 쪽에서 데이터를 계속 보내고있는데 서버측에서 리시브를 하지않는경우 커널쪽 리시브 버퍼쪽에 데이터가 쌓이게 됩니다.

만약 해당 데이터가 20번 반복해서 100Byte가 버퍼에 차있을경우, TCP 통신의 경우 Boundary가 없기 때문에 한개의 데이터 5Byte를 읽어오는게 아닌 99Byte를 읽어오게 됩니다.

위 과정에서 데이터가 잘리게 됩니다.

 

테스트 과정은 0부터 9999까지 정수를 보내는 과정 일부 메모리를 캡쳐했습니다.

 

 

 

 

 

 

위 결과를 봤을때 데이터를 정상적으로 받을때도 있지만, 데이터를 정상적으로 못받는 경우도 생김.

아마 실전에서 사용하면 더욱더 문제가 발생할듯함. 지금은 보내지는 Byte가 5Byte로 고정인 상황인데 서로 다른 크기의 데이터들을 보내다보면 더욱 데이터가 깨질듯함.

 

그래서 데이터를 프레임에 감싸서 보내면 되지않을까 생각을 해봄.

[ 길이정보 ][ 각종 다른 정보들 ][ 데이터 ]

대충 이런식으로 데이터를 보내서 쓰면 되지않을까...? 그래서 해당 구조에 맞지않으면 다음 데이터를 리시브해서 이전에 리시브 했던 데이터랑 합쳐서 쓰면 TCP통신에서 Boundary문제는 해결되지 않나 싶습니당.

반응형

'C++ > 이것저것테스트' 카테고리의 다른 글

소켓통신 UDP 테스트  (0) 2024.11.07
소켓통신 TCP 흐름제어 테스트  (0) 2024.11.07