2016-11-04 2 views
1

내부 네트워크를 통해 2 개의 Linux OS간에 가변 크기의 패킷을 보내려고합니다. 패킷은 가변 크기이며 길이와 CRC는 패킷과 함께 전송되는 헤더에 표시됩니다. 나는이 한 고유 limitation of TCP checksumsTCP/IP를 사용하여 네트워크를 통해 가변 크기의 패킷을 전송합니다.

문제를 극복하기 위해 응용 프로그램 계층에서 CRC를 사용하고

struct hdr { 
    uint32 crc; 
    uint32 dataSize; 
    void *data; 
}; 

을 대략 같은 - 뭔가의 dataSize 필드 자체가 손상되는 기회가 존재하는 경우 , 나는 다음 패킷이 어디에서 시작하는지 모른다. rec에서 소켓 버퍼를 읽을 때 나는이 패킷을 서로 옆에 읽었다. 그래서 dataSize은 다음 패킷을 올바르게 얻을 수있는 유일한 방법입니다. CRC를 불일치가 발생하면 내가 가지고있는

일부 아이디어는 연결을 다시 시작

  1. 대입니다.
  2. 그런 패킷을 고정 크기의 하나의 큰 패킷으로 집계하고 CRC 오류가 발견되면 큰 패킷을 버립니다. 큰 패킷은 우리가 잃을 것을 확인하는 것입니다.

이러한 가변 크기 패킷에 대한 다른 아이디어는 없습니까?

답변

1

TCP는 스트림 기반이므로 데이터 길이는 응용 프로그램에서 처리 할 하나의 전체 메시지를 추출하는 데 일반적으로 사용되는 방법입니다. 어떤 이유로 길이 바이트 자체가 잘못되었다고 생각된다면 패킷을 버리고 "플러시 (flush)"하고 송수신기가 다시 동기화 할 것을 기대하는 것 외에는 할 수있는 일이 많지 않습니다. 하지만 가장 좋은 방법은 연결을 다시 동기화하기 위해 응용 프로그램 계층에 프로토콜이있는 경우가 아니라면 연결을 끊는 것입니다.

길이 바이트가 아닌 다른 방법으로는 마커를 사용하는 것입니다. 메시지 시작 및 메시지 끝. 메시지 시작시 발생하는 응용 프로그램은 메시지 끝 바이트가 수신 될 때까지 데이터 수집을 시작한 다음 메시지를 추가로 처리해야합니다. 이를 위해서는 메시지가 적절하게 이스케이프 처리되어야합니다.

1

중요한 위험이 다른 곳에있을 때 2 차 오류 가능성을 다루고 있다고 생각합니다. 우리는 시리얼 라인 전송을 사용하는 경우

는 오류가 자주 (하나 또는 두 개의 모든 몇 킬로바이트)이었다. 우리는 CRC와 패킷 크기가 약 100 바이트 인 좋은 오래된 Kermit을 사용했는데 그 정도면 충분했습니다. 라인이 끊어지기 때문에 실패한 전송이 여러 번 발생했지만 올바르지 않은 파일은 절대로 전송하지 못했습니다.

현재 네트워크에서는 빈약 한 줄을 제외하고는 하드웨어 수준이 그리 좋지 않으며 어쨌든 수준 2 데이터 링크 계층에는 체크섬이있어 두 노드간에 각 패킷이 수정되지 않았 음을 제어합니다. HDLC는 일반적으로 그 수준에서 사용되며 CRC16 또는 CRC32 체크섬을 정상적으로 사용하며 이는 매우 정확한 체크섬입니다.

그래서 TCP 레벨과 체크섬 바이트 스트림에서 임의의 오류를 감지하기위한 것, 단순히 exemple에 대한 예상치 못한 오류에 대한 최후의 방어선으로 라우터로 인해 감전의 화를 가져 와서 전체 전송하면되지 찌꺼기. 통계 데이터가 없지만 TCP 수준에 도달하는 오류 수가 이미 매우 낮은 것으로 확신합니다.다르게 말하면, 걱정할 필요가 없습니다. 매우 민감한 데이터를 다루지 않는 한 - 글로벌 체크섬의 경우 두 번째 채널, 데이터의 경우 이전, TCP/IP이면 충분합니다.

즉, 응용 프로그램 수준에서 컨트롤을 최후 방어로 추가하는 것은 완벽하게 허용됩니다. 데이터 링크 및 TCP 수준에서 감지되지 않았을 수있는 오류 만 처리하거나 피어 응용 프로그램의 오류 (작성자 및 테스트 방법)를 처리합니다. 그래서 오류를 얻을 수있는 확률이 매우 거친 복구 절차 사용하기에 충분히 낮은 :

  • 마지막 패킷이 올바르게 교환 후 (이 의미가있는 경우)
  • 가 새
  • 다시 시작 열고 연결을 종료하거나 단순히 ... 당신이

그러나 위험이 물리적 분리, 또는 어느 곳에서나 네트워크에 정전을 얻기 위해 훨씬 높다가, 응용 프로그램 수준 구현에 결함이 말하는 수없는 경우 새로운 패킷을 전송 계속

그리고 완전히 바이트 순서 및 crc 및 데이터 크기를 지정하는 것을 잊지 마세요 ...

관련 문제