2015-02-13 14 views
12

Bidirectional und full-duplex sind unterschiedliche Konzepte. Zum Beispiel ist der Ethernet nur Halbduplex, weil zu einer bestimmten Zeit nur ein Host Daten über die Leitung senden kann und gleichzeitig nicht senden und empfangen kann.Ist TCP bidirektional oder vollduplex?

Also, wenn wir TCP über ein Ethernet verwenden, denke ich, dass TCP nur bidirektional oder halbduplex ist.

Aber here es heißt TCP ist Vollduplex. Warum?

+4

Modernes Ethernet ist Vollduplex. –

+0

@YuHao Danke, aber was ist, wenn in einer alten Halbduplex-Ethernet-Umgebung? Wie könnte TCP dort passen? – smwikipedia

+0

TCP als 'Transport Layer Protocol' bietet einen bidirektionalen Kanal für die obere Schicht, ich denke, es sollte in diesem Kontext betrachtet werden. – sanjayk79

Antwort

12

Es ist sicherlich bidirektional, da beide Parteien Pakete senden/empfangen. Was genau meinen Sie, wenn Sie fragen, ob TCP Vollduplex ist?

Senden und Empfangen von Paketen zur gleichen Zeit hat mehr mit der physischen Komponente zu tun, während TCP ist ein Protokoll, das definiert, wie Daten eingerahmt und behandelt werden, um das Ziel zu erreichen.

Der NIC (Network Interface Controller) ist verantwortlich für das Senden und Empfangen von physischen Paketen und Sie müssten dort nach den Halb-/Vollduplexfähigkeiten suchen.

Drahtlos (802.11) ist zum Beispiel Halbduplex, wenn dieselbe Antenne zum Senden und Empfangen von Funksignalen verwendet wird.

+0

Danke. Also ich denke das Wort 'Duplex' ist nur * nicht anwendbar * auf TCP. Daher ist dieses Tutorial (http://ssfnet.org/Exchange/tcp/tcpTutorialNotes.html) NICHT genau zu sagen "TCP ist Full-Duplex". – smwikipedia

+2

Ich denke, dass sie sich auf die Tatsache beziehen, dass das TCP-Protokoll die Vollduplex-Kommunikation unterstützt. – razvanz

12

Es ist beides. Es ist bidirektional, da es Daten in beide Richtungen senden kann, und es ist Vollduplex, da es dies gleichzeitig ohne die Notwendigkeit von Leitungswiederholungen auf API-Ebene tun kann.

Natürlich kann es auf einer niedrigeren Ebene durch die verfügbare physikalische Schicht eingeschränkt werden.

3

Durch den Artikel zu lesen Sie auf dem Laufenden, ich denke, es ist klar, dass sie über TCP reden unterstützt Vollduplex-Kommunikation (Hervorhebung von mir):

[TCP] ist ein Vollduplex-Protokoll, was bedeutet, dass jede TCP-Verbindung ein Paar Byteströme unterstützt, von denen einer in jede Richtung fließt.

4

Die TCP-API ist Vollduplex. Dies bedeutet, dass die TCP-API es ermöglicht, Daten von beiden Seiten der Verbindung gleichzeitig zu senden. Lassen Sie uns die Quelle Beweis sehen:

#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; 
} 

Der Ausgang (auf FreeBSD) ist:

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 

So TCP-API ist Vollduplex und Daten können von beiden Seiten an die sended gleiche Zeit. Ich denke, dass die Implementierung auch Vollduplex ist, aber es muss komplizierter zu erkennender Test geschrieben werden. Dies ist natürlich abhängig von der Implementierung. Und eine gute Implementierung kann sich nicht auswirken, wenn mindestens eine Transportkettenverbindung nicht Vollduplex ist.

+0

Dies ist nicht die Quelle, es ist ein Testprogramm, das Sie geschrieben haben. – EJP

2

Ja, eine TCP-Verbindung bietet einen Vollduplex-Dienst. Lassen Sie uns die Bedeutung von Vollduplex verstehen. Es bedeutet, Daten (Senden und Empfangen) zwischen zwei Entitäten gleichzeitig auszutauschen. Da TCP ein Transport Layer Protocol und Transport Layer Protokolle für die logische Kommunikation zwischen Prozessen sind, die auf verschiedenen Hosts laufen, ist hier auch die Bedeutung von Vollduplex zu nennen.

Hier Vollduplex bedeutet „Wenn es eine TCP-Verbindung zwischen Prozeß A auf einem Host und Verfahren B auf einem anderen Host ist, dann werden die Daten der Anwendungsschicht von Verfahren A fließen kann B zur gleichen Zeit wie die Bearbeitung des Antrags Schichtdaten fließen von Prozess B zu Prozess A ". Eine TCP-Verbindung ist auch immer Punkt-zu-Punkt, dh zwischen einem einzelnen Sender und einem einzelnen Empfänger. Denken Sie daran, dass die Daten von Prozess A noch die Schichten unterhalb der Transportschicht durchlaufen müssen. Ähnlich werden die Daten von Prozess B durch Schichten unterhalb der Transportschicht geleitet.

Quelle: Computer Vernetzung von Kurose, Ross.

+0

Es sind keine separaten Hosts oder separate Prozesse erforderlich. – EJP