php エディター Strawberry は、ローカルの「ping」実装用に作成された IPv4 パケットの正確性を確認する方法を紹介します。ネットワーク通信では、Ping コマンドを使用してホスト間の接続をテストします。ただし、実際のアプリケーションでは、エラーや損失を避けるために、送信される IPv4 データ パケットの正確性を保証する必要があります。この目的を達成するために、正確な Ping 結果を確実に取得できるように、データ パケットの正確性と完全性を確保するためにいくつかの措置を講じることができます。次に、これらの対策を見てみましょう。
私は本質的にネットワークのトラブルシューティング ツールであるサイド プロジェクトに取り組んでいます。私の目標は、ネットワークの基本についての理解を深め、オペレーティング システムが提供するトラブルシューティング ツールの使用に習熟することです。
これはホスト名を取得し、問題があれば診断を試みる CLI アプリケーションです。計画では、最初に ping とtraceroute を実装し、その後、私の快適さのレベルに基づいて他のツールを徐々に実装することです。
ただし、IPv4 パケットの形式が正しくないため、私の ping 実装は正確ではありません。これが Wireshark の言いたいことです。
リーリー ###コード###
リーリー
内省
リーリー
2023年8月24日更新
コメントで得たアドバイスを考慮して、バイト順序を修正し、送信元アドレスと宛先アドレスに生のバイトを使用するようにコードを更新しました。ただし、これだけでは問題は解決しません。パケットの形式がまだ間違っているため、何か他の問題が発生しているはずです。 解決策ついに動作するようになりました。コードに関するいくつかの問題についてお話したいと思います。
Andy が正しく指摘したように、私はネットワーク バイト オーダーの生のバイトではなく、JSON オブジェクトを送信しています。これは、
を使用して修正されます。
ただし、このメソッドは固定サイズの値でのみ機能するため、構造体のフィールドごとにこれを行う必要があり、コードが繰り返しになり、やや見苦しくなります。
私は、メモリを最適化するために
IHL フィールドを組み合わせることを知っています。そのため、私の構造には
VersionIHL という単一のフィールドがあります。 。しかし、シリアル化する場合、フィールド値 (この場合は 4 と 5) は個別にシリアル化されますが、私はそれを
しませんでした。代わりに、VersionIHL
フィールドの値全体をバイトに変換します。
その結果、4
と
69 を送信していることに気付きました。 ##。
不完全な ICMP パケット
私の ICMP 構造には、識別子フィールドとシーケンス番号フィールドが含まれていません。
Wikipedia の ICMP データグラム ヘッダー セクションで提供される情報は、少し一般的であるように感じられます。ただし、
RFC ページ (14 ページ)
興味があるかもしれない人のために、ここに 関数コード をまとめました。
以上がネイティブの「ping」実装用に作成された IPv4 パケットの正確性を確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。