UDP로 전송할수있는 데이터크기는?
글쓴이: tt / 작성시간: 수, 2004/12/01 - 4:09오전
UDP로 전송할 수있는 최대 데이터의 크기는 얼마나 되는지요?
즉, buf의 크기가 어떻게 되는지요
sendto(sockfd,buf,bufsize,0,(struct sockaddr*)&peer_addr,sizeof(struct sockaddr))
제 시스템(redhat9.0)에서 테스트한결과 16kb정도가 되던데,
16kb이상의 데이터를 보내면 아예 sendto가 에러를 리턴합니다.
같은방식으로 TCP는 100kb이상까지 보낼수있던데...UDP는 그렇지 못합니다.
UDP로 꼭보내야 하는 상황인데 16kb이상의 데이터를 전송하는 방법은 어떻게 되는지요???
Forums:
IP+UDP+DATA 까지 해서 65535 바이트까지 전송 가능합니다.
IP+UDP+DATA 까지 해서 65535 바이트까지 전송 가능합니다.
그렇다면...
만약 65kb 이상의 데이터를 보내려면,
사용자가 65k 크기이하로 잘라서 보내줘야 하나요?
그렇게되면 신경써줘야할게 한두가지가 아닐텐데...일일이 구현해야 하나요?
TCP같은경우는 send()함수로 100kb 데이터를 한번에 처리했던거 같은데...
UDP와 TCP의 전송방식의 차이인지, send()와 sendto()버퍼 크기차이 인지 궁금해지내요...
Re: TCP 와 UDP 의 특성 차이
TCP 와 UDP 의 특성 차이 때문이죠.
TCP 의 경우에는 send() 로 데이터를 보낸다고 이야기 하지만,
실제로 send() 콜이 성공해서 리턴된 이후라도
실제로 패킷이 보내지지 않은 경우가 대부분입니다.
send() 콜은 단지 사용자가 보내려는 데이타를 OS 의 TCP 버퍼에 복사하는
역할에 지나지 않거든요.
그 버퍼에 채워져 있는 데이타를 언제 어떤 크기의 패킷으로 보낼지는
OS 마음입니다 ;;
게다가 이 버퍼에는 boundary 비슷한 개념도 없어서...
사용자가 100 byte 씩 두번 send() 콜을 해도
그 두번의 데이타가 붙어서 한 패킷으로 전송될수도 있습니다.
(한 패킷으로 전송되는 경우가 꽤나 많습니다.)
반대로 1k byte 를 send() 콜을 하더라도
두개의 패킷으로 전송되기도 하죠.
자세한것은 TCP 의 fragmentation 에 대해서 알아보시면 됩니다.
반면에 UDP 는 sendto() 를 콜 하면
해당 데이타가 실제로 그 시점에서 보내집니다.
데이타를 여러개의 패킷으로 나누는 과정도 없이 그냥 패킷 생성해서
보내기 때문에, IP 에서 허용하는 최대 크기를 넘어서는 데이타는
한번의 sendto() 콜로 보낼 수 없습니다.
네. 게다가 UDP 는 패킷들이 보낸 순서대로 destination 에 도착한다는
보장도 없기 때문에 순서도 맞춰줘야 하구요...
성공적으로 보내더라도 destination 에 도착하기 전에 사라질수도 있습니다.
이런걸 다 직접 처리해 줘야 합니다.
(TCP 는 이런 것들을 직접 TCP 레이어에서 처리해주죠)
그렇군요...
그렇군요...확신이 없었는데...답변감사드립니다.
TCP전송방식으로 전향해야 할것같네요... :lol:
댓글 달기