2016-08-12 22 views
0

socket()関数呼び出しを下記する(ソケットタイプ、プロトコルが異なっていてもよい)を使用するpacket socketを作成するには、:パケットソケットの作成時にhtons()を使ってプロトコルを指定するのはなぜですか?

socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))

そしてstream socketを作成するために、次の呼び出しが使用される:

socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

packet socketを作成する際にプロトコルを指定するのにhtons()を使用し、AF_INET or AF_INET6ファミリのソケットを作成しない場合、私の質問はなぜですか?なぜpacket socketまたはその逆を作成する際に使用されるように、ストリームまたはデータグラムソケットを作成する

socket(AF_INET, SOCK_XXX, htons(IPPROTO_XXX))

を使用しません。 socket()関数への2つの呼び出しでプロトコルを使用すると、ソケットとTCPレベルの両方のソケットが作成されます。

答えて

0

まず、カーネルに渡される他のほとんどのネットワークパラメータ(IPアドレス、ポートなど)と同様に、パラメータは「オンザワイヤ」形式で渡されるため、基になるソフトウェアは操作する必要がありません比較/コピー/送信などの前に(比較のために、の値は一般的に "着信パケットとの比較"のためのものですが、ETH_P_ALLは特別な信号であるのに対して、AF_PACKETSOCK_RAWはカーネル自体のパラメータです。 'すべてをキャプチャする'という値)

第2に、プロトコルの解釈はアドレスファミリによって異なる可能性があります。異なるアドレスファミリは、それに対してどのような形式でもプロトコルを解釈することを選択できます。イーサネットとIPは常にビッグエンディアンを使用しています(そして、ビッグエンディアンがネットワークオーダーと呼ばれるほど重要である)。

第3に、AF_INETワールド(すなわちインターネットプロトコル)のプロトコル番号は1バイトしか占めないため、バイトオーダーを指定するのは意味がありません。

+0

イーサネット*と* IP *ヘッダーのオン・ザ・ワイヤ形式*は、ネットワークバイトオーダーと呼ばれます(2番目の段落で説明したように)。あなたは、あなたが "ワイヤー"にしたいと思う順序で置くことができます。 –

+0

ETH_P_XXX値が「着信パケットとの比較」であることを考慮すると、なぜIPPROTO_XXX値がネットワークバイトオーダーに変換されないのか。 2番目のパラは、異なるプロトコルファミリがプロトコルをそれに合った形で解釈することを選択できるという上記の質問の理由を示していることを理解しています。これは関数の内部でプロトコルを変換することを選ぶことができたので、これは関数の開発者が決定したことを意味しますか? 3番目のパラグラフでは、プロトコル番号がintとして渡されるので、バイト順序が意味をなさない。私が間違っている場合は修正してください。 – rht

+0

このように考える:リトルエンディアンマシンで2つの16ビット値を比較している場合。比較を行うには2通りの方法があります:(a)メモリに現れる順に1バイトずつ比較する、(b)16ビット単位をレジスタにロードして比較する。一方、1バイトの値では、これらの方法の両方が同じものになります。 –

関連する問題