소켓을 생성하게 되면 해당 소켓에는
send buffer, receive buffer 가 각각 할당되는데
이 버퍼의 크기가 궁금하면
getsockopt() 함수로 얻어올 수 도 있고,
setsockopt() 함수로 값을 설정할 수 도 있다.
여기서 궁금했던것은 버퍼의 크기를 0으로 주었을때, 과연 0이 들어가냐
아니면 값을 최대값으로 했을때 최대값이 얼마까지 설정될까 하는점이었다.
물론 답은 공부중인 열혈강의 tcp/ip책에 잘나와있다.
TCP 자체가 출력버퍼가 0이되면 흐름제어(슬라이딩 윈도우 불가) 나 오류 발생시 재전송
(데이터가 들어갈 버퍼가 없음 ㅡㅡ;) 같은 알고리즘이 동작 자체가 불가능하므로,
디폴트값보다 작게 설정해주면 알아서 시스템이 적당히 조정해준다고 하였다.
곧이 곧대로 안믿는나..(나쁜남자 ㅎㅎ)
실제로 페도라 8.0 (intel cpu) 에서 돌려봤다.
TCP, UDP 소켓에 대하여
SNDBUF, RCVBUF 각각 실험하였다.
0으로 해주거나 1으로 버퍼크기를 설정하려고 하면
그림과 같이 send buffer은 2048이 잡히고,
receive buffer는 256이 잡히는것을 확인하였다.
조금씩 늘려가도 마찬가지로 2048, 256 (tcp, udp둘다)
잡혔다.
중간 결론,
입출력 버퍼의
최소값은 send = 2048
receive = 256
이라는거.
그러면 send buffer를 2047, receive buffer는 255로 (1씩만 낮춰서)
설정시켜주면 값이 설정한대로 들어갈까 해서 해봤다.
정확하게 설정되지 않고 4094, 510으로 각각 잡혀있는것을 볼 수 있다.
설정하라고 한값보다 거의 2배정도 되는듯하다.
그림에는 없지만
2047, 256
2100, 300
저런 수치로 해봤는데
설정 수치보다 2배정도의 값으로
시스템이 설정해주었다.
역시 책에서 나온 내용이 맞는 말이구나
...
..
하면서 다음으로 넘어가려다가
snd_buf, rcv_buf 변수가 int 형이므로 int형이 지정할 수 있는
최대 양수 값인 2,147,483,647 을 넣어보기로 하였다.
(그러면 시스템이 알아서 최대 버퍼크기를 알려줄것이라 기대하고)
그 결과
send, receive각각
262,142과 262,142
으로 잡혀있는 것을 확인.
결론, 저게 제일 큰 버퍼 값이로군 ㅡ_ㅡ
메모리는 어느정도 되는지 따져보면
2^18=262,144
0하고 262,144빼면 딱 262,142이네
그럼 결론 추가,
입출력 버퍼는 18비트 메모리를 사용 한다라는 삽질ㅎㅎ
windows xp sp2
cpu intel
윈속에서 같은 코드를 돌려봤는데

넣어주는대로 설정시켜놓고잇다..
이상하다? 0으로 세팅하면 통신이 안되야 하는데..
간단한 에코서버, 클라이언트 프로그램을 작성해서
돌려봤는데 잘된다..
뭐냐 이거





덧글
쿠아 2008/03/17 19:38 # 삭제 답글
안녕하세요.소켓 버퍼 관련 찾다가 들렀는데 이게 운영체제마다 기본 버퍼 크기가 틀리군요.
소켓 버퍼를 0으로 하면 Overlapped IO를 사용시에 바로 사용자가 지정한 애플리케이션 버퍼로 복사를 해와서 버퍼링 오버헤드를 줄일수 있다고, 어디서 줏어들었는데 이에대해서 더 자세한 내용을 찾고 있었거든요.
혹시 찾으시면 저도 좀 알려주세요^^
bruce 2008/03/17 22:51 # 답글
소켓 버퍼를 0으로 하면 슬라이딩 윈도우 같은 알고리즘은 작동 안되는게 아닌가요?nagle 알고리즘을 끈거랑 같은 상황이 발생하는건지..음
교수님께 한번 여쭤봐야겠네요 ^^
bruce 2008/03/17 22:51 # 답글
그리고 입출력 모델을 아직 공부안했는데,, (방학이 끝났다는핑계로;;)더 공부해보겠습니다
111 2008/10/28 20:34 # 삭제 답글
출력을 잘못하신듯 저도 테스트해봣는데..윈도우요...8192가 아니라 32비트 최대값인 0xFFFFFFFF 까지 버퍼가 확장됩니다.
그럼~지나가다가...
bruce 2008/10/29 05:40 # 답글
변경전이 8192이구요, 밑에 2147483647 을 입력으로 했을때 버퍼 크기가어떻게 변경되는가를 본것이었는데, 생각이 짧아서 4294967296을 입력해봤어야
했는데 그러질 못했네요. 그냥 int가 표현하는 양의 정수범위 내에서 머리굴려서
했네요 ^^; 다시 해봐야겠습니다.
리플 감사해요