기본 'ping' 구현을 위해 생성된 IPv4 패킷의 정확성을 어떻게 보장합니까?
php 편집기 Strawberry는 로컬 "ping" 구현을 위해 생성된 IPv4 패킷의 정확성을 보장하는 방법을 소개합니다. 네트워크 통신에서는 Ping 명령을 사용하여 호스트 간의 연결을 테스트합니다. 그러나 실제 애플리케이션에서는 오류나 손실을 방지하기 위해 전송된 IPv4 데이터 패킷의 정확성을 보장해야 합니다. 이를 위해 우리는 정확한 Ping 결과를 얻을 수 있도록 데이터 패킷의 정확성과 완전성을 보장하기 위한 몇 가지 조치를 취할 수 있습니다. 다음으로 이러한 조치를 살펴보겠습니다.
질문 내용
개요
저는 본질적으로 네트워크 문제 해결 도구인 사이드 프로젝트를 진행하고 있습니다. 내 목표는 네트워킹 기본 사항을 깊이 이해하고 운영 체제에서 제공하는 문제 해결 도구를 능숙하게 사용하는 것입니다.
이것은 호스트 이름을 가져오고 문제가 있는 경우 진단을 시도하는 CLI 애플리케이션입니다. 계획은 먼저 ping과 경로 추적을 구현한 다음 점차적으로 편안함 수준에 따라 다른 도구를 구현하는 것입니다.
그러나 IPv4 패킷 형식이 잘못되어 핑 구현이 정확하지 않습니다. 이것이 Wireshark가 말하는 것입니다.
으아악코드
이렇게 달성했습니다 ping
성찰
패킷 변형이 단일 원인인지, 복합 원인인지 잘 모르겠습니다. 문제는 다음 두 곳 중 하나(또는 둘 다?)에 있는 것 같습니다.
-
헤더 길이 계산이 잘못되었습니다 제가 수동으로 길이를
40 字节(wordsize = 4 字节)
로 계산했습니다. 구조 손상을 방지하는 순서로 구조 필드를 작성합니다. 다양한 유형의 크기에 대한 정보는 이 소스를 참조하세요.
- 체크섬 계산이 잘못되었습니다인터넷 체크섬 알고리즘을 구현했습니다. 내가 여기서 해야하는 일이 이게 아니라면, 말해 주세요.
카운트 구성, 패킷에 시퀀스 번호 할당 등 구현에서 누락된 부분이 있지만 그 전에 ICMP ECHO 패킷에 대한 응답 수신과 같은 기본 구현을 수정해야 합니다. 내가 어디서 실수를 했는지 알게 되어 좋네요.
감사합니다!
2023년 8월 24일 업데이트
댓글에서 얻은 조언을 고려하여 바이트 순서를 수정하고 소스 주소, 대상 주소에 원시 바이트를 사용하도록 코드를 업데이트했습니다. 그러나 그것만으로는 문제가 해결되지 않고, 패킷의 형식이 여전히 기형이므로 다른 일이 벌어지고 있는 것이 분명합니다.
Solution
드디어 작동하게 되었습니다. 코드와 관련된 몇 가지 문제에 대해 이야기하겠습니다.
직렬화 문제
Andy가 올바르게 지적했듯이 네트워크 바이트 순서로 원시 바이트가 아닌 JSON 개체를 보냅니다. 이 문제는 binary.Write(buf, binary.BigEndian, field)
그러나 이 방법은 고정 크기 값에만 작동하기 때문에 각 구조체 필드에 대해 이 작업을 수행해야 하므로 코드가 반복적이고 다소 보기 흉해집니다.
구조 최적화와 직렬화는 다른 문제입니다.
저는 Version
和 IHL
字段组合在一起以优化内存的做法,这就是为什么我的结构中有这个单个字段 VersionIHL
。但是在序列化时,字段值(在本例中为 4 和 5)将被单独序列化,而我没有这样做。相反,我将整个 VersionIHL
필드의 값을 바이트로 변환하는 방법을 알고 있습니다.
결과적으로 바이트 스트림에서 예상치 못한 옥텟69
,该字节流来自将 4
和 5
组合在一起的 0100 0101
을 보내는 것을 발견했습니다.
불완전한 ICMP 패킷
내 ICMP 구조에는 식별자 및 시퀀스 번호 필드가 포함되어 있지 않습니다. Wikipedia의 ICMP 데이터그램 헤더 섹션에 제공된 정보는 약간 일반적인 것 같습니다. 하지만 RFC 페이지(14페이지)의 세부정보가 훨씬 더 통찰력이 있다는 것을 알았습니다.
핑 유틸리티의 일련 번호의 중요성을 고려하면 이상하게 느껴집니다. 구현하는 동안 코드에서 일련번호가 어디에 적절하게 배치되어 있는지 궁금해하는 경우가 많았습니다. 우연히 RFC 페이지를 접하고서야 비로소 일련 번호를 언제 어디서 통합해야 할지 명확한 아이디어를 얻었습니다.
관심 있으신 분들을 위해 제가 정리한 기능 코드를 소개합니다.
위 내용은 기본 'ping' 구현을 위해 생성된 IPv4 패킷의 정확성을 어떻게 보장합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











