Что такое сокет RAW в программировании сокетов

Когда я прошел через программирование сокетов, я не мог четко понять RAW_SOCKET.

Мое понимание

Если я открою сокет с этой опцией AF_INET, RAW_SOCKET означает, что я могу создать свой заголовок сейчас перед заголовками AF_INET, но окончательно данные отправляются в формате протокола AF_INET. Правильно ли я понимаю. Если кто-то ошибается, это может мне объяснить.

ThankYou

Ответы

Ответ 1

В каждом слое пакет имеет два непересекающихся раздела: Заголовок, Полезная нагрузка

non-Raw означает, что вы можете просто определить полезную нагрузку транспортного уровня. т.е. задача ОС - создавать заголовки уровня транспорта, сети и канала передачи данных.

Сырой сокет означает, что вы можете определить каждый раздел пакета - заголовок или полезную нагрузку. Обратите внимание, что raw-сокет - это общее слово. Я классифицирую raw-сокет в: Network Socket andd Data-Link Socket (или альтернативно L3 Socket и L2 Socket)

В L3 Socket вы можете определить заголовок и полезную нагрузку пакета в сетевом уровне. Например, если протокол сетевого уровня является IPv4, вы можете определить заголовок и полезную нагрузку IPv4. Таким образом, вы можете установить заголовок/полезную нагрузку транспортного уровня, заголовок/полезную нагрузку ICMP, заголовок/полезную нагрузку протоколов маршрутизации.

В L2 Socket вы можете установить заголовок и полезную нагрузку пакета на уровне канала передачи данных, то есть все в пакете. Таким образом, вы делаете все с L3 Socket +, определяете заголовок/полезную нагрузку ARP, заголовок/полезную нагрузку PPP, заголовок/полезную нагрузку PPPOE,.....

Теперь в программировании:

  • socket (AF_INET, RAW_SOCKET,...) означает сокет L3, протокол сетевого уровня = IPv4
  • socket (AF_IPX, RAW_SOCKET,...) означает сокет L3, протокол сетевого уровня = IPX
  • socket (AF_INET6, RAW_SOCKET,...) означает сокет L3, протокол сетевого уровня = IPv6
  • socket (AF_PACKET, RAW_SOCKET,...) означает разъем L2, протокол уровня канала передачи данных = Ethernet

Третий параметр указывает протокол полезной нагрузки.

Ответ 2

RAW_SOCKET позволяет пользователю реализовать свой собственный протокол транспортного уровня выше уровня интернета (IP). Вы несете ответственность за создание и анализ заголовков транспортного уровня и логики. Пакет будет выглядеть так:

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

EDIT: хорошее описание сырых сокетов на странице Linux man или здесь, если вы используете Windows.

Ответ 3

Вы также можете использовать SOCK_RAW с "Packet Sockets", который позволит вам полностью управлять слоями L2 (Ethernet) и L3 (IP). Это означает, что вы можете полностью настраивать ваш пакет, поскольку он выходит из 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/

Ответ 4

Он также используется для протоколов, таких как ICMP (ping), вам нужно знать структуру пакета ICPM для его создания. Кроме того, ядро ​​не изменяет ваши пакеты

Ответ 5

            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 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