2012-10-05 1 views
1

TCP 소켓을 비 차단 모드로 설정하고 소켓 전송 버퍼가 처음에 설정된 경우 을 보내면 모든 자료. EAGAIN 오류로 인해 send가 실패하면 send-socket 버퍼를 증가시킬 수 있습니까? Linux OS를 사용하고 있습니다. sendbuffer 크기의 크기 조정이 허용되는지 여부를 이해하고 싶었습니다. tcp 남자 page에서 "개별 연결에서 소켓 버퍼 크기는 listen (2) 또는 connect (2) 호출이 효력을 발생하기 전에 설정되어야합니다." 그게 왜 질문이 발생했습니다버퍼 가득 참 오류로 인해 전송이 실패하면 소켓 전송 버퍼 크기를 늘릴 수 있습니까?

+1

맨 페이지가 잘못되었다고 생각합니다. listen() 또는 connect() 전에 64k * 이상의 버퍼 크기 *를 설정해야한다고 믿어야합니다. window scale 협상이 발생하기 때문입니다. – EJP

+0

실제로 그 경우조차 accept() 전에 listen()하지 말아야합니다. – EJP

+0

이것은 수신 버퍼에만 적용되고 송신 버퍼에는 적용되지 않습니다. – EJP

답변

2

커널 내부 네트워크 스택, 즉 실행중인 운영 체제 (구현하지 않은 상태)의 구현 세부 사항입니다. 나는 주어진 소켓 전용 메모리를 제한 단지 숫자 이후 가장 현대적인 OS-ES에서이 작업을 수행 할 수 있습니다 생각하지만 때문에이 문제를 접근 완전히 잘못된 방법 :

  • 당신은 무기한 송신 버퍼 크기를 늘릴 수 없습니다 , OS는 어느 시점에서 그것을 덮을 것입니다.
  • TCP는 당신을 제공 흐름 제어 - 느린 수신기가 아래로 빠른 보낸 사람을 느리게 -와 수신기가 충분히 빠르게 데이터를 소비하지 않는, 그래서 만약 그 커널 메모리에 더 많은 데이터를 밀어, TCP의는 그 신뢰성과 관련된 장점이다 어떤 식 으로든 상황을 개선하지 못합니다.
  • 게으르다가 커널이 모든 버퍼링을 수행하기를 원합니다.

트래픽 버스트 메모리 요구 사항, 미리 설정된 소켓 송신 버퍼 크기, 애플리케이션 측 버퍼를 알아보십시오.

+0

Linux OS를 사용하고 있습니다. sendbuffer 크기의 크기 조정이 허용되는지 여부를 이해하고 싶었습니다. tcp 맨 페이지 [link] (http://linux.die.net/man/7/tcp)에서 "개별 연결에서 소켓 버퍼 크기는 listen (2) 또는 connect (2) 호출 전에 설정되어야합니다 그것이 효력을 발휘하기 위해서는. " 그 질문이 제기 된 이유는 무엇입니까? – user1723421

+0

그럼 리눅스에 대한 대답입니다. 당신은 그것을 미리 설정할 필요가 없습니다. –

+0

그래서 비 차단 모드에서 소켓을 사용하고 모든 데이터를 전송해야한다면 버퍼 크기를 애플리케이션 측에서 최대 버퍼 크기로 미리 설정해야합니까? – user1723421

3

당신은 네트워킹 버퍼를 조정할 수 있습니다 (http://www.cyberciti.biz/faq/linux-tcp-tuning/)하지만 그건 좋은 생각이 아닙니다. 문제는 크기 버퍼가 무엇이든 관계없이 발생할 수 있으므로이 경우를 처리하기 위해 코드를 작성해야합니다.

관련 문제