2012-12-28 2 views
3

TCP를 사용하여 네트워크를 통해 기가 바이트의 데이터를 전송하는 프로토콜을 작성 중이므로 프로토콜 프로그래밍에 대해 약간 가르쳐보십시오. 가장 빠르고 효율적인 방법으로 데이터를 전송하기 위해이 전송 프로토콜을 설계하는 방법을 잘 모르겠습니다.데이터 전송 프로토콜 디자인

Windows에서 Qt를 사용하고 있습니다.

  1. 먼저 로그인 세부 촬영 : 다음과 같이 순간

    는 내 응용 프로그램 프로토콜 (데이터를 전송하는 부분)의 내 디자인입니다.
  2. 4 킬로바이트의 첫 번째 데이터 패킷 (소켓에)을 기록한 다음 서버에서 패킷을 받았는지 확인하기를 기다립니다.
  3. 서버가 데이터 패킷 수신을 확인하면 (int "1"을 작성하여) 다음 4KB를 씁니다.
  4. 모든 데이터가 전송되면 서버로 전송 된 데이터의 md5sum을 보냅니다.
  5. 서버가 int 8로 다시 확인하면 데이터 전송이 완료됩니다.

현재 127.0.0.1 이상을 전송할 때 동일한 컴퓨터에서 166KB/초보다 빠른 속도를 얻을 수 없습니다. 필자는 다른 프로토콜 디자인을 읽으려고했지만 응용 프로그램 용으로 작성할 수있는 데이터 전송 프로토콜에 대한 문서는 거의 없습니다.

게시 한 프로토콜 디자인이 잘못되었거나 심각한 문제가 있습니까? 프로토콜은 각 패킷이 서버에 의해 확인 될 때까지 기다려야합니까, 아니면 계속 써야합니까?

+3

TCP는 이미 확인 (ACK), 체크섬 및 일반적으로 페이로드 크기에 대한 적응 알고리즘을 처리합니다. 그래서 당신이하고있는 모든 일은 불필요한 것처럼 보입니다. 여전히 166KB/s는 로컬 호스트에서 매우 느립니다. –

+0

그래서 서버가 확인을 보낼 때까지 기다리지 않고 소켓에 계속 써야합니까? – user1066991

+1

물론입니다. TCP/IP 스택은 전송, 확인, 재시도, 순서 지정 등을 처리합니다. [socket read/write] (http://beej.us/guide/bgnet/output/html)에서 리턴 값에 대해서만 신경 써야합니다. /singlepage/bgnet.html) 호출. –

답변

0

먼저, TCP 및 약 Sliding Window Protocol에 대해 읽는 것이 좋습니다.

구현이 너무 느린 이유는 두 가지입니다. 첫째, 각 패킷의 수신 확인을 기다리는 중입니다. 매우 느리며 슬라이딩 윈도우를 사용해야합니다. 둘째, MD5 체크섬을 사용합니다. 아무 문제가 없지만 TCP는 이미 몇 가지 기본 체크섬을 구현하고 있으며 MD5 구현은 매우 느릴 수 있습니다.

그리고 마지막으로, 왜 어떤 것이 매우 느린지 알아내는 일반적인 방법은 프로파일 링을 사용하는 것입니다.

관련 문제