1. Introducción a TCP/IP
La familia del protocolo TCP/IP es un protocolo utilizado por Internet y también puede usarse en redes privadas independientes.
La familia del protocolo TCP/IP incluye el protocolo IP, el protocolo TCP y el protocolo UDP.
El protocolo IP utiliza direcciones IP para distribuir paquetes, pero es un servicio de mejor esfuerzo, y los paquetes pueden perderse, fuera de servicio o repetirse. Los protocolos TCP y UDP agregan números de puerto al protocolo IP, estableciendo así una conexión transparente entre las aplicaciones de los dos hosts.
La diferencia es que el protocolo TCP corrige errores de capa IP, que establece conexiones entre hosts a través de mensajes de apretón de manos.
Luego, los errores en el mensaje se restablecen agregando un número de serie al mensaje. UDP simplemente extiende el protocolo IP.
Permitirle que funcione entre aplicaciones, no entre hosts.
Con respecto a las direcciones IP, un host puede tener múltiples interfaces de red, y una interfaz puede tener múltiples direcciones.
Algunas direcciones IP tienen usos especiales:
A. Dirección de backback: 127.0.0.1, siempre se asigna a una interfaz de bucle invertida, se usa principalmente para las pruebas.
B. Dirección privada: comenzando con 10, 192.168, 172. (16-31), utilizado para redes privadas. Cuando un dispositivo NAT reenvía un mensaje, asigna el par de puertos de direcciones privadas del mensaje en una interfaz en el par de puertos de direcciones públicas en otra interfaz. Esto permite a un pequeño grupo de hosts compartir un par de direcciones IP.
C. Dirección de multidifusión: el primer número es entre 224 y 239.
2. Conceptos básicos del socket
1. Obtener dirección
public static void main (string [] args) {try {enumeration <NetworkInterface> interfaces = networkInterface.getNetworkInterfaces (); while (interfaces.hasmoreelements ()) {networkInterface iface = interfaces.nextelement (); System.out.println ("interfaz:" + iface.getName ()); Enumeración <inetaddress> addrlist = iface.getInetAddresses (); if (! addrlist.hasmoreelements ()) system.out.println ("sin dirección"); while (addrlist.hasmoreElements ()) {inetAddress dirección = addrlist.nextelement (); System.out.println ("Dirección:" + dirección.gethostaddress ()); }}} Catch (SocketException e) {E.PrintStackTrace (); }}2. Programa de instancia de TCP
Cabe señalar que aunque solo se usa un método Write () para enviar cadenas en el lado del cliente, el lado del servidor también puede recibir esta información de múltiples bloques. Incluso si la cadena de retroalimentación se almacena en un bloque cuando el servidor regresa, puede ser TCP
El protocolo se divide en múltiples partes.
Tcpechoclienttest.java
public static void main (string [] args) lanza ioexception {string server = args [0]; byte [] data = args [1] .getBytes (); Int Port = 7; Socket Socket = nuevo socket (servidor, puerto); System.out.println ("conectado al servidor ..."); InputStream in = Socket.getInputStream (); OutputStream out = Socket.getOutputStream (); out.write (datos); int totalBytesrcvd = 0; int bytesrcvd; while (TotalBytesrcvd <data.length) {if ((bytesrcvd = in.read (data, totalBytesrcvd, data.length - totalBytesrcvd)) == -1) tire nueva socketexception ("conexión cerrada"); Totalbytesrcvd += bytesrcvd; } System.out.println ("Recibido:" + nueva cadena (datos)); socket.close (); }Tcpechoservertest.java
Private estático final int bufSize = 32; public static void main (string [] args) lanza IOException {Serversocket Serversocket = new Serversocket (7); int recvmSgSize; byte [] recibeBuf = new Byte [bufSize]; while (true) {socket socket = serversocket.accept (); System.out.println ("Handling Client" + "From Remote" + Socket.getRemotesocketAddress () + "en Local" + Socket.getLocalSocketAddress ()); InputStream in = Socket.getInputStream (); OutputStream out = Socket.getOutputStream (); while ((recvmSgSize = in.read (recibeBuf))! = -1) {out.write (recibeBuf, 0, RecvmSgSize); } socket.close (); }}Tenga en cuenta que el nuevo socket especifica el número de puerto al que el servidor remoto escucha sin especificar el puerto local, por lo que se utilizará la dirección predeterminada y el número de puerto disponible. En mi máquina, el puerto cliente es 4593, conectado al puerto 7 del servidor.
3. Programa de instancia de UDP
¿Por qué usar el protocolo UDP? Si la aplicación solo intercambia una pequeña cantidad de datos, la fase de establecimiento de la conexión TCP transmitirá al menos el doble de información (y el doble del tiempo de ida y vuelta).
Udpechoclienttest.java
public static void main (string [] args) lanza IoException {inetAddress serverAddress = inetaddress.getByName (args [0]); byte [] byTestosend = args [1] .getBytes (); Datagramsocket socket = new DataGramSocket (); socket.setSotimeOut (3000); DataGrampacket sendPacket = nuevo DataGrampacket (ByTestosend, ByTestosend.Length, ServerAddress, 7); DataGrampacket recibePacket = nuevo DataGrampacket (nuevo Byte [ByTestosend.Length], byTestosend.length); // Los paquetes pueden perderse, por lo que tenemos que seguir intentando int ties = 0; boolean recibeResponse = false; do {Socket.send (SendPacket); intente {Socket.Receive (RecibePacket); if (! recibePacket.getAddress (). Equals (ServerAddress)) tire nueva IOException ("Recibir de la fuente desconocida"); RecibeResponse = True; } catch (ioException e) {intenta ++; System.out.println ("Tiempo de espera, intente nuevamente"); }} while (! RecibeResponse && intenta <5); if (RecibeResponse) System.out.println ("Recibido:" + nueva cadena (recibePacket.getData ())); else System.out.println ("sin respuesta"); socket.close (); } Udpechoservertest.java
Private estático final int Echomax = 255; public static void main (string [] args) lanza IOException {dataGramSocket Socket = new DataGramSocket (7); Paquete de dataGrampacket = nuevo DataGrampacket (nuevo byte [Echomax], Echomax); while (true) {Socket.Receive (paquete); System.out.println ("Manejo del cliente en" + paquete.getaddress ()); socket.send (paquete); paquete.setLength (Echomax); }}Comparando este ejemplo con la instancia TCP anterior, existen las siguientes diferencias:
A.DataGramsocket no necesita especificar la dirección de destino cuando se crea, porque UDP no necesita establecer una conexión, y cada paquete de datos se puede enviar o recibir desde una dirección de destino diferente.
B. Si bloquea y espera a Read () como TCP, puede bloquearse allí para siempre, porque el protocolo UDP simplemente extiende el protocolo IP, y los paquetes UDP pueden perderse. Por lo tanto, debe establecer el tiempo de tiempo de espera para bloquear la espera.
El protocolo C.UDP conserva la información de límite del mensaje, y cada llamada Recibir () solo puede recibir los datos enviados por la llamada del método send () una vez.
D. Los datos máximos que puede transmitir un paquete UDP es 65507 bytes. Los bytes excesivos se descartarán automáticamente, y no hay un mensaje para el programa de recepción. Por lo tanto, es seguro establecer la matriz de caché en aproximadamente 65,000 bytes.
E. Si el método Recibe () se llama repetidamente con la misma instancia de DataGrampacket, la longitud interna del mensaje debe restablecerse explícitamente a la longitud real de la memoria caché antes de cada llamada.