Cómo implementar el transporte TCP y UDP
¿Qué es TCP?
TCP: Protocolo de control de transmisión TCP es una capa de transporte orientada a la conexión (orientada a la conexión), confiable y basada en flujo de bytes. TCP es un protocolo de comunicación orientado a la conexión (capa de transporte basada en flujo de bytes, confiable y orientada a la conexión) como se especifica en IETF RFC 793. En el modelo OSI simplificado de redes informáticas, cumple las funciones especificadas por la cuarta capa de transporte. La capa de aplicación envía un flujo de datos en bytes de 8 bits a la capa TCP para su transmisión entre redes, y luego la capa TCP divide el flujo de datos en segmentos de información de longitud adecuada (generalmente sujetos al límite máximo de transmisión de la capa de enlace de datos de límite de unidades (MTU) de la red a la que está conectado el ordenador). Luego, TCP pasa el paquete resultante a la capa IP, que a su vez transmite el paquete a través de la red a la capa TCP de la entidad receptora. TCP asigna un número de secuencia a cada byte para garantizar que los paquetes no se pierdan, y el número de secuencia garantiza que los paquetes transmitidos a la entidad receptora se reciban en orden. Luego, la entidad receptora devuelve un acuse de recibo (ACK) para los bytes recibidos exitosamente; si la entidad emisora no recibe un acuse de recibo dentro de un retraso de ida y vuelta razonable (RTT), los datos correspondientes se retransmiten (asumiendo pérdida de datos).
En primer lugar, después de que TCP establece una conexión, ambas partes comunicantes pueden transmitir datos al mismo tiempo; en segundo lugar, es full-duplex; se utilizan mecanismos de retransmisión de tiempo de espera y confirmación a cuestas para garantizar la confiabilidad.
En términos de control de flujo, se utiliza el protocolo de ventana deslizante [1], que estipula que los paquetes de datos no reconocidos dentro de la ventana deben retransmitirse.
En términos de control de congestión, se utiliza el algoritmo de inicio lento.
¿Qué es UDP?
UDP es la abreviatura de User Datagram Protocol. Es un protocolo de capa de transporte sin conexión en el modelo de referencia OSI y proporciona servicios de mensajería orientados a transacciones, simples y poco confiables. IETF RFC 768 es la especificación oficial para UDP. Se utiliza en redes como el protocolo TCP para procesar paquetes. En el modelo OSI, UDP se ubica en la capa 4, la capa de transporte, que es la capa superior del protocolo IP. La desventaja de UDP es que no proporciona agrupación, ensamblaje o clasificación de paquetes de datos. Es decir, cuando se envía la información, no hay forma de saber si llegó de forma segura y completa. UDP se utiliza para admitir aplicaciones de red que necesitan transferir datos entre computadoras. Una gran cantidad de aplicaciones de red modelo cliente/servidor, incluidos los sistemas de videoconferencia en red, requieren el uso del protocolo UDP. Este protocolo se ha utilizado durante muchos años. Aunque su brillo inicial se ha visto eclipsado por protocolos similares, UDP sigue siendo muy utilizado. protocolo útil hasta el día de hoy y protocolos de capa de transporte de red factibles.
Al igual que el conocido protocolo TCP (Protocolo de control de transmisión), UDP se encuentra directamente encima del protocolo IP (Protocolo de Internet). Según el modelo de referencia OSI (Open Systems Interconnection), tanto UDP como TCP son protocolos de capa de transporte.
La función principal del protocolo UDP es comprimir el tráfico de datos de la red en forma de datagramas. Un datagrama típico es una unidad de transmisión de datos binarios. Los primeros 8 bytes de cada datagrama se utilizan para contener información del encabezado y los bytes restantes se utilizan para contener los datos específicos que se transmiten.
TCP y UDP se utilizan en Android exactamente igual que en Java.
Primero, echemos un vistazo a la conexión TCP. La siguiente figura es un diagrama esquemático de la conexión TCP:
Principio de transmisión TCP
¿Es usted? ¿Sabes esto muy bien? No diré mucho más, ¡solo mira el código! La práctica trae el verdadero conocimiento.
Código del lado del servidor TCP:
try { Boolean endFlag = false; ServerSocket ss = new ServerSocket(12345); while (!endFlag) { // espera la conexión del cliente Socket s; = ss.accept( ); BufferedReader input = new BufferedReader(newInputStreamReader(s. getInputStream()); while (!getInputStream()); // Tenga en cuenta que cuando el segundo parámetro es verdadero, se actualizará automáticamente; de lo contrario, la salida necesita ser operado manualmente. readLine(); Log .d("Demostración de TCP", "Mensaje del cliente: "+ mensaje.println("¡mensaje recibido!"); //output.flush(); mensaje)){ endFlag=true; } s.close(); } ss.close(); } catch (UnknownHostException e) { e.printStackTrace() } catch (IOException e) { e.printStackTrace(); /p>
Código de cliente TCP:
try { Socket s = new Socket("localhost", 12345); // redirección de flujo saliente al socket OutputStream out = s.getOutputStream(); Tenga en cuenta que si el segundo parámetro es verdadero, se actualizará automáticamente; de lo contrario, será necesario actualizarlo manualmente. println("¡Hola IdeasAndroid!"); entrada BufferedReader = new BufferedReader( newInputStreamReader(s .getInputStream())); // leer línea(s) Mensaje de cadena = input.readLine(); "mensaje del servidor:" + mensaje ); s.close() } catch (UnknownHostException e) { e.printStackTrace() } catch (IOException e) { e.printStackTrace(); Ahora verá una nueva transmisión.
Ahora echemos un vistazo a UDP:
Principio de transmisión UDP
Código del lado del servidor UDP:
// Escucha del servidor UDP PortInteger port = 12345; // El tamaño del byte recibido, los bytes enviados por el cliente no pueden exceder este tamaño byte[] message = new byte[1024]; try { //Crear una conexión de socket DatagramSocket datagramSocket = new DatagramSocket( port); DatagramPacket datagramPacket = new DatagramPacket(message, message.length); try { while true, message.length // El tamaño de los bytes recibidos, los bytes enviados por el cliente no pueden exceder la longitud del tamaño try { while (true) { // prepararse para recibir datos datagramSocket.receive(datagramPacket); Log.d("UDP Demo", datagramPacket.getAddress() .getHostAddress().toString()) + ":" + new String(datagramPacket.getData ()) ); } } catch (IOException e).} catch (IOException e) { e.printStackTrace(); }}} catch (SocketException e) { e.printStackTrace();
Código de cliente UDP; :
envío vacío estático público (mensaje de cadena) { mensaje = (mensaje == nulo? "¡Hola IdeasAndroid!": mensaje int server_port = 12345 DatagramSocket s = null; (); } catch (SocketException e) { e. printStackTrace(); } }InetAddress local = null; try { // Reemplazar con IP del lado del servidor = InetAddress.getByName("localhost"); { e. printStackTrace(); } int msg_length = message.length(); byte[] messagemessageByte = message.getBytes(); DatagramPacket p = new DatagramPacket( messageByte, msg_length, local, server_port); ); } catch (IOException e) { e.printStackTrace(); } }.}
Los lugares que necesitan atención en el código han sido comentados. ¡Espero que este artículo le sea útil! ¡Ayudate!