BSD Sockets
Sockets, o que é?
Especificamente em computação, um soquete pode ser usado em ligações de redes de computadores para um fim de um elo bidirecional de comunicação entre dois programas.
A interface padronizada de soquetes surgiu originalmente no sistema operacional Unix BSD (Berkeley Software Distribution); portanto, eles são muitas vezes chamados de Berkeley Sockets. É também uma abstração computacional que mapeia diretamente a uma porta de transporte (TCP ou UDP) e mais um endereço de rede. Com esse conceito é possível identificar unicamente um aplicativo ou servidor na rede de comunicação IP. Isso segundo wikipédia, mas vamos a algo concreto.
- Um socket identifica univocamente um usuário TCP;
- Permite a associação entre processos de aplicação;
- O identificador da porta é concatenado ao endereço IP, onde a entidade TCP está rodando, definindo um socket.
Função socket(), exemplo de uso:
socket (família, tipo, protocolo);
O nome de um socket sempre está relacionado a um espaço de nomes, também chamado de domínio (socket domain). Cada espaço de nomes é definido por uma macro na forma PF_* (que vem do termo Protocol Family). Os principais espaços de nomes em uso no UNIX são:
- PF_LOCAL: indica o espaço de nomes local, no qual os nomes de sockets são válidos somente no escopo do computador local. As macros PF_UNIX e PF_FILE são sinônimos desse espaço de nomes.
- PF_INET: indica o espaço de nomes IPv4 e seus protocolos associados.
- PF_INET6: indica o espaço de nomes IPv6 e seus protocolos associados.
Além dos acima, outros espaços de nome estão disponíveis, embora sejam de uso menos frequente: PF_NS (protocolos Xerox NS), PF_ISO (protocolos OSI/ISO), PF_CCITT (protocolos do CCITT), PF_IMPLINK (Internet Message Processors), PF_ROUTE (protocolos de roteamento) etc.
Para cada espaço de nomes, uma macro correspondente AF_* define o formato dos endereços para aquele espaço "família": PF_UNIX, PF_LOCAL, PF_INET, PF_INET6, PF_IPX, PF_NETLINK, PF_X25, PF_AX25, PF_ATMPVC, PF_APPLETALK, PF_PACKET, AF_INET, AF_UNIX, AF_ISO, AF_NS...
Os sockets são divididos em "tipos". São eles:
SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET, SOCK_RAW, SOCK_RDM, SOCK_PACKET
| | |
TCP_________/ | |
UDP______________________/ |
famoso raw sockets _________________________________/
- SOCK_STREAM: Fornece sequencial, seguro, e em ambos os sentidos, conexões baseadas em "byte streams". Dados "out-of-band" do mecanismo de transmissão devem ser suportados. O protocolo TCP é baseado neste tipo de socket.
- SOCK_DGRAM: Suporta diagrama de dados (baixa conexão, mensagens inconfiáveis de um comprimento máximo fixo). O protocolo UDP é baseado neste tipo de socket.
- SOCK_SEQPACKET: Fornece um sequencial, seguro, e em duas direções de tipos de conexões para transmissão de dados endereçados para o diagrama de dados de comprimento máximo fixo; um consumidor é requerido para ler um pacote inteiro com cada chamada de leitura.
- SOCK_RAW: Fornece um protocolo de rede de acesso rápido. Este tipo especial de socket pode ser usado manualmente para construir algum tipo de protocolo. Um uso comum para esse tipo de socket é desempenhar requisições ICMP (como ping, traceroute etc).
- SOCK_RDM: Fornece uma camada seguro que não garante ordenação. Isso é comumente não implementado no seu sistema operacional.
Tipos de protocolo:
ip 0 IP # internet protocol, pseudo protocol number
icmp 1 ICMP # internet control message protocol
igmp 2 IGMP # internet group multicast protocol
ggp 3 GGP # gateway-gateway protocol
tcp 6 TCP # transmission control protocol
pup 12 PUP # PARC universal packet protocol
udp 17 UDP # user datagram protocol
idp 22 IDP # WhatsThis?
raw 255 RAW # RAW IP interface