Um soquete bruto é um soquete rede ( AF_INET
ou AF_INET6
normalmente). Ele pode ser usado para criar pacotes IP brutos que podem ser usados para solução de problemas ou para implementar sua própria implementação de TCP sem usar SOCK_STREAM
:
Raw sockets allow new IPv4 protocols to be implemented in user space. A raw socket receives or sends the raw datagram not including link level headers. [
raw(7)
]
Ferramentas como nmap
usam soquetes brutos para interromper o handshake TCP após oSYN
inicial, SYN-ACK
, pois a conexão TCP nunca foi completamente estabelecida. Como um soquete de rede, ele usa sockaddr_in
para endereços.
No entanto, a criação de soquetes brutos é geralmente restrita. Somente processos privilegiados podem criá-los.
Um socket unix por outro lado é não um socket de rede ( AF_UNIX
). É um soquete local :
The
AF_UNIX
(also known asAF_LOCAL
) socket family is used to communicate between processes on the same machine efficiently. [unix(7)
]
Ele usa outra estrutura de endereço ( sockaddr_un
). É uma maneira comum de implementar a comunicação bidirecional em um único sistema para comunicação entre processos sem passando pela camada de rede.
E os pacotes sockets são pacotes brutos no nível driver :
Packet sockets are used to receive or send raw packets at the device driver (OSI Layer 2) level. They allow the user to implement protocol modules in user space on top of the physical layer. [
packet(7)
]
Os outros sockets atuam na camada network (OSI Layer 3) ou superior. Nesse ponto, você está falando diretamente com o driver da sua interface de rede.
Para obter mais informações, consulte socket(2)
, ip(7)
, packet(7)
, raw(7)
, socket(7)
e unix(7)
.