web-dev-qa-db-fra.com

TCP bidirectionnel ou duplex intégral?

Bidirectional et full-duplex sont des concepts différents. Par exemple, le Ethernet n'est que semi-duplex car à un moment précis, un seul hôte peut envoyer des données sur le câble, et il ne peut pas envoyer et recevoir des données simultanément .

Donc, lorsque nous utilisons TCP sur un Ethernet, je pense que TCP n'est que bidirectionnel ou semi-duplex).

Mais ici il dit TCP est en duplex intégral. Pourquoi?

26
smwikipedia

C'est certainement bidirectionnel, car les deux parties envoient/reçoivent des paquets. Que voulez-vous dire exactement lorsque vous demandez si TCP est en duplex intégral?

L'envoi et la réception de paquets en même temps a plus à voir avec le composant physique, tandis que TCP est un protocole définissant comment les données doivent être encadrées et traitées afin de atteindre la destination.

Le NIC (contrôleur d'interface réseau) est responsable de l'envoi et de la réception des paquets physiques et vous devrez y vérifier les capacités semi-duplex/full-duplex.

Le sans fil (802.11), par exemple, est semi-duplex s'il utilise la même antenne pour envoyer et recevoir un signal radio.

20
Razvan

C'est les deux. Il est bidirectionnel car il peut envoyer des données dans les deux sens, et il est en duplex intégral car il peut le faire simultanément, sans nécessiter de retournement de ligne, au niveau de l'API.

Bien entendu, à un niveau inférieur, il peut être limité par la couche physique disponible.

20
user207421

L'API TCP est en duplex intégral. Cela signifie que l'API TCP permet d'envoyer des données des deux côtés de la connexion en même temps. Voyons la source du test.) programme pour prouver:

#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 sortie (sur FreeBSD) est:

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

Donc TCP est en duplex intégral et les données peuvent être envoyées des deux côtés en même temps. Je pense que l'implémentation est également en duplex intégral, mais elle doit écrire un test plus compliqué à reconnaître. Bien entendu, cela dépend de l'implémentation et une bonne implémentation peut ne pas avoir d'effet lorsqu'au moins un maillon de la chaîne de transport n'est pas en duplex intégral.

7
oklas

En lisant l'article que vous avez publié, je pense qu'il est clair qu'ils parlent de TCP supportant la communication full-duplex (c'est moi qui souligne):

[TCP] est un protocole duplex intégral, ce qui signifie que chaque TCP prend en charge une paire de flux d'octets, un qui coule dans chaque direction).

4
Agis

Oui, une connexion TCP fournit un service duplex intégral. Comprenons la signification du duplex intégral. Cela signifie échanger des données (envoi et réception) entre deux entités en même temps. Comme TCP est un protocole de couche transport et que les protocoles de couche transport fournissent une communication logique entre les processus exécutés sur différents hôtes, ici aussi la signification du duplex intégral est à cet égard.

Ici duplex intégral signifie "S'il y a une connexion TCP entre le processus A sur un hôte et le processus B sur un autre hôte, les données de la couche application peuvent provenir du processus A vers le processus B en même temps que les données de la couche application passent du processus B vers le processus A ". Une connexion TCP est également toujours point à point, qui est, entre un seul expéditeur et un seul destinataire. N'oubliez pas que les données du processus A doivent encore traverser les couches sous la couche de transport, de même les données du processus B passeront à travers les couches sous la couche de transport.

Source: Réseaux informatiques par Kurose, Ross.

3
Abhishek Sharma

cela dépend de la couche à laquelle vous pensez. Sur la couche physique, cela dépend des médias, de la façon dont les signaux électriques sont transmis; si vous pensez de la couche transport, c'est du full duplex, car chaque pair peut envoyer et recevoir en même temps s'il le souhaite.

1
codewarrior