send함수를 사용할때 메시지 길이의 제한
글쓴이: bejoy4him / 작성시간: 수, 2005/08/31 - 4:46오후
간단한 질문입니다만...
기초가 약해서 갑자기 햇갈리는군요...
소켓통신에서 메시지를 전송하기 위해서 쓰는것이 send이지 않습니까?
인자로 데이터가 들어있는 버퍼를 주고, 보내야할 데이터의 길이를 주는 형식으로 사용하는데...
여기서 보내야할 데이터 길이에 제한이 있는 것입니까?
이전까지는 데이터를 보낼때 실제 네트웍 상에선 여러가지 장비를 거치면서
512, 1024바이트 이런식으로 나뉘어져서 전송되기는 하지만
그거야 하위레벨에서 그렇게 하는 것이고 특별한 지정이 없는한
send 함수에서 보낼 데이터 길이를 정할때는
size_t가 오퍼플로우 되지 않을만한 길이 한도내에선
문제가 되지 않는것이라 생각하였습니다.
물론 그 길이가 무척길었을때 send함수가 리턴되지 않아서
수초간 block된것처럼 보이는 현상도 일어날수 있겠고,
중간에 전송이 실패하였을 경우에 처음부터 다시보내야하는 문제도 있군요...
별로 좋아보이진 않지만, 어쨌던 가능한것 아닌가요?
그런데 지금까지 그렇게 길게 보내본 적도 없고, 주위에서 send함수를 쓸때는 1024를 넘어가면 안된다고
세뇌 교육을 받고 있어서 정말 내가 생각하는게 맞는가 하는 의문이 생기네요...
Forums:
네 send 사이즈는 예상하시는 것 처럼 size_t 를 넘지 않는 범위
네 send 사이즈는 예상하시는 것 처럼 size_t 를 넘지 않는 범위 내에서 가능합니다.
그리고 역시 말씀하시 것 처럼 하부에서 분할해서 보내기는 하지만 그것 수신하는 측에서 고려해야 할 문제이지 송신측은 그냥 송신하시면 됩니다.
소켓 통신에서 send 를 여러번 분할해서 함수를 콜하는 것 보다
가능하다면 한번에 크게 send 하는 것이 더 효율적입니다.
위의 내용은 틀린 내용입니다.
왜 틀린 내용인지 설명을 해드리면 보다 설득력 있겠지만 너무 내용이 길어질 듯 해서 타이핑에 압박 때문에 그렇게는 못 하겠고.
TCP Max Segment Size (MSS)
MTU
delay ack
Nagle(네이글) 알고리즘
이정도에 대해 조사해 보시면 도움이 될 듯 하네요.
[quote="ssehoony"][quote="bejoy4him"]그런데
무조건 1024를 넘어가면 안되는건 틀린 얘기지만 무조건 크게 잡아야 효율적인것도 아닙니다.
아무리 크게 잡아도 OS레벨, 네트워크 레벨에서 결국 분할되기 때문에 나름대로 가장 효율적인 어떤 값이 있겠지요. 물론 OS, 시스템파라메터 등에따라 달라지겠지만요.
http://www.psc.edu/networking/projects/tcptune/
http://dast.nlanr.net/Projects/Autobuf_v1.0/autotcp.html
[quote="SaNha"][quote="ssehoony"][quote=
TCP 의 경우 커널 레벨에서 1차로 MSS 사이즈로 분해 하고, 그 다음 MTU 값으로 분해를 합니다.
그렇기 때문에 커널에 송신할 전체 사이즈를 알려주면 가장 효율적으로 패킷을 분해하기 때문에 커널 패킷 분해 정책 입장에서도 한번에 send를 콜하는 것이 좋고, send함수 호출은 시스템콜 이기 때문에 함수 호출시 마다 컨텍스트 스위칭이 2번 발생합니다. 때문에 컨텍스트 스위칭을 감소시키는 입장에서도 send 함수를 콜하는 횟수는 최대한 감소 시키는 것이 좋습니다.
i = i + 2 로 해결할 수 있는 일은 i = i + 1 을 두번 실행할 필요가 없는 것과 같지요.
예를 들어 MTU 가 512 이고 MSS 가 500 일때
3300 바이트를 송실할때
1100 바이트씩 세번 send 하면
실제 네트워크에서 일단 MSS 인 500으로 패킷을 분해해서 1100은 500, 500, 100 이렇게 3개로 분해된 다음 모두 MTU 512보다 작으므로 더이상은 분할 없이 3개의 패킷이 송신되고도 그 다음 1100 도 역시 같은 원리로 3개로 분해되서 송신되므로 총 9개의 패킷이 송신됩니다.
하지만 3300을 한번에 하면 500, 500, 500, 500, 500, 500, 300 이렇게 7개로 분해가되고 모두 MTU 보다 작으므로 그대로 7개로 송신이 됩니다.
MSS는 서버관리자가 설정은 어떻게 하느냐에 따라 언제든지 변경이 가능하고, MTU는 네크워크 하드웨어에 따라 어떻게 변할지 알 수 없습니다. 그렇게 때문에 임의의 사이즈로 패킷을 분할해서 send 하는 것에도 문제가 있지요.
감사합니다. 많은 도움이 되었습니다.
감사합니다.
많은 도움이 되었습니다.
댓글 달기