TCP双向还是全双工?

时间:2015-02-13 07:52:43

标签: sockets tcp duplex

Bidirectionalfull-duplex是不同的概念。例如,Ethernet只是半双工,因为在特定时间,只有一个主机可以通过线路发送数据,并且它不能同时发送和接收数据

因此,当我们在以太网上使用TCP时,我认为TCP只是双向或半双工。

但是here它说TCP是全双工的。为什么呢?

6 个答案:

答案 0 :(得分:20)

两者都是。它是双向的,因为它可以在两个方向上发送数据,并且它是全双工的,因为它可以在API级别同时执行此操作,而无需线路转换。

当然,在较低级别,它可能会受到可用物理层的限制。

答案 1 :(得分:18)

它确实是双向的,因为双方都发送/接收数据包。当您询问TCP是否为全双工时,您究竟是什么意思?

同时发送和接收数据包 更多地与物理组件有关,而TCP是一种协议,用于定义如何构建和处理数据以便到达目的地。

NIC(网络接口控制器)负责发送和接收物理数据包,您必须检查有关半/全双工功能的信息。

如果无线(802.11)使用相同的天线发送和接收无线电信号,则它是半双工的。

答案 2 :(得分:6)

TCP API是全双工的。这意味着TCP API允许同时从连接的两端发送数据。让我们看一下测试程序的来源来证明:

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

输出(在FreeBSD上)是:

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

因此TCP API是全双工的,并且可以同时从两侧发送数据。我认为实现也是全双工,但它需要编写更复杂的测试来识别。这当然取决于实现。当至少一个传输链路不是全双工时,良好的实施可能不会产生影响。

答案 3 :(得分:4)

通过阅读您发布的文章,我认为很明显他们正在谈论TCP 支持全双工通信(强调我的):

  

[TCP]是一种全双工协议,这意味着每个TCP连接支持一对字节流,每个字节流在每个方向流动。

答案 4 :(得分:3)

是的,TCP连接提供全双工服务。让我们理解全双工的含义。这意味着同时在两个实体之间交换数据(发送和接收)。由于TCP是传输层协议,传输层协议提供在不同主机上运行的进程之间的逻辑通信,因此在这方面全双工的含义也是如此。

此处全双工表示“如果一台主机上的进程A与另一台主机上的进程B之间存在TCP连接,则应用程序层数据可以从进程A流向进程B同时,应用程序层数据从进程B流向进程A“。 TCP连接也总是点对点,即在单个发送者和单个发送者之间接收器。请记住,来自流程A的数据尚未通过传输层下的层,类似地,流程B中的数据将通过传输层下的层。

来源: Kurose,Ross的计算机网络。

答案 5 :(得分:1)

这取决于您在考虑哪一层。在物理层上,取决于媒体,电子信号如何传输;如果从传输层考虑,它是全双工的,因为每个对等方都可以在需要的同时发送和接收。