2013-07-24 7 views
2

서버에서 파일을 받아야하는 클라이언트 응용 프로그램을 작성 중입니다. 통신은 TCP를 통해 설계된 매우 독점적 인 프로토콜을 사용합니다. 서버는 16KB의 데이터 청크를 보내고 클라이언트로부터 간단한 응답을 기다린 다음 다음 청크로 진행합니다. 이것은 파일이 완전히 전송 될 때까지 수행됩니다.TCP ACK 응답이 10ms 지연 됨

서버가 Windows에서 실행 중입니다. Windows에서 (Cygwin을 통해) 클라이언트를 실행하면 70Mbits/s의 처리량을 얻을 수 있습니다. 하지만 Linux에서 실행하면 얻을 수있는 최대 처리량은 5Mbits/s입니다 (동일한 100Mb 이더넷 링크를 사용하는 두 테스트 모두).

내가 수집 한 tcpdump 추적에 대한 조사를 한 후 Linux가 각 TCP ACK에 응답하는 데 약 10ms가 걸리는 것으로 나타났습니다. recv()를 호출 한 후에 매번 sockoption TCP_QUICKACK을 비활성화하려고했지만 성공하지는 못했습니다. 이 동작을 변경할 수있는 다른 TCP 옵션을 찾지 못했습니다 (bsd 소켓 또는 Linux에서도).

아무도 무슨 일이 일어나는지 알아낼 수 있습니까?

  1. 제 클라이언트는 BSD 소켓을 사용하여 C++로 작성되었습니다. TCP_NODELAY sockoption이 설정되어 있습니다.
  2. 내 리눅스 커널은 2.6.19입니다.
  3. 독점적 인 프로토콜과 서버는 제 것이 아니므로 어떤 방식 으로든 변경할 수는 없습니다.

아래에는 분석 한 tcpdump 추적의 샘플이 있습니다. 이것은 청크 전송입니다. 서버 IP는 10.200.252.1이고 클라이언트는 10.200.252.2입니다. 모두

5184 28.060969 10.200.252.1   10.200.252.2   TCP  1510 search-agent > 58358 [ACK] Seq=4736738 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060 
    5185 28.060978 10.200.252.1   10.200.252.2   TCP  1510 search-agent > 58358 [ACK] Seq=4738182 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060 
    5186 28.060981 10.200.252.1   10.200.252.2   TCP  1510 search-agent > 58358 [ACK] Seq=4739626 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060 
    5187 28.060987 10.200.252.1   10.200.252.2   TCP  1510 search-agent > 58358 [ACK] Seq=4741070 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060 
    5188 28.060990 10.200.252.1   10.200.252.2   TCP  1510 search-agent > 58358 [ACK] Seq=4742514 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060 
    5189 28.060994 10.200.252.1   10.200.252.2   TCP  1510 search-agent > 58358 [ACK] Seq=4743958 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060 
    5190 28.060997 10.200.252.1   10.200.252.2   TCP  1510 search-agent > 58358 [ACK] Seq=4745402 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060 
    5191 28.061000 10.200.252.1   10.200.252.2   TCP  1510 search-agent > 58358 [ACK] Seq=4746846 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060 
    5192 28.061003 10.200.252.1   10.200.252.2   TCP  1510 search-agent > 58358 [ACK] Seq=4748290 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060 
    5193 28.061007 10.200.252.1   10.200.252.2   TCP  1510 search-agent > 58358 [ACK] Seq=4749734 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060 
    5194 28.061038 10.200.252.1   10.200.252.2   TCP  1510 search-agent > 58358 [ACK] Seq=4751178 Ack=1741 Win=66048 Len=1444 TSval=2951472 TSecr=2921060 
    5195 28.061042 10.200.252.1   10.200.252.2   TCP  572 search-agent > 58358 [PSH, ACK] Seq=4752622 Ack=1741 Win=66048 Len=506 TSval=2951472 TSecr=2921060 
**5196 28.068422 10.200.252.2   10.200.252.1   TCP  66  58358 > search-agent [ACK] Seq=1741 Ack=4742514 Win=64512 Len=0 TSval=2921061 TSecr=2951472 
**5197 28.078479 10.200.252.2   10.200.252.1   TCP  66  58358 > search-agent [ACK] Seq=1741 Ack=4753128 Win=64512 Len=0 TSval=2921062 TSecr=2951472 
    5198 28.082418 10.200.252.2   10.200.252.1   TCP  70  58358 > search-agent [PSH, ACK] Seq=1741 Ack=4753128 Win=64512 Len=4 TSval=2921062 TSecr=2951472 
    5199 28.082675 10.200.252.2   10.200.252.1   TCP  68  58358 > search-agent [PSH, ACK] Seq=1745 Ack=4753128 Win=64512 Len=2 TSval=2921062 TSecr=2951472 
    5200 28.082714 10.200.252.1   10.200.252.2   TCP  66  search-agent > 58358 [ACK] Seq=4753128 Ack=1747 Win=66048 Len=0 TSval=2951474 

답변

0

가 청크를 제거하기 및 응용 프로그램의 ACK : **로 시작하는 라인은 10ms의 지연과 TCP ACK 패킷입니다. 꼭 필요한 경우 마지막에 파일 하나를 준비하십시오. TCP는 이미 청킹과 ACK를 수행하고 있습니다. 예를 들어, ACKS를 ACK해야만합니다. 이 모든 복잡성에 대한 필요는 없습니다. 스트리밍 프로토콜입니다. 하나처럼 사용하십시오.

+0

프로토콜을 변경할 수 없습니다. 나는 그것을 사용해야한다 – krusty

+0

크게 모든 플랫폼에서 처리량을 향상시킬 것이라고하더라도? – EJP

+0

불행히도. 나는 서버 나 프로토콜에 접근 할 수 없다. – krusty

관련 문제