websockets una tutorial son socket que pudo example establecer error conexión sockets tcp duplex

una - sockets tcp



¿TCP es bidireccional o full-duplex? (5)

Bidirectional y full-duplex son conceptos diferentes. Por ejemplo, Ethernet solo es semidúplex porque en un momento específico, solo un host puede enviar datos a través del cable, y no puede enviar y recibir datos simultáneamente .

Entonces, cuando usamos TCP a través de Ethernet, creo que TCP es solo bidireccional o semidúplex.

Pero here dice que TCP es dúplex completo. ¿Por qué?


Al leer el artículo que publicaste, creo que está claro que están hablando de que TCP admite la comunicación full-duplex (el énfasis es mío):

[TCP] es un protocolo dúplex completo, lo que significa que cada conexión TCP admite un par de flujos de bytes, uno que fluye en cada dirección.


Ciertamente es bidireccional, ya que ambas partes envían / ​​reciben paquetes. ¿Qué quiere decir exactamente cuando pregunta si TCP es dúplex completo?

Tanto el envío como la recepción de paquetes tienen más que ver con el componente físico, mientras que TCP es un protocolo que define cómo se deben enmarcar y manejar los datos para alcanzar el destino.

El NIC (Controlador de interfaz de red) es responsable de enviar y recibir paquetes físicos y usted tendría que verificar allí las capacidades de half / full-duplex.

La conexión inalámbrica (802.11), por ejemplo, es semidúplex si utiliza la misma antena para enviar y recibir señales de radio.


La API TCP es dúplex completo. Esto significa que TCP API permite enviar datos desde ambos lados de la conexión al mismo tiempo. Veamos la fuente del programa de prueba a prueba:

#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> void do_write(const char* who, int socket) { const char hello[] = "hello!"; if( 0 < write(socket, hello, strlen(hello)) ) printf( "%s: write done ok/n", who ); else printf( "%s: write error: %s/n", who, strerror(errno) ); } void do_read(const char* who, int socket) { /* do parental things with this end, like reading the child''s message */ char buf[1024]; int n = read(socket, buf, sizeof(buf)); if( 0 < n ) printf("%s: received ''%.*s'' %db/n", who, n, buf, n); else if( 0 == n ) printf( "%s: no data available/n", who ); else printf( "%s: read error: %s/n", who, strerror(errno) ); } int main() { int fd[2]; static const int parent = 0; static const int child = 1; pid_t pid; socketpair(PF_LOCAL, SOCK_STREAM, 0, fd); pid = fork(); if (pid == 0) { /* child process */ close(fd[parent]); do_write("child", fd[child]); do_read("child", fd[child]); /* sleep(1); */ do_write("child", fd[child]); do_read("child", fd[child]); } else { /* parent process */ close(fd[child]); do_write("parent", fd[parent]); do_read("parent", fd[parent]); do_write("parent", fd[parent]); do_read("parent", fd[parent]); } return 0; }

La salida (en FreeBSD) es:

parent: write done ok child: write done ok child: received ''hello!'' 6b child: write done ok parent: received ''hello!hello!'' 12b parent: write done ok child: received ''hello!'' 6b parent: no data available

Por lo tanto, TCP API es dúplex completo y los datos pueden enviarse desde ambos lados al mismo tiempo. Creo que la implementación también es dúplex, pero es necesario escribir una prueba más complicada para reconocerla. Esto depende de la implementación, por supuesto. Y una buena implementación puede no tener efecto cuando al menos un enlace de la cadena de transporte no es dúplex completo.


Sí, una conexión TCP proporciona un servicio de dúplex completo. Vamos a entender el significado de dúplex completo. Significa intercambiar datos (enviar y recibir) entre dos entidades al mismo tiempo. Como TCP es un protocolo de capa de transporte y los protocolos de capa de transporte proporcionan una comunicación lógica entre procesos que se ejecutan en diferentes hosts, aquí también el significado de dúplex completo se encuentra en este sentido.

Aquí full-duplex significa "Si hay una conexión TCP entre el Proceso A en un host y el Proceso B en otro host, entonces los datos de la capa de aplicación pueden fluir desde el Proceso A al Proceso B al mismo tiempo que los datos de la capa de aplicación fluyen desde el Proceso B a Proceso A ". Una conexión TCP también es siempre punto a punto , es decir, entre un solo remitente y un único receptor. Recuerde, los datos del Proceso A aún deben pasar a través de las capas debajo de la capa de transporte, de manera similar, los datos del Proceso B pasarán a través de las capas debajo de la capa de transporte.

Fuente: Redes de Computadoras por Kurose, Ross.


Son ambos. Es bidireccional porque puede enviar datos en ambas direcciones, y es dúplex completo porque puede hacerlo simultáneamente, sin necesidad de cambios de línea, en el nivel de API.

Por supuesto, en un nivel inferior puede estar restringido por la capa física disponible.