Является ли TCP двунаправленным или полнодуплексным?
Bidirectional
и full-duplex
- разные понятия. Например, Ethernet
является только полудуплексным, потому что в определенное время только один хост может отправлять данные по проводу, и он не может отправлять и принимать данные одновременно.
Поэтому, когда мы используем TCP через Ethernet, я думаю, что TCP только двунаправленный или полудуплексный.
Но здесь он говорит, что TCP является полнодуплексным. Почему?
Ответы
Ответ 1
Это, безусловно, двунаправленный, поскольку обе стороны отправляют/получают пакеты. Что именно вы имеете в виду, когда спрашиваете, является ли TCP полнодуплексным?
Оба отправляющих и принимающих пакеты в то же время имеют больше общего с физическим компонентом, а TCP - это протокол, определяющий, как данные должны быть обрамлены и обработаны для достижения адресата.
Сетевой адаптер (Network Interface Controller) отвечает за отправку и получение физических пакетов, и вам нужно будет проверить там возможности с половиной/полным дуплексом.
Беспроводной (802.11), например, является полудуплексным, если он использует одну и ту же антенну для отправки и приема радиосигнала.
Ответ 2
Это и то, и другое. Он двунаправлен, потому что он может отправлять данные в обоих направлениях, и он является полнодуплексным, потому что он может делать это одновременно, не требуя чередования строк на уровне API.
Конечно, на более низком уровне он может быть ограничен доступным физическим уровнем.
Ответ 3
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 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 является полнодуплексным, и данные могут отправляться с обеих сторон одновременно. Я думаю, что реализация тоже дуплексная, но для ее распознавания необходимо написать более сложный тест. Это зависит от реализации, конечно. И хорошая реализация может не работать, когда хотя бы одно звено транспортной цепочки не является дуплексным.
Ответ 4
Прочитав статью, которую вы опубликовали, я думаю, ясно, что они говорят о TCP, поддерживающей полнодуплексную связь (выделение мое):
[TCP] - это полнодуплексный протокол, что означает, что каждое TCP-соединение поддерживает пару байтовых потоков, каждый из которых проходит в каждом направлении.
Ответ 5
Да, TCP-соединение обеспечивает полнодуплексную службу. Позвольте понять смысл полнодуплексного. Это означает обмен данными (отправкой и получением) между двумя объектами одновременно. Поскольку протокол TCP является протоколом транспортного уровня, а протоколы транспортного уровня обеспечивают логическую связь между процессами, запущенными на разных хостах, здесь также подразумевается значение полного дуплекса.
Здесь полнодуплексный означает "Если есть TCP-соединение между процессом A на одном хосте и процессом B на другом хосте, данные уровня приложения могут поступать из процесса A в процесс B в то же время, когда данные прикладного уровня передаются из процесса B в процесс A". TCP-соединение также всегда точка-точка, то есть между одним отправителем и одиночным получатель. Помните, что данные процесса A еще не пройдут через слои ниже транспортного уровня, аналогично данные из процесса B пройдут через слои ниже транспортного уровня.
Источник: компьютерная сеть Kurose, Ross.
Ответ 6
это зависит от того, какой слой вы думаете. На физическом уровне это зависит от среды, как передаются электрические сигналы; если вы думаете из транспортного уровня, это полный дуплекс, так как каждый узел может отправлять и получать одновременно, если он хочет.