UDP 체크섬 계산
/usr/include/netine/udp.h에서 정의된 UDP 헤더 구조는 다음과 같습니다.
struct udphdr
{
u_int16_t source;
u_int16_t dest;
u_int16_t len;
u_int16_t check;
};
헤더의 체크 필드에는 어떤 값이 저장됩니까?체크섬이 정확한지 확인하는 방법은?체크섬이 계산되는 데이터가 무엇입니까?(단순히 udp 헤더인가 udp 헤더인가요, udp 헤더인가요, 뒤에 오는 페이로드인가요?)
감사해요.
UDP 체크섬은 페이로드 전체, 헤더의 다른 필드 및 IP 헤더의 일부 필드에 걸쳐 수행됩니다.계산(이 유사 헤더, UDP 헤더 및 페이로드를 통해 수행됨)을 수행하기 위해 IP 헤더에서 유사 헤더가 구성됩니다.의사 헤더가 포함된 이유는 잘못된 IP 주소로 라우팅된 패킷을 잡기 위해서입니다.
기본적으로 수신단에서 헤더와 데이터 영역의 16비트 워드를 모두 합하여(16비트로 래핑) 결과를 확인합니다.0xffff
.
보내는 쪽에서는 좀 더 복잡합니다.어떤 것의 보합은 모든 16비트 값에 대해 수행된 다음 그 값의 보합(즉, 모든 비트를 반전)을 취하여 체크섬 필드를 채웁니다(계산된 0의 체크섬이 모든 1비트로 변경된다는 추가 조건 포함).
사람의 보합은 사람의 모든 보합값의 합이 아닙니다.좀 더 복잡합니다.
기본적으로 0에서 시작하는 16비트 누적기가 있고 여기에 모든 16비트 값을 추가합니다.이러한 추가 사항 중 하나를 추가할 때마다 값이 둘러싸이고 값에 하나를 다시 추가합니다.이것은 효과적으로 16비트 덧셈의 캐리 비트를 가져와 값에 더합니다.
이것은 별도로, 그리고 이것은 나의 입장에서 순수한 추측이지만 이것은 아마도 효율적으로 사용될 수 있을 것입니다.
ADC
(캐리 추가) 지침이 아닌ADD
(놀라울 정도로 충분히 추가) 또는 그 당시 CPU에서 사용 가능한 모든 동등한 명령어를 사용할 수 있습니다.만약 캐리가 없다면,
ADC
캐리에서 0비트만 더하면 됩니다.이런 일이 이루어지던 시절에는(그리고 안타깝게도 나는 그 정도 나이입니다) 기억력은 속도보다는 제약에 가까웠고 요즘은 그렇지 않기 때문에 코드에 몇 바이트를 저장하면 당신을 반신반의 우주의 황제 수준으로 끌어올릴 수 있을 것입니다 :-)
() 에하십시오와 두 )에 가 없습니다.ADC
큰 두 값을 합산하면)d:0x1fffe
)0xfffe
- 여기에 하나를 더한다고 해서 또 다른 휴대품이 생기는 일은 없을 것입니다.
되어 되고, 됩니다가 됩니다.0xffff
합니다.
16비트 워드의 정수를 보장하기 위해 항상 페이로드를 패딩한다는 점에 주목할 필요가 있습니다.패딩이 된 경우, 길이 필드가 실제 길이를 알려줍니다.
RFC768은 이를 상세히 설명하는 규격입니다.
UDP 체크섬 계산의 멋지고 이해하기 쉬운 예는 Gerd Hoffmann에 의해 수행됩니다.
"net-checksum.c Gerd Hoffmann"을 구글에서 검색하거나 여기서 파일을 확인할 수 있습니다.
https://gist.github.com/fxlv/81209bbd150abfeaceb1f85ff076c9f3
합니다.net_checksum_tcpudp
함수, UDP 페이로드 길이, 프로토, src 및 dst IP를 입력하면 UDP 페이로드 자체가 올바른 작업을 수행합니다.
에는 에 를 해야 .htons()
체크섬 위에 있고 당신은 잘합니다.
udp 헤더를 계산할 코드(위에서 언급한 pseudo ip 헤더로)를 검색하고 있었습니다.
드디어 open-bsd dhclient 패킷을 찾았습니다.c:
https://github.com/openbsd/src/blob/master/sbin/dhclient/packet.c
해 보다assemble_udp_ip_header()
언급URL : https://stackoverflow.com/questions/1480580/udp-checksum-calculation
'programing' 카테고리의 다른 글
이온: 이온 아이템을 여러 선에 표시하는 방법? (0) | 2023.09.25 |
---|---|
자바스크립트에서 선택한 텍스트 이벤트 트리거 (0) | 2023.09.25 |
데이터베이스를 DataGrip(0xDBE)으로 가져옵니다. (0) | 2023.09.25 |
비동기 테스트 및 후크의 경우 "done()"이 호출되었는지 확인하고, 약속을 반환하는 경우 해결되었는지 확인합니다. (0) | 2023.09.25 |
모든 외부 키 및 제약 조건을 무시하는 SQL 행 삭제 (0) | 2023.09.25 |