2009-07-15 20 views
2

以降、ICMPソケット(SOCK_RAWとIPPROTO_ICMP)を受信すると、ICMPプロトコルには「ポート」という概念はありません。 アプリケーションは、受信したパケットが一部ではない他の TCP/UDP/ でも同じ時刻に起こっているソケット送信は何ですか?ICMPソケットでデータを受信する

たとえば、2つのスレッドを持つアプリケーションがあるとします。スレッド1 はTCPサーバーソケットを設定し、接続されたクライアント からのデータを継続的に受信します。スレッド2は、ICMPソケットを使用して同じクライアントにエコー要求パケット (ping)を連続して送信し、echo の応答を受信します。スレッド2がTCP パケットのいずれかを受け取らないようにするにはどうすればよいですか?

答えて

6

ICMPは、IP headerのプロトコルフィールドで決定されるTCPおよびUDPとは異なるプロトコルです。 IPPROTO_ICMPのソケットを開くと、プロトコルフィールドがICMPに設定されたIPヘッダーを持つパケットだけを送受信するようにソケットに指示します。

同様に、IPPROTO_TCPまたはIPPROTO_UDPで開いたソケットは、IPヘッダーにTCPまたはUDPにそれぞれ設定されたプロトコルフィールドが含まれているパケットにのみ応答します。

0

タイプのICMPヘッダーを確認し、そのICMPエコー応答(タイプ0)があるかどうかを確認できます。また、ICMPでは、最初に送信した要求が応答に含まれます。

2

受信UDP &未処理のソケットに渡されたことのないTCPパケット。プロセスがUDPまたはTCPパケットを含むIPデータグラムを読み取ろうとする場合、パケットはデータリンク層で読み取られなければなりません。パケットは、それがカーネルによって処理されたレイヤ2でキャッシュされていない場合は、このリンク

http://aschauf.landshut.org/fh/linux/udp_vs_raw/ch01s03.html

をご確認ください。 パケットがicmpプロトコルのもので、タイプエコー要求またはタイムスタンプ要求またはアドレスマスク要求の場合は、カーネルによって完全に処理されます。そうでない場合はRAWソケットに渡されます。

もう1つのカーネルは、IPの基本的な処理は、それら最後に

データグラムは、その後何もrawソケットに渡されていない断片に到着した場合に行われるrawソケットに渡され、理解していないプロトコルフィールドを持つすべてのデータグラムすべての断片が集まって再構成されるまで。

詳しくは、this bookをお読みください。

関連する問題