2011-10-21 4 views
2

저는 서버 측에서 Twisted를 기반으로 클라이언트 - 서버 솔루션을 구현하고 있습니다. 클라이언트 측 Android 휴대 전화 Andoird 에뮬레이터는 1500b (또는 그 이하)보다 큰 TCP 패킷을 사용하지 않기 때문에 서버 측에서 패킷을 청크 할 수 있어야합니다. 각 "transport.write"후에 소켓을 플러싱하지 않고, Twisted는 나가는 데이터를 버퍼링하여 어떤 종류의 수동 또는 자동 플러싱/maxpacketsize 기능 없이는 청크가 쓸모 없게 만듭니다. Twisted에서 어떻게합니까? "reactor.doSelect (1)"함수에 익숙하지만 확장 성 및 성능상의 이유로 EPoll 반응기를 사용하고 있으므로 doSelect를 사용할 수 없습니다. Twisted 내의 특정 연결에 대해 maxPacketValue를 변경할 수 있습니까?Twisted Python : 최대 패킷 크기? 플러시 소켓?

+1

이것은 너무 이상합니다. 문제는 마술처럼 스스로 해결되었습니다 ... 클라이언트에게 전달되지 않은 큰 테스트 패킷은 이제 다시 작동합니다. 이유는 모르겠지만 ... 지금은 사례가 닫혔습니다. ! – Dirk

+1

절대로 doSelect를 호출하면 안됩니다. 그것은 당신이 생각하는 것을하지 않습니다. –

+0

문제는 마술처럼 스스로 해결하지 못했습니다. 네트워크의 조건이 바뀌어 이제는 작동합니다 ... 지금 당장. 그러나 그것은 다시 변화 할 것이고, 다시 깨질 것입니다. 실제 코드를 수정하는 방법을 설명하는 내 대답을 참조하십시오. – Glyph

답변

1

TCP 패킷은 자동으로 OS에 의해 청크 있습니다 ... 누군가가 나에게 빛을 보여줄 수 있다는 희망, 할 수있는 모든 응용 프로그램은 플러시하는 힌트를 줄입니다. 그 외에도 응용 프로그램은 스트림을 읽고 쓸 수만 있습니다.

두 통신 피어의 OS는 Path MTU discovery 링크의 MTU를 기반으로 최대 패킷 크기를 자동으로 구성합니다. ICMP 패킷이 작동하도록 차단하지 않도록하십시오.

MTU가 잘못되어 문제가 발생하기 때문에 MTU가 1500 이하인 경우가 많으므로 wireshark과 같은 패킷 추적기와 같이 문제를 다시 진단해야합니다.

2

TCP는 패킷 지향 프로토콜이 아닌 스트림 지향 프로토콜입니다. transport.write에 전화하면 해당 데이터가 TCP 스트림에 추가되고 여러 패킷으로 전송 될 수 있습니다. 그것은 깨 졌거나 write에 대한 다음 또는 이전 호출과 함께 붙어있을 수 있습니다. 이것은 상당히 frequently asked question about Twisted이지만, 묻는 사람은 모두 조금 다르게 묻습니다.

AMP 또는 더 기본적으로 LineReceiver과 같은 프로토콜 구성 키트를 사용하여 패킷 경계의 임의 특성에 의존하기보다는 프로토콜 내에서 메시지를 구분하고 싶습니다.