V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
bbbai
V2EX  ›  问与答

TCP/IP 协议支持全双工的一些疑惑

  •  
  •   bbbai · 2021-02-23 10:17:03 +08:00 · 3516 次点击
    这是一个创建于 1374 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天猛然惊觉 ,TCP/IP 是支持全双工传输的,但是在印象中一般都是使用多线程进行处理,比如一个线程负责接收,一个线程负责发送。这样的话不就是等同于每线程同一时间要么处理接收要么处理发送,这不就是半双工了么。

    对此实在感到不解。TCP/IP 支持全双工的具体表现形式和应用场景是什么样的?

    如果有了解此处问题的还望不吝赐教。

    17 条回复    2021-02-23 16:08:46 +08:00
    monsterxx03
        1
    monsterxx03  
       2021-02-23 10:37:24 +08:00
    比如 http2 的 multiplexing , 在同一个 tcp connection 上跑多个 stream, 好处是减少了 latency(只需要一次连接建立), 坏处是单 connection 用不上多核, 很注重吞吐量的场景还需要在这之上实现一个线程池.
    sagaxu
        2
    sagaxu  
       2021-02-23 10:39:45 +08:00 via Android
    非阻塞 io 了解一下
    misaka19000
        3
    misaka19000  
       2021-02-23 10:40:40 +08:00
    全双工和线程有什么关系
    si
        4
    si  
       2021-02-23 10:45:16 +08:00   ❤️ 4
    你的线程怎么处理和 TCP/IP 全双工没有关系啊,TCP/IP 的全双工只是说 TCP/IP 的底层处理的。
    全双工是指一方发送的时候,另一方也可以同时发送,对应过来就是可以同时发送和接收。
    半双工是一方发送的时候,另一方要接收完成才可以开始发送。
    发送和接收是不同的 buffer,两种操作可以同时进行就是全双工。如果发送要等接收结束,接收要等发送结束,就是半双工。
    换到你的线程上来说,一个线程 A 正在接收,另一个线程 B 同时可以发送,线程 B 不用等 A 接收完成再发送。发送不影响接收,接收不影响发送。
    就算只有一个线程,用非阻塞的 API 发送和接收,正在发送的时候也不用等待发送结束就可以开始处理收到的数据。
    不管线程有没有正在执行,都不影响网卡的发送和接收处理。
    这个全双工、半双工和线程没有什么关系。
    noe132
        5
    noe132  
       2021-02-23 10:52:47 +08:00 via Android
    全双工是物理层的吧?和 tcp 有啥关系么
    newtype0092
        6
    newtype0092  
       2021-02-23 10:54:18 +08:00
    打一通电话,既有听筒又有话筒,能边听边说,这就是全双工。
    两个人拿同一个电话,一个只用听筒听,一个只用话筒说,就是你说的多线程,这并不影响这通电话是按全双工的方式工作的,只是你这端把收发分别处理了而已。

    如果是半双工电话,那通话就要同时打两通电话,第一通设置为只能你说对面听,保持住,然后再打一通,设置为只能你听对面说,这样两边才能对话。
    Jooooooooo
        7
    Jooooooooo  
       2021-02-23 10:54:28 +08:00
    cpu 单核一个时钟只能干一件事, 你理解一下.
    liuminghao233
        8
    liuminghao233  
       2021-02-23 12:24:09 +08:00 via iPhone
    两个 tcp 对端难道不能同时发送数据吗
    systemcall
        9
    systemcall  
       2021-02-23 13:08:01 +08:00
    @noe132 #5
    物理层的话,记得 WiFi 一般是半双工的,一个周期内要么收要么发。百兆的以太网也是支持全双工和半双工的
    串口通信全双工模式也不是一边处理发送一边处理接收吧,还是要读对应寄存器看缓冲区有没有满、有没有收到数据之类的。没有写过以太网的东西,不清楚
    fucUup
        10
    fucUup  
       2021-02-23 13:43:34 +08:00 via Android
    一般是 Epoll 边缘触发,另外,不要造垃圾轮子
    ungrown
        11
    ungrown  
       2021-02-23 13:57:58 +08:00
    @noe132 #5 一语惊醒梦中人,确实 TCP 哪来的全双工半双工的说法嘛
    alw
        12
    alw  
       2021-02-23 14:59:26 +08:00
    好家伙,这个好像一般是串口通信里的用到的名词,搞电子的可能知道。
    我估计 计算机科班有可能没听说过 什么叫全双工。
    ScepterZ
        13
    ScepterZ  
       2021-02-23 15:19:57 +08:00
    lz 的问题看起来是忘记了 cpu 是多核的,可以并行处理
    julyclyde
        14
    julyclyde  
       2021-02-23 15:34:56 +08:00
    @newtype0092 你这两通电话不是半双工,而是两个单工
    julyclyde
        15
    julyclyde  
       2021-02-23 15:35:50 +08:00
    lz 以为是半双工,其实并不是 tcp/ip 的问题,而是应用层协议是应答型导致的
    如果你不考虑请求应答,只是发数据的话,就可以全双工了
    aheadlead
        16
    aheadlead  
       2021-02-23 15:46:41 +08:00   ❤️ 1
    @alw #11 ……计算机科班只是不常用这个词,但应该还是要知道的
    newtype0092
        17
    newtype0092  
       2021-02-23 16:08:46 +08:00
    @julyclyde 额,确实我写草率了,应该是同一条线路可切换方向但不可同时传输。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5849 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:30 · PVG 14:30 · LAX 22:30 · JFK 01:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.