Socket Raw.

Antes de comentar las características de los socket raw, debemos comenzar por explicar el porqué del uso de este tipo de sockets. Para el desarrollo de este proyecto, necesitamos crear paquetes IP que incluyan las cabeceras estándar, pero que en las opciones incluyan una serie de campos distintos a los tradicionales. Además, no deseamos que el kernel añada o modifique cabeceras de nuestros paquetes. El objetivo es construir un paquete IP e inyectarlo directamente en la red sin que el kernel lo modifique.

A continuación, se muestra en la figura [*] la pila OSI y su equivalencia en la pila de Internet para comprobar a qué nivel se van a generar nuestros paquetes.

Figura: Comparativa de la pila OSI e Internet.
\includegraphics[width= 11cm]{img/pilaosi_internet.eps}

Dicho ésto, pasamos a estudiar un poco más en profundidad el mundo de los Sockets Raw.

Características principales de los Socket Raw

Los conectores directos permiten implementar nuevos protocolos IPv4 en el espacio de usuario. Un socket raw permite recibir o envíar el datagrama crudo sin incluir cabeceras del nivel de enlace, aunque es el presente trabajo no se utiliza esta capacidad de socket raw.

La capa IPv4 genera una cabecera IP cuando se envía un paquete, a menos que se active la opción IP_HDRINCL en el conector. Cuando se activa, el paquete debe contener una cabecera IP. En la recepción, la cabecera IP siempre está incluida en el paquete.
Sólo los procesos con un identificador de usuario efectivo de 0 (root) o la capacidad CAP_NET_RAW pueden abrir conectores directos.

Un socket raw puede asociarse con un valor particular del campo Protocolo del paquete IP. De este modo, todos los paquetes que se reciban que tengan ese valor específico del protocolo se pasarán al conector directo. Cuando el protocolo que se especifica al conector es IPPROTO_RAW, necesariamente IP_HDRINCL está activo y, en ese caso, el conector recibe todos los paquetes independientemente del valor de protocolo. Los conectores directos pueden interceptar todos los protocolos IP de Linux, incluso protocolos como ICMP o TCP que poseen un módulo de protocolo dentro del núcleo.

Cuando se recibe un paquete nuevo, se pasa a cualquier socket raw que haya sido asociado a su protocolo. Posteriormente, el kernel también pasará dicho paquete a cualquier otro manejador de pueda existir de ese protocolo.

En este tipo de sockets, Linux nunca cambia las cabeceras pasadas por el usuario (salvo para rellenar algunos campos de valor 0 como se ha descrito en IP_HDRINCL). Esto es diferente de muchas otras implementaciones de conectores directos.

Tras esta breve introducción a los sockets raw, nos centraremos en la implementación del software que, utilizando estos conectores recientemente citados, construirá los paquetes y los enviará a la aplicación servidor.

Juan Martinez 2005-09-19