Se criarmos um soquete de escuta, ele nos retornará um descritor (digamos o descritor raiz) e vincularemos esse descritor a um endereço. Sempre que uma nova conexão de cliente está disponível, o descritor raiz nos informa e aceitamos essa nova conexão e recebemos um descritor exclusivo (digamos, descritor de cliente) para cada cliente. A partir de agora podemos nos comunicar com esse cliente usando esse descritor. As informações do cliente são armazenadas em um inode separado, indicado pelo descritor do cliente. Devido a isso, o Linux foi capaz de entregar os respectivos dados do cliente para um respectivo descritor.
Se o que mencionei acima estiver correto (por favor, corrija-me se meu entendimento estiver errado), então tenho uma dúvida. Quais são as informações do cliente armazenadas no inode? Como o cliente é identificado exclusivamente pelo Linux?
Responder1
Os protocolos TCP/IP e UDP/IP conhecem uma “sessão” que é definida pelo endereço IP local e remoto e pela porta [1]. Um pacote TCP/IP, por exemplo, conterá endereço IP de origem e destino e porta [2]. Um servidor ou cliente (digamos, Firefox) que tenha mais de uma conexão aberta distinguirá na camada de sessão OSI [3] por endereço e porta.
Abra um shell e execute como root, enquanto usa um navegador da web
netstat -tulpan
para ver as conexões atuais e ativas [4].
Exemplo de saída:
# netstat -tulpan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1966/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1902/cupsd
tcp 0 0 192.168.1.16:57374 172.217.23.165:443 ESTABLISHED 4730/firefox-bin
tcp 0 0 192.168.1.16:55478 104.26.11.30:443 ESTABLISHED 4730/firefox-bin
udp 0 0 127.0.0.1:53 0.0.0.0:* 1996/named
As linhas mostram conexões "ESTABELECIDAS" pelo Firefox com portas locais diferentes para que o Firefox reconheça qual pacote é a resposta para qual solicitação.
Outras linhas com o estado LISTEN são programas locais executados como um processo de servidor, incluindo sshd
(Secure Shell Server), cupsd
(daemon de impressora) e named
(servidor de nomes Bind). Eles aceitarão conexões de entrada.
Referências para saber mais:
[1]https://en.wikipedia.org/wiki/Port_(rede_de_computadores)
[2]https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structureassim comohttps://en.wikipedia.org/wiki/IPv4_header#Header
Responder2
Ao fazer isso, listen
você especifica uma porta, pois a porta deve ser bem conhecida. Este terminal possui um IP (ou mais de um) e uma porta.
Ao fazer isso, connect
você especifica o IP e a porta do listen
servidor remoto. O IP local é determinado pelo sistema operacional e uma porta é atribuída (pode ser qualquer número).
A conexão pode ser identificada por ( (remote IP, remote port), (local IP, local port) )
Isso coloca um limite máximo de conexões de 64K para cada porta remota, a partir de qualquer endereço IP.