최소 256바이트 SO_RCVBUF는 패킷 저장이 허용되지 않나요?

최소 256바이트 SO_RCVBUF는 패킷 저장이 허용되지 않나요?

man mount

SO_RCVBUF

최대 소켓 수신 버퍼를 바이트 단위로 설정하거나 가져옵니다. 값이 setockopt(2)를 사용하여 설정되면 커널은 값을 두 배로 늘리고(장부 오버헤드를 위한 공간을 확보하기 위해) 두 배로 된 값은 getsockopt(2)에 의해 반환됩니다. 기본값은 /proc/sys/net/core/rmem_default 파일에 의해 설정되고 최대 허용 값은 /proc/sys/net/core/rmem_max 파일에 의해 설정됩니다. 이 옵션의 최소(이중) 값은 256입니다.

하지만 내 생각엔 그런 버퍼는 어떤 패킷도 담을 수 없는 것 같아요

Linux에서 기본 Unix 소켓 버퍼 크기로 사용할 수 있는 값은 무엇입니까?

...

패킷당 오버헤드는 struct sk_buff와 struct skb_shared_info의 조합이므로 이러한 구조의 정확한 크기에 따라 달라집니다(정렬을 위해 약간 반올림됨). 예를 들어 위의 64비트 커널에서 패킷당 오버헤드는 576바이트입니다.

위 내용이 맞나요? 커널이 최소 소켓 버퍼 크기를 256으로 강제하는 타당한 이유가 있습니까?

답변1

이전에 질문한 내용 보기"SO_RCVBUF의 최소값은 얼마입니까?"그리고이 네트워크 프로그래밍 가이드, 당신의 의심이 맞는 것 같습니다. UDP 및 IP 패킷은 패킷을 저장할 공간이 충분하지 않기 때문에 자동으로 삭제되며, (내가 아는 한) 최소 전송 창 크기가 버퍼보다 ​​크기 때문에 TCP 연결이 작동하지 않습니다. 아무것도 받지 못할 것입니다.

최소 소켓 버퍼 크기가 왜 그렇게 작은지에 대해서는 아마도 문서의 역사적 유물일 것입니다. 보고 있다Linux 소스 v4.0(linux/include/net/sock.h), 실제 최소 크기는 훨씬 더 큰 것으로 보이며(2048 + sk_buff의 정렬 크기)아주 오랜 시간. 내 생각엔 기록된 최소값이 그렇게 낮은 이유는 ATM 셀 패킷에 대한 원시 액세스를 허용하기 때문인 것 같습니다.48~53바이트, 그러나 이것은 단지 추측일 뿐입니다.

관련 정보