[완료] 전송속도에 관해서 질문올립니다
안녕하세요.
궁금한게 몇가지 있어서 이렇게 질문을 올리게되었습니다.
1. 전송속도를 구하려고 전송시간을 구하려고 합니다.
일단 클라->서버로 파일을 전송합니다.
클라이언트에서 서버로 buf크기만큼 write합니다.(파일이 다 보내질때까지)
여기서 한번 보내질때 전송시간이
1) write하기 전과 후의 차이가 전송시간인지,
2)write하기 전과 write해서 server가 이것을 받은 시점의 차가 전송시간인지 궁금합니다.
gettimeofday 함수를 써서 양쪽다 해봤습니다. 하지만 1번의 경우 거의 시간차가 없더군요.(마이크로초 단위임에도)
2. 위의 2번째로 전송시간으로 전송속도를 구하려고 합니다.
bps가 bit per second니까
(write에서 리턴한 byte수 * 8)/(위에서 구한 전송속도 / 1000000)가 맞지 않나요?
여기서 1000000 을 나눠준 이유는 gettimeofday에서 마이크로초로 받아왔기 때문입니다.
(전송시간 구할때 gettimeofday의 tv_sec*1000000 + tv_usec 해서 마이크로초로 더했습니다.)
3. 그렇게 해서 전송속도를 구하는데 버퍼값에 비례해 전송속도가 나오더군요
소켓에 buf값을 처음에 1024로 해보고, 두번째에 4096으로 해봤습니다.
버퍼값에 관계없이 속도가 나와야 정상인데 처음이랑 두번째에 거의 4배 차이, 즉 버퍼크기 차이만큼 계산되더군요.
4. 전송시간이 가끔씩 음수값으로 뜹니다.
클라이언트에서 write해줄때마다 전송시간을 출력했는데 전송시간이 -로 계산되는 경우가 있떠군요..
예를 들어 send가
예를 들어 send가 완료됬다는 것은.... 네트워크를 통해서 데이터 전송이 완료되었다는 것이 아니라, socket send buffer에 전송할 데이터를 복사했다는 것을 의미하잖아요? (뒷일은 OS가 알아서..)
이런 특성을 고려하심이 좋을듯 합니다. (예컨데 테스트하기 위해 보낸 데이터가 소켓 버퍼 크기보다 작을 경우는 의미 없음...)
http://wiki.kldp.org/wiki.php/superwisdom
그럼 결국
전송속도라는게 send가 완료된 시간이 아니고, send해서 상대방이 read로 자료를 받았을 그 시점이란 것인가요?
socket 마다 buffer가
socket 마다 buffer가 있습니다. send나 recv는 이 버퍼를 대상으로 쓰거나 읽는 작업을 할 뿐입니다. 즉 send가 완료되는 시점은 단순히 전송할 데이터를 socket buffer로 보내는 것이 완료된 시점입니다.
이 버퍼에 있는 데이터는 나중에 OS에서 알아서 전송해줍니다. (한번에 다 보낼 수도 있고, 여러 개로 나눠서 보낼 수도 있고, 아니면 다음 데이터가 더 올때까지 기다릴 수도 있습니다.)
이를 다시 말하자면, 아직 전송할 데이터는 send측 local에 있음에도 send가 완료된 것입니다.
그렇기 때문에 1024byte, 2048byte 이 정도의 데이터(socket buffer보다 훨 작은 크기)를 전송할때는 시간이 거의 걸리지 않은 것으로 나온 것입니다.
만약 보낼 데이터가 크다면, 정확하지는 않더라도 어느정도 신뢰도 있는 값을 얻으실 수 있을 것입니다. 예를 들어 socket buffer의 크기가 10이고, 보낼 데이터가 1000이면, 최소한 990의 데이터가 전송이 된 이후에 전송이 완료될 것이므로, 이를 측정하면 근사적인 값을 얻으실 수 있겠죠.
http://wiki.kldp.org/wiki.php/superwisdom
댓글 달기