Saltar al contenido

¿TCP es bidireccional o full-duplex?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *