Indagamos por todo internet para de este modo traerte la respuesta para tu problema, si tienes preguntas puedes dejar la inquietud y responderemos con gusto, porque estamos para servirte.
Solución:
Son ambos. Es bidireccional porque puede enviar datos en ambas direcciones y es full-duplex porque puede hacerlo simultáneamente, sin necesidad de cambios de línea, a nivel de API.
Por supuesto, en un nivel inferior puede estar restringido por la capa física disponible.
Ciertamente es bidireccional, ya que ambas partes envían/reciben paquetes. ¿Qué quiere decir exactamente cuando pregunta si TCP es full-duplex?
Tanto el envío como la recepción de paquetes. al mismo tiempo tiene 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 llegar al destino.
El NIC (controlador de interfaz de red) es responsable de enviar y recibir paquetes físicos y tendría que verificar allí las capacidades de dúplex medio / completo.
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 de TCP es full-duplex. Esto significa que la API TCP permite enviar datos desde ambos lados de la conexión al mismo tiempo. Veamos la fuente del programa de prueba para probar:
#include
#include
#include
#include
#include
#include
void do_write(const char* who, int socket)
const char hello[] = "hello!";
if( 0 < write(socket, hello, strlen(hello)) )
printf( "%s: write done okn", who );
else
printf( "%s: write error: %sn", 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' %dbn", who, n, buf, n);
else if( 0 == n )
printf( "%s: no data availablen", who );
else
printf( "%s: read error: %sn", 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, la API de TCP es dúplex completo y los datos pueden enviarse desde ambos lados al mismo tiempo. Creo que la implementación también es full-duplex, pero necesita escribir una prueba más complicada para reconocer. Esto depende de la implementación, por supuesto. Y una buena implementación puede no tener efecto cuando al menos un eslabón de la cadena de transporte no es full-duplex.
Sección de Reseñas y Valoraciones
Recuerda dar difusión a esta crónica si te fue útil.