37

ソケットプログラミングを行ったとき、私ははっきりと理解できませんでしRAW_SOCKETた。

私の理解は

このオプションAF_INETでソケットを開くと、RAW_SOCKET ヘッダーの前に独自のヘッダーを作成できますAF_INETが、最終的にデータはAF_INETプロトコルの形式で送信されます。私の理解は正しいですか。間違っている場合は、説明してください。

ありがとうございました

4

5 に答える 5

69

すべての層で、パケットにはヘッダーとペイロードの 2 つのばらばらなセクションがあります。

非 Raw ソケットは、トランスポート層ペイロードを決定できることを意味します。つまり、トランスポート、ネットワーク、およびデータ リンク層のヘッダーを作成するのは OS のタスクです。

Raw ソケットとは、ヘッダーであれペイロードであれ、パケットのすべてのセクションを判別できることを意味します。raw ソケットは一般的な言葉であることに注意してください。raw ソケットをネットワーク ソケットとデータリンク ソケット (または L3 ソケットと L2 ソケット) に分類します。

L3 ソケットでは、ネットワーク層でパケットのヘッダーとペイロードを設定できます。たとえば、ネットワーク層プロトコルが IPv4 の場合、IPv4 ヘッダーとペイロードを特定できます。したがって、トランスポート層のヘッダー/ペイロード、ICMP ヘッダー/ペイロード、ルーティング プロトコルのヘッダー/ペイロードなどを設定できます。

L2 ソケットでは、データ リンク層でパケットのヘッダーとペイロード、つまりパケット内のすべてを設定できます。したがって、L3 ソケットですべてを行い、ARP ヘッダー/ペイロード、PPP ヘッダー/ペイロード、PPPOE ヘッダー/ペイロードなどを決定します。

現在プログラミング中:

  • socket(AF_INET,RAW_SOCKET,...) は L3 ソケット、Network Layer Protocol = IPv4 を意味します
  • socket(AF_IPX,RAW_SOCKET,...) は L3 ソケット、Network Layer Protocol = IPX を意味します
  • socket(AF_INET6,RAW_SOCKET,...) は L3 ソケット、Network Layer Protocol=IPv6 を意味します
  • socket(AF_PACKET,RAW_SOCKET,...) は L2 ソケット、Data-link Layer Protocol= Ethernet を意味します

3 番目のパラメーターは、ペイロード プロトコルを指定します。

于 2013-03-29T08:00:12.860 に答える
22

RAW_SOCKET を使用すると、ユーザーはインターネット (IP) レベルより上に独自のトランスポート層プロトコルを実装できます。トランスポート レベルのヘッダーとその背後にあるロジックを作成して解析する責任があります。パケットは次のようになります。

-------------------------------------------------------------------
| Ethernet (typically) header | IP header | Your header | payload |
-------------------------------------------------------------------

編集: Linux の man ページ、またはWindows を使用している場合はhereに raw ソケットの適切な説明があります。

于 2013-02-08T14:29:25.310 に答える
4

L2 (イーサネット) および L3 (IP) レイヤーを完全に制御できるようにする「パケット ソケット」で SOCK_RAW を使用することもできます。つまり、NIC から出てくるパケットを完全にカスタム レンダリングできます。

詳細はこちら:

http://www.kernel.org/doc/man-pages/online/pages/man7/packet.7.html

http://austinmarton.wordpress.com/2011/09/14/sending-raw-ethernet-packets-from-a-specific-interface-in-c-on-linux/

于 2013-02-08T15:09:57.600 に答える
1

ICMP (ping) などのプロトコルにも使用されます。作成するには、ICPM パケットの構造を知っている必要があります。また、カーネルはパケットを変更しません

于 2013-02-08T14:35:33.673 に答える
-4
            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
于 2016-06-27T09:06:01.337 に答える