Diferencia entre revisiones de «Programación de comunicacións en rede con Java»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 173: Línea 173:
  
  
−
{| border="1" cellpadding="0" cellspacing="0" align="center" width="300" style="float:center; margin-left:1em; margin-bottom:1em;"
+
{| border="1" cellpadding="0" cellspacing="0" align="center" width="300" style="margin: 0 auto; text-align: center;"
 +
+Campos do datagrama UDP
 
!colspan="2" bgcolor="#DDDDDD"|Porto orixe
 
!colspan="2" bgcolor="#DDDDDD"|Porto orixe
 
!colspan="2" bgcolor="#DDDDDD"|Porto destino
 
!colspan="2" bgcolor="#DDDDDD"|Porto destino
Línea 180: Línea 181:
 
!colspan="2" bgcolor="#DDDDDD"|Checksum
 
!colspan="2" bgcolor="#DDDDDD"|Checksum
 
|}
 
|}
 +
 +
<br/>
  
 
{| class="wikitable" style="margin: 0 auto; text-align: center;"
 
{| class="wikitable" style="margin: 0 auto; text-align: center;"
Línea 189: Línea 192:
 
! 0
 
! 0
 
| colspan="16" bgcolor="#FFDDDD"|Porto orixen
 
| colspan="16" bgcolor="#FFDDDD"|Porto orixen
−
| colspan="16"|Puerto destino
+
| colspan="16"|Porto destino
 
|- align="center"
 
|- align="center"
 
! 32
 
! 32

Revisión del 18:33 23 sep 2021

Comunicaciones en rede

O paquete java.net proporciona clases que permiten levar a cabo comunicaciíns entre procesos utilizando os protocolos estándares da familia de TCP/IP. Pode dividirse en dúas seccións:

  1. Clases de baixo nivel que permiten representar as principales entidades dos niveles de enlace, rede e transporte;
  2. Clases de alto nivel relacionadas con protocolos de nivel de aplicación

Comezaremos revisando as clases para interfaces de rede e enderezos IP, para despois progresar en algocentral nas comunicacións en rede: a programación de sockets de UDP e de TCP, cos que se desenvolverán programas servidores e clientes que se comunican utilizando os devanditos protocolos de transporte UDP e TCP; e que se pode considerar que implementan sencillos protocolos de nivel de aplicación.

Clases de baixo nivel do paquete java.net
Interfaces de rede NetworkInterface: interfaz de rede
Enderezos IP InetAddress: enderezo IP
Inet4Address: enderezo IPv
Inet6Address: enderezo IPv6
InterfaceAddress:enderezo IP máis información relativa á rede á que pertenece a interfaz
Sockets Socket: socket TCP de cliente, para conectar cun proceso servidor mediante TCP
ServerSocket: socket TCP de servidor, que acepta conexións desde un socket de cliente mediante TCP.
DatagramSocket: socket de UDP, que se usa para enviar e recibir datagramas de UDP

Interfaces de rede

As interfaces de red presentes no sistema podense amosar cos comandos:

  • ifconfig ou ip en Linux
  • ipconfig en Windows.

A clase NetworkInterface ten métodos estáticos que permiten obter unha enumeración de todas as interfaces de rede ou NetworkInterface existentes no sistema.

Una NetworkInterface pode ter máis dunha configuración IP asociada,e normalmente cando menos unha para IPv4 e outra para IPv6. Con distintos métodos da clase podense obter para cada unha obxectos de tipo InterfaceAddress e InetAddress.

A clase InterfaceAddress proporciona información adicional a InetAddress coma por exemplo a lonxitude da máscara de rede ou o enderezo de broadcast da rede á que pertence (para un enderezo IPv4).

Na táboa explicanse alguns dos métodos de NetworkInterface.

Métodos da clase NetworkInterface
Método Funcionalidade
static Enumeration<NetworkInterface> getNetworkInterfaces() Devolve todas as interfaces de rede existentes na máquina.
A partir do Enumeration pódese obter un Iterator para iterar sobre elas.
String getDisplayName()
String getName()
Devuelven o nome da interfaz
byte[] getHardwareAddress() Devolve o enderezo MAC en forma de array de 6 bytes (48 bits).
Enumeration<InetAddress> getInetAddresses()
List<InterfaceAddress> getInterfaceAddresses()
Devolven os enderezos IP asociados á interfaz. Será en xeral cando menos un enderezo IPv4 e un IPv6.


Un obxecto InterfaceAddress proporciona máis información que InetAddress. Por exemplo:

  • a lonxitude da máscara de rede
  • o enderezo de broadcast para a redhe á que pertence a interfaz (para IPv4).
boolean isLoopback() Determina se unha interfaz é de tipo loopback.

O exemplo permitirache familiarizarte co entorno de rede no que está integrado o teu ordenador; o coñecemento poderá ser de utilidade para crear programas que se comuniquen con outros desenvoltos por outros compañeiros, utilizando os protocolos de transporte UDP e TCP.

Exemplo con programa que amosa información das interfaces de rede

Aquí está o código dun programa que amosa información de todas as interfaces de rede presentes no sistema.

Amosa información da súa configuración para IPv4 e IPv6 (enderezos IP, máscaras de rede, enderezos de broadcast, etc).

Cuestións. 
Antes de executar o programa asegúrate de que o equipo ten conexión a internet ou a unha rede local. 
¿En qué cambia a saída do programa cando se desconecta o cable de rede ou se desactiva a interfaz de rede desde o sistema operativo? 
¿Para qué tipos de interfaces se amosa información? 
¿Hay alguna que esté sempre activa? ¿Cal? ¿Por qué?

Enderezos IP

Unha interfaz de rede pode ter configurada un ou varios enderezos IPv4 e un ou varios enderezos IPv6; e cada un cos seus correspondentes máscaras de rede.

As clases que permiten xestionar esta información:

  • InterfaceAddress: Representa a configuración IP dunha interfaz. Esto inclúe o enderezo IP e parámetros adicionais:
    • Lonxitude da máscara de rede (número de bits que no enderezo IP especifican a rede)
    • Cando se trata dun enderezo IPv4, enderezo de broadcast para a rede á que pertence a interfaz
  • InetAddress: Representa un enderezo IP. Ten dúas subclases para representar enderezos IPv4 e IPv6:
    • Inet4Address
    • Inet6Address

A clase InterfaceAddresss es muy sencilla y sus principales métodos se muestran en el cuadro 3.6. Para entender mejor su funcionamiento, hay que tener en cuenta que representa la conguración para IP de una interfaz de red. Por lo tanto, puede corresponder a cualquiera de las versiones de este protocolo, IPv4 o IPv6. Tiene un método para obtener la dirección IP y métodos adicionales para obtener otros parámetros de la conguración.

Métodos da clase InterfaceAddress
Método Funcionalidade
InetAddress getAddress() Devolve o enderezo IP.
short getNetworkPrefixLength() Devolve a lonxitude da máscara de rede (o número de bits dentro do enderezo IP que especifican a rede
InetAddress getBroadcast() Devoelve o enderezo de broadcast para a rede á que pertence o enderezo IP (so no caso de que se trate dun enderezo de IPv4; con enderezo de IPv6 devolve null

A clase InetAddress ten toda a funcionalidade precisa para realizar calquer tipo de operación sen preocuparse de se o enderezo IP é de IPv4 o IPv6; porén na práctica non adoitan utilizarseas súas subclases Inet4Address e Inet6Address.

A táboa amosa algúns métodos desta clase. Ten ademáis algúns métodos estáticos para resolución de nombres que se verán ne seguinte sección

Métodos da clase InetAddress
Método Funcionalidade
static InetAddress getByName(String host) Obten unha InetAddress para o host. En host pódese proporcionar un enderezo IP (analízase e valçidase o enderezo IP e obtense un obxecto de clase Inet4Address ou Inet6Address) ou un nome de host (utilizarase o mecanismo de resolución de nomes para obter un enderezo IP)
String getHostAddress() Devolve a representación textual do enderezo IP
byte[] getAddress() Devolve un array cos bytes que compoñen o enderezo IP (4 con IPv4 e 16 con IPv6)
static InetAddress getByAddress(byte[] addr) Devolve unha InetAddress para o enderezo IP dado, especificado como un array de bytes
boolean isReachable(int timeout) Determina se o enderezo é alcanzable, especificando un tempo máximo de espera (timeout) en milisegundos
boolean isSiteLocalAddress() Determina se é enderezo é local ou privado. Os rangos de enderezos para redes privadas especifícanse na RFC 1918. As redes privadas de clase C para IPv4 (as máis frecuentes) son 192.168.X.0/24, con 0 <= X <= 255
boolean isLoopbackAddress() Determina se o enderezo IP é dunha interfaz de tipo loopback
static InetAddress getLoopbackAddress() Devolve o enderezo de loopback:
  • 127.0.0.1 para IPv4 (en realidade segundo os estándares de internet é calquera da forma 127/8; isto é, cos 8 primeiros bits formando o valor 127, coa forma 127.*.*.*)
  •  ::1 para IPv6

Resolución de nomes

A clase InetAddress ten métodos estáticos:

  • que realizan resolución de nomes: dado un nome, permiten obtener o enderezo IP asociado.
  • que realizan resolución inversa de nomes: permiten obter un nome de host a partir do seu enderezo IP.
Métodos da clase InetAddress relacionados con resolución denomes
Método Funcionalidade
static InetAddress getByName(String host) Obten un enderezo IP a partir dun nome de host, utilizando servizos de resolución de nomes ou ben a partir dunha representación textual dun enderezo IP
static InetAddress[] getAllByName(String host) Similar o método anterior pero máis completo; devolve un array con todos os enderezos IP que se pueden obter utilizando servizos de resolución de nomes; tamén se pode especificar o host mediante a representación textual dun enderezo IPv4 ou IPv6
public String getHostName() Este método permite realizar unha resolución inversa de nome: obter un nome de host a partir do seu enderezo IP. Se a InetAddress creouse sen especificar un nome para o host, enton realízase unha resolución inversa de nomes para obter o nome do host a partir do seu enderezo IP.
static InetAddress getByAddress (String host, byte[] addr) Crea unha InetAddress indicando un enderezo IP e un nome de host. Devolve o nome proporcionado ó crear a InetAddress sen realizar resolución inversa de nomes
String getCanonicalHostName() Devuelve o nome de host canónico ou FQDN (fully qualified domain name) utilizando o protocolo DNS para obter esta información.
static InetAddress getLocalHost() Devolve o enderezo IP do propio host. En Linux normalmente obtense o seu nome de /etc/hostname , e resolvese o nome para obter un enderezo IP. Dependendo do sistema poderíase obter o enderezo da interfaz de loopback, un enderezo IP privado pertencente á rede local, ou incluso unha IP externa ou pública. Se non se pode resolver este nombre, lánzase unha excepción de tipo UnknownHostException
Tarefa
Crea un programa que amose o nome e enderezo IP do propio host utilizando o método getLocalHost.

Sockets UDP

O protocolo de transporte UDP non é orientado a conexión. So permite o envío de paquetes de datos individuales chamados datagramas. Estos poden chegar en orde distinto a orden en que se enviaron, e incluso non chegar. Neste sentido, o protocolo de transporte UDP non aporta ningún valor engadido ó servizo de envío de datagramas IP proporcionado polo nivel de rede (ou de internet).

Un datagrama de UDP está encapsulado nun datagrama de IP, como se amosa na figura. Cada liña amosa 4 bytes. Arriba amosanse nunha regra os bits do 0 ó 31.


+Campos do datagrama UDP
Porto orixe Porto destino
Lonxitude da mensaxe Checksum


Bits 0 - 15 16 - 31
0 Porto orixen Porto destino
32 Lonxitude da mensaxe Suma de verificación
64  
Datos
 

A cabecera UDP consta de 4 campos dos cales 2 son opcionais (con fondo vermello na táboa). Os campos dos portos orixen e destino son campos de 16 bits que identifican o proceso de emisión e recepción. Xa que UDP carece dun servidor de estado e a orixe UDP non solicita respostas, o puerto orixen é opcional; en caso de non ser utilizado, o porto orixen debe ser posto a cero.

Pódese ver que o conxunto dun datagrama de UDP encapsulado nun datagrama de IP conten, ademáis dos datos que se envían do proceso de orixe ó de destino, o enderezo IP e o porto de orixe e o enderezo IP e porto de destino; toda a información necesaria para que os datos cheguen o seu destino e toda a información necesaria para que o proceso que o recibe poida enviar datagramas como resposta ó proceso de orixe. A comunicación entre dous procesos mediante o protocolo UDP é moi similar á comunicación entre dúas personas.

Sockets TCP

Creditos e referencias