ソケットプログラミングを行ったとき、私ははっきりと理解できませんでしRAW_SOCKET
た。
私の理解は
このオプションAF_INET
でソケットを開くと、RAW_SOCKET
ヘッダーの前に独自のヘッダーを作成できますAF_INET
が、最終的にデータはAF_INET
プロトコルの形式で送信されます。私の理解は正しいですか。間違っている場合は、説明してください。
ありがとうございました
すべての層で、パケットにはヘッダーとペイロードの 2 つのばらばらなセクションがあります。
非 Raw ソケットは、トランスポート層ペイロードを決定できることを意味します。つまり、トランスポート、ネットワーク、およびデータ リンク層のヘッダーを作成するのは OS のタスクです。
Raw ソケットとは、ヘッダーであれペイロードであれ、パケットのすべてのセクションを判別できることを意味します。raw ソケットは一般的な言葉であることに注意してください。raw ソケットをネットワーク ソケットとデータリンク ソケット (または L3 ソケットと L2 ソケット) に分類します。
L3 ソケットでは、ネットワーク層でパケットのヘッダーとペイロードを設定できます。たとえば、ネットワーク層プロトコルが IPv4 の場合、IPv4 ヘッダーとペイロードを特定できます。したがって、トランスポート層のヘッダー/ペイロード、ICMP ヘッダー/ペイロード、ルーティング プロトコルのヘッダー/ペイロードなどを設定できます。
L2 ソケットでは、データ リンク層でパケットのヘッダーとペイロード、つまりパケット内のすべてを設定できます。したがって、L3 ソケットですべてを行い、ARP ヘッダー/ペイロード、PPP ヘッダー/ペイロード、PPPOE ヘッダー/ペイロードなどを決定します。
現在プログラミング中:
3 番目のパラメーターは、ペイロード プロトコルを指定します。
RAW_SOCKET を使用すると、ユーザーはインターネット (IP) レベルより上に独自のトランスポート層プロトコルを実装できます。トランスポート レベルのヘッダーとその背後にあるロジックを作成して解析する責任があります。パケットは次のようになります。
-------------------------------------------------------------------
| Ethernet (typically) header | IP header | Your header | payload |
-------------------------------------------------------------------
編集: Linux の man ページ、またはWindows を使用している場合はhereに raw ソケットの適切な説明があります。
L2 (イーサネット) および L3 (IP) レイヤーを完全に制御できるようにする「パケット ソケット」で SOCK_RAW を使用することもできます。つまり、NIC から出てくるパケットを完全にカスタム レンダリングできます。
詳細はこちら:
http://www.kernel.org/doc/man-pages/online/pages/man7/packet.7.html
ICMP (ping) などのプロトコルにも使用されます。作成するには、ICPM パケットの構造を知っている必要があります。また、カーネルはパケットを変更しません
Once the application creates RAW socket is used to send and
receive packets from source to destination those all packets are
treated as datagram on an unconnected socket
when sending IPv4 data, an application has a choice on
whether to specify the IPv4 header at the front of the outgoing
datagram for the packet.
If the IP_HDRINCL socket option is set to true for an IPv4
socket (address family of AF_INET), the application must supply the
IPv4 header in the outgoing data for send operations.
If this socket option is false (the default setting), then
the IPv4 header should not be in included the outgoing data for
send operations.
It is important to understand that some sockets of type
SOCK_RAW may receive many unexpected datagrams. For example, a PING
program may create a socket of type SOCK_RAW to send ICMP echo
requests and receive responses. While the application is expecting
ICMP echo responses, if several SOCK_RAW sockets are open on a
computer at the same time, the same datagrams may be delivered to
all the open sockets. An application must have a mechanism to
recognize and to ignore all others.
For a PING program, such a mechanism might include
inspecting the received IP header for unique identifiers in the
ICMP header (the application's process ID, for example)
TCP data cannot be sent by using raw socket
Referred from below link :
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740548%28v=vs.85%29.aspx