문제

2.6.9-55.elsmp, x86_64를 실행하는 Linux 상자를 실행 중입니다.

C를 사용하여 setsockopt () 함수를 사용하여 TCP 수신 창을 설정하려고합니다. 다음을 시도합니다.

rwnd = 1024;
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&rwnd, sizeof(rwnd));

위의 코드 세그먼트는 서버에서 데이터를 수신하는 클라이언트 프로그램에 있습니다. tcpdump 출력을 받고 관찰하기 위해 프로그램을 시작하면 다음과 같은 창 협상을 관찰합니다.

11:34:40.257755 IP clientReceiver.42464 > serverSender.8991: 
S 1742042788:1742042788(0) win 5840 
<mss 1460,sackOK,timestamp 1688222886 0,nop,wscale 2>

클라이언트 프로그램은 실제로 클라이언트 프로그램에서 설정 한 것과 다른 창을 협상하고 있음을 알 수 있습니다. 그러나 Steven의 텍스트를 해석하는 방법 ( "TCP/IP 그림 1, 1 권") 섹션 20.4, SetSockoPt () 호출을 사용하여 섹션 20.4의 두 번째 블록 견적에서 그가 언급 한 내용에 영향을 미칩니다 (위 참조. ).

내가 어디에서 잘못되었는지 이해하고 싶습니다.

아마도 Stevens가 말하는 것에 대한 나의 해석은 아마도 틀렸다. 이 경우 수신 버퍼 크기를 설정하는 올바른 방법을 알려 주시겠습니까? 혼란의 증거로 Linux TCP Sockets Man Page를 참조하십시오. http://linux.die.net/man/7/tcp (SO_RCFBUF에 대한 의견을 참조하십시오).

이 이야기에서 내가 무엇을 놓치고 있습니까? 수신 버퍼 크기를 어떻게 제어합니까 (그리고 tcpdump 출력에 표시 되나요? 여기서 소켓 옵션 SO_RCFBUF 설정을 여기에 암시합니다.

모든 입력에 감사드립니다.

도움이 되었습니까?

해결책

당신은 또한 사용해야합니다 TCP_WINDOW_CLAMP

rcvbuf = 2048;
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)& rcvbuf, sizeof(rcvbuf));
clamp = 1024;
setsockopt(sock, SOL_SOCKET, TCP_WINDOW_CLAMP, (char *)& clamp, sizeof(clamp));

RCVBUF는 클램프의 두 배입니다. 자동 튜닝을 허용 할 수 있습니다. 창 클램프가 여전히 작동합니다. 이것은 휴대용이 아닙니다.

다른 팁

소켓을 연결하기 전에만 수신 버퍼 크기를 줄일 수 있습니다. 언제든지 소켓을 늘릴 수 있습니다. connect ()에 대해 어떤 순서를 bookopt ()라고 부르고 있습니까?

TCP의 경우 RWND 값은 ReCV 중에 전달됩니다.

recv (양말, buf, rwnd, 0);

이것은 1024 바이트를받습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top