0% acharam este documento útil (0 voto)
15 visualizações6 páginas

Sockets No Linux

Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
15 visualizações6 páginas

Sockets No Linux

Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Linux – Trabalhando com Sockets

Introdução

• Programação com sockets no Linux carrega informações fim-a-fim em conexões TCP/UDP.


• Os parâmetros que podem ser manipulados estão diretamente relacionados às camadas de
rede e de transporte.
• Na camada de rede, o socket precisa especificar se a conexão é IPv4 ou IPv6, então ele deve
ser setado para AF_INET e AF_INET6 respectivamente e também especificar se é TCP ou
UDP.
◦ O protocolo TCP é baseado em fluxo de dados, logo o socket precisa ser setado para
SOCK_STREAM, enquanto UDP é baseado em datagrama, então é setado para
SOCK_DGRAM.

TCP Socket
• O servidor TCP primeiramente precisa escutar alguma porta, usualmente chamando a função
bind primeiro e depois atribuindo um IP e PORTA ao SOCKET.
• Quando o servidor tem um IP e PORTA, ele poderá chamar a função listen
• No diagrama de estado TCP abaixo, ele está no estado listen. Quando essa função é acionada
o servidor fica em estado de “escuta” e o cliente pode iniciar uma conexão:

→ No Kernel duas filas são mantidas para cada socket. Uma delas é a fila que já tem uma conexão
estabelecida, o 3-way handshake foi completado e ela esta no estado “established”. A outra fila é a
que a conexão ainda não foi estabelecida, nesse momento o 3-way handshake ainda não está
completo e o estado é syn_rcvd

Após isso, o servidor chama a função accept e busca a conexão completa para processamento. Se
ela não esvier pronta, ele simplesmente aguarda.
Enquanto o servidor esta esperando, o cliente pode iniciar uma conexão através da função connect.
Primeiramente espcifica um enderço IP e número de porta para ser conectado dentro dos
parâmetros, e então, inicia o 3-way handshake. O Kernel por sua vez atribui ao cliente uma porta
aleatória. Uma vez que o handshake esteja completo, o servidor aceita e retornará um outro Socket.

Este é um ponto que só aparece nas entrelinhas, ou seja, existem dois Sockets que serão criados.
Um utilizado para monitorar as conexões de entrada (Socket listening) e outro usado para
transmissão de dados (Socket connected).

Após a conexão ser estabelecida com sucesso, ambas as partes iniciam a leitura e escrita de dados
através das funções read e write

Abaixo um trecho decódigo completo do lado do servidor e do lado do cliente:

Server

Client
Processo completo de chamada baseado no protocolo TCP:

É bem preciso afirmar que o Socket TCP é um fluxo de arquivo(file stream). Porque, Socket existe
na forma de arquivo no Linux. Além disso, existe também os descritores de arquivo (file
descriptors). Lendo e escrevendo, também através de descritores de arquivo.

No kernel, Socket é um arquivo, o qual corresponde a um descritor de arquivo. Cada processo


possui uma estrutura de dados (task_struct), a qual aponta para um array dos file descriptors, para
listar os descritores de todos os arquivos abertos pelo processo.

O conteúdo do array é um ponteiro para uma lista de todos os arquivos abertos no kernel. Como é
um arquivo ele terá um inode, mas o inode correspondente a um socket não é salvo no HD como um
arquivo comum do sistema, mas na memória.

Na estrutura abaixo, há duas filas principais, uma é a fila de envio e a outra a fila de recebimento.
Armazenado nessas duas filas está um cache (sk_buff). Esse cache pode ver a estrutura completa do
pacote. A completa estrutura de dados é como abaixo:
UDP Socket

Para UDP o processo é um pouco diferente, não é necessário o 3-way handshake e com isso não
precisamos chamar nem listen e nem connect.

No entanto, iterações UDP ainda necessitam de IP e número de Porta, então bind, é também
requerido. UDP não mantém o estado das conexões, não é necessário estabelecer uma série de
sockets para cada par de conexões, mas como há um socket, ele pode se comunicar com múltiplos
clientes.
O processo de chamada do programa com a função Socket baseado em UDP é como abaixo:

Server

Client
Limite do Socket

Após conhecer as funções básicas de Socket, podemos facilmente escrever um programa de iteração
com a rede.

Podemos nos perguntar, quantos sockets o servidor pode criar de forma simultânea. O sistema irá
utilizar uma quadra para identificar uma conexão TCP:

Em um servidor, para IPv4, o máximo número de clientes é 232 e o número máximo de portas
cliente é 216 , logo, o número máximo de conexões TCP para um único servidor é 248, no lado do
servidor. Todos os números acima são teóricos.

No entanto, o número máximo de conexões TCP concorrentes no servidor, está longe do limite
superior teórico. O primeiro limite sem dúvida é o limite do descritor de arquivo. O número de
descritores de arquivo deve ser setado para ulimit , o outro limitante é a memória do sistema.

Sobre descritores de arquivo:


[Link]
descriptors#:~:text=File%20descriptors%20or%20file%20handles,own%20set%20of%20open%20f
iles.

Você também pode gostar