2012-12-26 3 views
3

VxWorks 장치와 Linux 컴퓨터 간의 UDP 소켓 통신과 관련된 프로젝트를 진행하고 있습니다. 이 프로젝트에서는 UDP 헤더의 체크섬 필드를 활용하고 싶습니다.UDP 체크섬을 활성화하는 방법

VxWorks 소켓 인터페이스에서 발신 UDP 패킷의 checksum 필드가 기본적으로 활성화되어있는 것처럼 보입니다.

그러나 일반적인 유닉스 소켓 인터페이스의 경우 들어오는 패킷에 대한 체크섬을 검사하고 나가는 패킷에 대해 채울 UDP 소켓을 여는 플래그 나 다른 방법이없는 것으로 보입니다.

일반적인 유닉스 소켓 인터페이스의 경우 그러한 플래그가 존재합니까?

감사합니다.

+0

: (2018 월하지만 현재) 다른 문서화되지 않은 옵션을 사용하여 프로그래밍 방식으로 소켓 당 기준으로 검사 생성을 비활성화 할 수 있습니다 그렇다면 그것은 UDP가 아니라 다른 것입니다. vxworks가 UDP 체크섬을 검사하지 않는다는 공식 문서를 읽지 않았다면, 그것이 사실이라고 가정하는 것이 안전합니다. – nos

+0

@nos not quiet 사실. 인터페이스에서 체크섬 생성을 해제 할 수 있습니다. – UDPLover

+0

@UDPLover NIC 자체에서 CRC 생성을 끄기 때문에 OS가 대신 CRC 생성을 수행해야합니다. – nos

답변

5

은 난 전문가는 아니지만, man 7 udp이 문제에 대해 말하기를 가지고있는 유일한 방법은 기본적으로 활성화되어 있음을 시사 :

UDP를 생성 및 전송 오류를 잡기 위해 체크섬을 확인합니다.

사용하지 않도록 언급하지 않았습니다.

편집 : 나는 현재의 커널 소스를 조사하기에는 게으르다. 그러나 this page은 유효하지 않은 체크섬이있는 패킷이 단순히 삭제된다는 것을 나타냅니다 (csum_copy_err 부분).

+1

IPv4를 통한 UDP의 경우 체크섬 필드는 기술적으로 선택 사항입니다. 값이 0이면 체크섬이 무시됩니다. 그러나 IPv6을 통한 UDP는 체크섬이 0이 아니도록 요구하고, 체크섬이 0 인 데이터 그램은 버려야합니다. 체크섬 *이 0이어야하면 FFFF로 보내야합니다. (IPv6를 지정하는 RFC 인 [RFC 2460] (http://www.ietf.org/rfc/rfc2460.txt)에서 "UDP 체크섬"을 찾으십시오. – zneak

0

(I없는 전문가입니다. 다음은 완전히 잘못 될 수 있습니다.)

네트워크 인터페이스 (또는 드라이버 또는 이에 상응하는 무언가가) 들어오는 패킷의 체크섬을 확인해야합니다. 체크섬의 전체 비트 0은 "나가는 인터페이스가 체크섬을 생성하지 않았습니다."를 의미합니다. 인터페이스는 체크섬 필드에서 사용되는 보완 인코딩에서 모든 비트 (모든 비트 1, a.k.a.a.k.a. "음수 0"포함)를 검사해야하며 패킷이 검사에 실패하면 반드시 폐기해야합니다.

따라서는 결코 (그 패킷 체크섬이 제공 한 경우, 즉) 들어오는 패킷에을 확인 UDP 체크섬 을 해제 할 수있었습니다. 이것은 UDP 표준의 필수 부분입니다.

수신 인터페이스없이 검사로 패킷을 삭제 수도, [1] 또는 응용 프로그램으로 전달할 수있다 (또는이 가능한 경우, 나는 방법을 모른다하더라도 응용 프로그램이 그 원하는 동작을 구성 할 수있다 그것을하기 위해). 당신이 가능하게 제어 할 수 있습니다

있는 유일한 방법은 전송 인터페이스 나가는 패킷에 체크섬을 생성하는지 여부입니다. 플랫폼에 따라 다릅니다. 아래에 몇 가지 방법을 모았습니다. 주의 사항 강사.

플랫폼의 기본 동작을 사용하면 기본적으로 UDP 체크섬 생성이 생성됩니다. 여기에 돈을 넣을 것입니다.

[1] - RFC 8085는 "애플리케이션은 제로 체크섬 [RFC1122] 폐기 UDP 데이터 그램을 선택적으로 허용한다.

ndd -set /dev/udp udp_do_checksum 0 

ndd 유틸리티는 Solaris에 고유 : "


This comp.protocols.tcp-ip post from 1999은 Solaris에서, 명령 줄에서 ndd를 통해 나가는 패킷에 UDP 체크섬의 생성을 해제 세계적으로 수 있음을 시사한다 커널이고 Linux 또는 FreeBSD에는 존재하지 않으며 심지어 the Solaris docs라고해도

udp_do_checksum 
    This parameter controls whether UDP calculates the checksum 
    on outgoing UDP/IPv4 packets. 

Default 
    1 (enabled) 

When to Change 
    Do not change this parameter. 

는 (리눅스와 FreeBSD, /dev/udp "doesn't really exist"; it's a fiction provided by Bash.에 나는 Solaris에서 "실제로 존재"/dev/udp 여부를 알 수 없습니다.)


Microsoft's docs Windows에서 그 의미, 프로그래밍 방식으로 소켓 당 기준으로 UDP 체크섬 생성을 비활성화 할 수 있습니다 , 문서화 된 옵션을 사용하여 :

DWORD trueValue = 1; 
int rc = setsockopt(fd, IPPROTO_UDP, UDP_NOCHECKSUM, (const char*)&yes, sizeof yes); 
if (rc != 0) { perror("setsockopt"); abort(); } 

This thread이 의미를 그 FreeBSD의에 (예를 들어, 맥 OS X) 당신은) 2018 월 달리 문서화되지 않은 (그러나 현재의 옵션을 사용하여 프로그래밍 방식으로 소켓 당 기준으로 검사 세대를 비활성화 할 수 있습니다

int yes = 1; 
int rc = setsockopt(sock, IPPROTO_UDP, UDP_NOCKSUM, (void*)&yes, sizeof yes); 
if (rc != 0) { perror("setsockopt"); abort(); } 

마지막을 this thread는 의미가 리눅스 당신에 이 생성 또는 UDP의 checksu을 확인하지 않는 경우

int yes = 1; 
int rc = setsockopt(sock, SOL_SOCKET, SO_NO_CHECK, (void*)&yes, sizeof yes); 
if (rc != 0) { perror("setsockopt"); abort(); } 

관련 문제