2011-02-14 3 views
2

내가 쓰기() 바이트로 바이트를 사용하여 소켓 파일 기술자에 쓰고있는 경우,쓰기() 및 TCP/IP 오버 헤드

  • 는 모든 바이트는 현재 패킷인가?
  • 소켓은 모든 바이트에 TCP/IP 헤더를 추가합니까?
  • 또는 버퍼 메커니즘이 있습니다 (개인적으로 의심 스럽지만 명시 적으로 플러시하지 않았기 때문에). 내가 TCP/IP를 모니터링 할 수있는 전문 지식이 없기 때문에 여기를 요청해야

    write (fd, 'abc', 3); 
    
    • 말보다

      write(fd, 'a', 1); 
      write(fd, 'b', 1); 
      write(fd, 'c', 1); 
      

      이 덜 효율적이 될 것이다 : 예를 들어

    트래픽의 헤더. 감사.

답변

3

아니요, 모든 바이트가 패킷이되는 것은 아닙니다. 일부는 Nagle의 알고리즘 및 기타 이유로 병합 될 수 있습니다. 바이트 당이 아닌 패킷 당 하나의 TCP 헤더가 있습니다.

즉, 쓰기/보내기가 바이트 단위로 호출하는 것을 피해야합니다. 각 호출은 시스템 호출이기 때문에 비싸지 만 (로컬 컴퓨터에서는 네트워크에서 끝나는 방식이 아닌) 값 비쌉니다.

1

John의 답변에 추가하면 (TCP_NODELAY을 통해) Nagle의 알고리즘을 비활성화 할 수 있습니다. 그러면 첫 번째 버전의 속도가 느려집니다.

역순으로 write() 대신 writev()을 호출하면 첫 번째 버전이 두 번째 버전과 정확하게 일치하게됩니다.

+1

'writev'의 경우 +1입니다. 'stdio'를 버퍼링 된'FILE'과 함께 사용할 수도 있습니다. –

0

정말 TCP/IP 스택의 구현에 따라 다릅니다. 실제로 OS에서 구현되는 세그먼트 화에 따라 달라집니다. 대부분의 OS에는 이미 많은 최적화 기능이 내장되어 있습니다.

최악의 상황 인 경우 TCP 헤더는 20 바이트이고 IP 헤더는 20 바이트이며 프레임 헤더의 크기는 프로토콜, 아마 이더넷), 그래서 당신은 그 페이로드를 기대할 수 있습니다. 즉, 인터넷 트래픽의 대부분은 ACK에 의해 지배되지만 네트워크 스택은 페이로드를 결합해야합니다.

+0

또한 기본적으로 Nagle 알고리즘과 같은 * 작업 *을 요구하는 TCP/IP * 사양에 따라 다릅니다. – EJP