2010-11-12 5 views
21

UDP 소켓에서 기본 (차단) 동작을 사용하는 중 sendto() 호출을 차단합니까? 나는 본질적으로 리눅스의 행동에 관심이있다.UDP sendto() 블록은 언제 차단합니까?

TCP의 경우 전송 창이 가득차면 혼잡 제어로 send() 호출이 차단되지만 UDP는 어떨까요? 때로는 차단되거나 패킷이 하위 계층에서 버려지도록 할 수 있습니까?

답변

14

소켓 버퍼를 채우는 경우이 문제가 발생할 수 있지만, 이는 매우 높은 운영 체제 인 입니다. UDP는 소켓 버퍼가 꽉 찼을 때 운영 체제가 원하는 것을 무엇이든 할 수 있다고 보장하지 않기 때문에 블록 또는 드롭하십시오. 임시 구제를 위해 SO_SNDBUF를 늘리려고 할 수 있습니다.

이것은 시스템의 미세 조정에 달려 있습니다. 예를 들어 네트워크 인터페이스 드라이버의 TX 링 크기에 따라 다를 수도 있습니다. iperf mailing list에서 이에 대한 몇 가지 토론이 있지만 실제로는 운영 체제의 개발자와이 문제에 대해 논의하고 싶습니다..

+1

좋아, 링크를 따라 [이 스레드] (http://www.mail-archive.com/[email protected]/msg00113.html)에 대한 Linux 관련 설명을 찾았습니다.그래서 간단한 간략한 답변 : _Linux는 sendto를 전체 송신 버퍼에서 차단합니다 ._ –

+2

좋아,하지만 질문은 한 단계 더 나아 갔다 : 어떤 조건 하에서 리눅스는 소켓 버퍼를 채우게 할까? (패킷을 버리는 것과는 대조적으로). 불행히도 이것은 매우 어려운 질문입니다. – MarcH

+0

@MarcH, 어떻게 recv, 소켓이 차단되면 보내? 나는이 경우 send와 recv가 어쨌든 차단 될 것이라고 생각한다. – Bionix1441

9

운영 체제가 원격 호스트의 하드웨어 주소를 가져 오기 위해 ARP 요청을 수행하려고했기 때문일 수 있습니다.

기본적으로 패킷이 끊어 질 때마다 헤더에는 원격 호스트의 IP 주소와 원격 호스트의 MAC 주소가 필요합니다. 192.168.1.34 및 AB : 32 : 24 : 64 : F3 : 21.

"차단"동작은 ARP가 작동 중일 수 있습니다.

이전 버전의 Windows (2k 생각)에서 요청이 너무 오래 걸리고 많은 양의 데이터를 보내면 첫 번째 패킷이 때때로 삭제된다는 이야기를 들었습니다. 그 이후로 서비스 팩이 수정되었을 것입니다.

+0

좋아, 좋은 응답 요소, 흥미로운; 하지만 내가 관심있는 부분은 대부분 혼잡/전체 버퍼와 관련된 차단 (또는 차단 부재)입니다. –

+0

ARP는 동일한 서브넷 - 일반적으로 라우터에있는 호스트를 찾는 데만 사용됩니다. 결과는 후속 전송을 위해 캐시됩니다. – selbie

+2

IP 패킷이 나갈 때 원격 호스트의 IP 주소와 ** 다음 홉의 MAC 주소가 필요합니다 ** ... –

관련 문제