linux - sistemas - socket protocolo
¿Qué es el socket RAW en la programación de socket? (5)
Cuando pasé por la programación de socket, no pude entender claramente RAW_SOCKET.
Mi entendimiento es
Si abro un socket con esta opción AF_INET, RAW_SOCKET significa que puedo crear mi encabezado ahora antes que los encabezados AF_INET, pero finalmente los datos se envían en el formato del protocolo AF_INET. Es mi entendimiento es correcto. Si me equivoco, alguien me puede explicar.
Gracias
En cada capa, el paquete tiene dos secciones separadas: Encabezado, Carga útil
el zócalo no Raw significa que solo puede determinar la Carga de la capa de transporte. es decir, es tarea del sistema crear encabezados de capa de enlace de datos, transporte y red.
El zócalo sin procesar significa que puede determinar cada sección del paquete, ya sea encabezado o carga útil. Tenga en cuenta que el socket en bruto es una palabra general. Clasifico el socket sin formato en: Socket de red y Socket de enlace de datos (o L3 Socket y L2 Socket alternativamente)
En L3 Socket puede determinar el encabezado y la carga útil del paquete en la capa de red. Por ejemplo, si el protocolo de capa de red es IPv4, puede determinar el encabezado y la carga útil de IPv4. Por lo tanto, puede configurar el encabezado / carga útil de la capa de transporte, el encabezado / carga útil ICMP, el encabezado / carga útil de los Protocolos de enrutamiento.
En L2 Socket puede establecer el encabezado y la carga útil del paquete en la capa de enlace de datos, es decir, todo en el paquete. De este modo, se hace todo lo que se hace con L3 Socket + determinar el encabezado / carga de ARP, el encabezado / carga de PPP, el encabezado / carga de PPPOE, ....
Ahora en programación:
- socket (AF_INET, RAW_SOCKET, ...) significa socket L3, Protocolo de capa de red = IPv4
- socket (AF_IPX, RAW_SOCKET, ...) significa socket L3, Protocolo de capa de red = IPX
- socket (AF_INET6, RAW_SOCKET, ...) significa socket L3, Protocolo de capa de red = IPv6
- socket (AF_PACKET, RAW_SOCKET, ...) significa socket L2, Protocolo de capa de enlace de datos = Ethernet
El tercer parámetro especifica el protocolo de carga útil.
RAW_SOCKET permite al usuario implementar su propio protocolo de capa de transporte por encima del nivel de Internet (IP). Usted es responsable de crear y analizar los encabezados de nivel de transporte y la lógica detrás de ellos. Un paquete se vería así:
-------------------------------------------------------------------
| Ethernet (typically) header | IP header | Your header | payload |
-------------------------------------------------------------------
EDITAR: hay una buena descripción de sockets en bruto en la página de manual de Linux , o here si está usando Windows.
También puede usar SOCK_RAW con "Paquetes de Paquetes" que le permitirán tener control total sobre las capas L2 (Ethernet) y L3 (IP). Esto significa que puede hacer un renderizado completo de su paquete a medida que sale de una NIC.
Detalles aquí:
http://www.kernel.org/doc/man-pages/online/pages/man7/packet.7.html
También se usa para protocolos como ICMP (ping), debe conocer la estructura del paquete ICPM para crearlo. También el kernel no modifica tus paquetes.
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