2010-03-09 5 views
1

저는 C#으로 UDP 서버 응용 프로그램을 작성하고 있습니다. 패킷 체크섬 문제가 발생했습니다.UDP 패킷에 체크섬을 적용하는 올바른 방법은 무엇입니까

각 패킷은 패킷 데이터가 손상되지 않았 으면 어떤 간단한 방법으로 수신기에 알려야합니다.

이제 UDP에는 헤더의 일부로 2 바이트 체크섬이 이미 있습니다.이 체크섬은 적어도 IPv4 세계에서는 선택 사항입니다. 다른 방법으로는 각 패킷의 데이터 섹션의 일부로 사용자 지정 체크섬을 만들어 수신기에서 확인하는 것입니다.

내 질문은 다음과 같습니다. UDP 패킷 헤더의 (선택 사항) 체크섬에 의존하거나 패킷 데이터 섹션의 일부로 사용자 정의 체크섬 구현을 만드는 것이 낫습니까?

아마도 정답은 (평소처럼) 상황에 따라 달라집니다, 그래서 여기에 하나의 상황은 플랫폼 독립적 인 모노에서 실행해야합니다, 코드 작성 및 Windows에 .NET 개발에도 불구하고 있다는 점이다. 따라서 최종 솔루션은 다른 플랫폼과 호환되어야합니다. 나는 사용자 정의 체크섬 알고리즘을 쉽게 이식 할 수 있다고 믿지만 처음에는 그렇게 확신하지는 않는다.

의견이 있으십니까?

또한 패킷 체크섬에 대한 소리는 일반적으로 환영합니다.

답변

1

오류를 계산해야합니까? UDP 체크섬이 잘못된 경우 라우터가 패킷을 버리고 아무 것도 얻을 수 없습니다.

물론 헤더에 오류가있는 경우 (예 : 대상 IP 주소)도 알 수 없습니다.

또한 체크섬을 켜고 끄기위한 함수 호출은 일반적으로 setsockopt를 포함하지만 플랫폼에 따라 다르지만 UDP 체크섬 알고리즘은 완전히 표준화되어 있습니다.

+0

라우터는 체크섬을 확인하지 않습니다. 그래서 처음부터 해제하는 것이 좋습니다. –

+0

@ Andrew : 지나치게 광범위한 주장입니다. 이것이 주된 이유입니다. 아마도 대부분의 라우터는 체크섬을 확인하지 않지만 대부분의 라우터는 체크섬을 확인하지 않습니다. 예를 들어, 리눅스 기반 라우터에서 netfilter의 일반적인 설정은 체크섬이 잘못된 패킷을 버립니다. –

+0

@Andrew : 좋은 점, 나는 이전에 오류를 세지 않았다고 생각했습니다. 대답은 지금 명백하게 보인다. 크로스 플랫폼 구현에서 System.Net.Sockets.SocketOptionName.ChecksumCoverage는 모든 플랫폼에서 지원되는 것으로 보입니다. –

관련 문제