2009년 창립 이래 비트코인은 암호화폐 세계의 리더가 되었으며 가격은 큰 변동을 겪었습니다. 포괄적인 역사적 개요를 제공하기 위해 이 기사에서는 2009년부터 2025년까지의 비트코인 가격 데이터를 수집하여 주요 시장 이벤트, 시장 정서 변화, 가격 변동에 영향을 미치는 중요한 요소를 다룹니다.

암호화폐인 비트코인은 출시 이후 상당한 시장 변동성을 경험해 왔습니다. 이 기사에서는 독자들이 가격 추세와 주요 순간을 이해하는 데 도움이 되도록 탄생 이후 비트코인의 역사적 가격에 대한 개요를 제공합니다. 비트코인의 과거 가격 데이터를 분석함으로써 우리는 시장의 가치 평가, 변동에 영향을 미치는 요인을 이해하고 향후 투자 결정의 기초를 제공할 수 있습니다.

Bitcoin의 Price는 2009 년에 창설 된 이래 2021 년 11 월에 69,044.77 달러로 상승하여 2018 년 12 월에 3,191.22 달러로 감소했습니다. 2024 년 12 월 현재 최신 가격은 $ 100,204를 초과했습니다.

실시간 비트 코인 USD 가격 비트 코인 가격에 영향을 미치는 요인 향후 비트 코인 가격을 예측하기위한 지표 다음은 2018-2024 년 비트 코인 가격에 대한 몇 가지 주요 정보입니다.

비트 코인 역사 가격에 대한 중요한 노드 2009 년 1 월 3 일 : 창세기 블록이 생성되었고, 첫 번째 비트 코인이 생성되었으며, 값이 0입니다. 10 월 5 일 : 최초의 비트 코인 거래 인 프로그래머는 10,000 비트 코인이있는 피자 2 개를 $ 0.008에 해당했습니다. 2010 년 2 월 9 일 : Mt. Gox Exchange는 온라인으로 가서 초기 비트 코인 거래의 주요 플랫폼이되었습니다. 5 월 22 일 : 비트 코인은 처음으로 $ 1을 뚫고 나옵니다. 7 월 17 일 : 비트 코인 가격은 $ 0.008로 급락하여 사상 최저치를 기록했습니다. 2011 년 2 월 9 일 : 비트 코인 가격은 처음으로 10 달러를 겪습니다. 4 월 10 일 : Mt. Go

Chatgpt 시대의 기술 Q & A 커뮤니티 : Segmentfault의 응답 전략 stackoverflow ...

세그먼터의 45도 곡선 효과를 달성하는 방법은 무엇입니까? 세분화 장치를 구현하는 과정에서 왼쪽 버튼을 클릭 할 때 오른쪽 테두리를 45도 곡선으로 바꾸는 방법과 포인트 ...

가상 통화 자금 조달 요율은 파생 상품 거래에서 직책을 보유한 거래자에게 청구되는 수수료입니다. 계약이 만료 될 때 현물 시장 가격과 선물 계약 가격 간의 보험료 또는 할인을 반영합니다. 스팟 가격이 선물 가격보다 높으면 자본 비율은 마이너스이므로, 짧은 포지션을하는 거래자는 오랜 지위를 가진 거래자에게 수수료를 지불합니다. 반대로, 스팟 가격이 선물 가격보다 낮을 때, 자본 비율은 긍정적이므로, 이는 장거리 포지션을하는 거래자가 짧은 포지션을하는 거래자에게 수수료를 지불한다는 것을 의미합니다.
