Bidirectional
和full-duplex
是不同的概念。例如,Ethernet
只是半双工,因为在特定时间,只有一个主机可以通过线路发送数据,并且它不能同时发送和接收数据 。
因此,当我们在以太网上使用TCP时,我认为TCP只是双向或半双工。
但是here它说TCP是全双工的。为什么呢?
答案 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)
这取决于您在考虑哪一层。在物理层上,取决于媒体,电子信号如何传输;如果从传输层考虑,它是全双工的,因为每个对等方都可以在需要的同时发送和接收。