rawソケットからの入力は、下記に示す規則に従います。
1. UDP/TCPパケットがrawソケットに渡ることはない。
2. 多くのICMPパケット(※)は、カーネルがICMPメッセージを処理した後、rawソケットに渡される。
berkeley派生のインプリでは、エコー要求、タイムスタンプ要求、アドレスマスク要求を除く
すべてのパケットをrawソケットに渡す。
3. 全てのIGMPパケットは、カーネルによる処理後にrawソケットに渡される。
4. カーネルにとってunknownなプロトコルフィールドを持つ、IPデータグラムは、rawソケットに渡される。
5. データグラムが断片化して到着した場合、すべてのフラグメントが到着し再構築終了となるまで
rawソケットには何も渡されない。
加えて、下記の3条件をすべて満たす全てのソケットにデータグラムがコピーされる。
1. rawソケットの作成時に、protocolが指定された場合(socketの第三引数)、受信したデータグラムのプロトコルフィールド
がこの値と一致する必要がある。
2. bindでローカルIPアドレスがバインドされていた場合、受信したデータグラムの終点IPアドレスは、
ローカルIPアドレスと一致する必要がある。
3. connectでリモートIPアドレスがされていた場合、受信したデータグラムの始点IPアドレスは、この接続先アドレスと
一致している必要がある。
また、そっけないですがrawソケットの入力規則はこんな感じ。
次回は、rawソケットを使った”ping”プログラムのソース解説を行います。