Является ли 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

это зависит от того, какой слой вы думаете. На физическом уровне это зависит от среды, как передаются электрические сигналы; если вы думаете из транспортного уровня, это полный дуплекс, так как каждый узел может отправлять и получать одновременно, если он хочет.