ホームページ  >  記事  >  バックエンド開発  >  ネイティブの「ping」実装用に作成された IPv4 パケットの正確性を確認するにはどうすればよいですか?

ネイティブの「ping」実装用に作成された IPv4 パケットの正確性を確認するにはどうすればよいですか?

王林
王林転載
2024-02-09 08:36:25949ブラウズ

如何确保为本机“ping”实现创建的 IPv4 数据包的正确性?

php エディター Strawberry は、ローカルの「ping」実装用に作成された IPv4 パケットの正確性を確認する方法を紹介します。ネットワーク通信では、Ping コマンドを使用してホスト間の接続をテストします。ただし、実際のアプリケーションでは、エラーや損失を避けるために、送信される IPv4 データ パケットの正確性を保証する必要があります。この目的を達成するために、正確な Ping 結果を確実に取得できるように、データ パケットの正確性と完全性を確保するためにいくつかの措置を講じることができます。次に、これらの対策を見てみましょう。

質問内容

概要

私は本質的にネットワークのトラブルシューティング ツールであるサイド プロジェクトに取り組んでいます。私の目標は、ネットワークの基本についての理解を深め、オペレーティング システムが提供するトラブルシューティング ツールの使用に習熟することです。

これはホスト名を取得し、問題があれば診断を試みる CLI アプリケーションです。計画では、最初に ping とtraceroute を実装し、その後、私の快適さのレベルに基づいて他のツールを徐々に実装することです。

ただし、IPv4 パケットの形式が正しくないため、私の ping 実装は正確ではありません。これが Wireshark の言いたいことです。

リーリー ###コード###

これが私の実装方法です

ping

リーリー 内省

パケットの異常が単一の原因によって引き起こされているのか、それとも複数の原因によって引き起こされているのかわかりません。 問題は次の 2 つの場所のいずれか (または両方?) にあると思います:

    ヘッダーの長さの計算が正しくありません
  1. 手動で長さを計算したところ、40 バイト (ワードサイズ = 4 バイト) となりました。構造フィールドは、構造の破損を防ぐ順序で書き込みます。 さまざまなタイプのサイズについては、このソースを参照します。 リーリー
    チェックサムの計算が正しくありません
  1. インターネット チェックサム アルゴリズムを実装しました。これが私がここでやるべきことではない場合は、教えてください。
  2. カウントの構成、パケットへのシーケンス番号の割り当てなど、実装には欠落している部分がいくつかありますが、その前に、基本的な実装、つまり ICMP ECHO パケットの応答の受信を修正する必要があります。どこで間違えたのかわかってよかったです。
###ありがとう!

2023年8月24日更新

コメントで得たアドバイスを考慮して、バイト順序を修正し、送信元アドレスと宛先アドレスに生のバイトを使用するようにコードを更新しました。ただし、これだけでは問題は解決しません。パケットの形式がまだ間違っているため、何か他の問題が発生しているはずです。

解決策

ついに動作するようになりました。コードに関するいくつかの問題についてお話したいと思います。

シリアル化の問題

Andy が正しく指摘したように、私はネットワーク バイト オーダーの生のバイトではなく、JSON オブジェクトを送信しています。これは、

binary.Write(buf, binary.BigEndian, field)

を使用して修正されます。 ただし、このメソッドは固定サイズの値でのみ機能するため、構造体のフィールドごとにこれを行う必要があり、コードが繰り返しになり、やや見苦しくなります。

構造の最適化とシリアル化は別の問題です。

私は、メモリを最適化するために

Version

フィールドと

IHL フィールドを組み合わせることを知っています。そのため、私の構造には VersionIHL という単一のフィールドがあります。 。しかし、シリアル化する場合、フィールド値 (この場合は 4 と 5) は個別にシリアル化されますが、私はそれを しませんでした。代わりに、VersionIHL フィールドの値全体をバイトに変換します。 その結果、4

5## をグループ化して、バイト ストリームで予期しないオクテット

69 を送信していることに気付きました。 ##。 不完全な ICMP パケット 私の ICMP 構造には、識別子フィールドとシーケンス番号フィールドが含まれていません。 Wikipedia の ICMP データグラム ヘッダー セクションで提供される情報は、少し一般的であるように感じられます。ただし、RFC ページ (14 ページ)

の詳細がはるかに洞察力に富んでいることがわかりました。

ping ユーティリティのシリアル番号の重要性を考えると、これは奇妙に感じられます。実装中に、シリアル番号がコード内のどこに適切に配置されているか疑問に思うことがよくありました。 RFC ページに偶然出会って初めて、シリアル番号をいつ、どこに組み込むべきかについて明確なアイデアを持ちました。

興味があるかもしれない人のために、ここに 関数コード をまとめました。

以上がネイティブの「ping」実装用に作成された IPv4 パケットの正確性を確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。