今天猛然惊觉 ,TCP/IP 是支持全双工传输的,但是在印象中一般都是使用多线程进行处理,比如一个线程负责接收,一个线程负责发送。这样的话不就是等同于每线程同一时间要么处理接收要么处理发送,这不就是半双工了么。
对此实在感到不解。TCP/IP 支持全双工的具体表现形式和应用场景是什么样的?
如果有了解此处问题的还望不吝赐教。
1
monsterxx03 2021-02-23 10:37:24 +08:00
比如 http2 的 multiplexing , 在同一个 tcp connection 上跑多个 stream, 好处是减少了 latency(只需要一次连接建立), 坏处是单 connection 用不上多核, 很注重吞吐量的场景还需要在这之上实现一个线程池.
|
2
sagaxu 2021-02-23 10:39:45 +08:00 via Android
非阻塞 io 了解一下
|
3
misaka19000 2021-02-23 10:40:40 +08:00
全双工和线程有什么关系
|
4
si 2021-02-23 10:45:16 +08:00 4
你的线程怎么处理和 TCP/IP 全双工没有关系啊,TCP/IP 的全双工只是说 TCP/IP 的底层处理的。
全双工是指一方发送的时候,另一方也可以同时发送,对应过来就是可以同时发送和接收。 半双工是一方发送的时候,另一方要接收完成才可以开始发送。 发送和接收是不同的 buffer,两种操作可以同时进行就是全双工。如果发送要等接收结束,接收要等发送结束,就是半双工。 换到你的线程上来说,一个线程 A 正在接收,另一个线程 B 同时可以发送,线程 B 不用等 A 接收完成再发送。发送不影响接收,接收不影响发送。 就算只有一个线程,用非阻塞的 API 发送和接收,正在发送的时候也不用等待发送结束就可以开始处理收到的数据。 不管线程有没有正在执行,都不影响网卡的发送和接收处理。 这个全双工、半双工和线程没有什么关系。 |
5
noe132 2021-02-23 10:52:47 +08:00 via Android
全双工是物理层的吧?和 tcp 有啥关系么
|
6
newtype0092 2021-02-23 10:54:18 +08:00
打一通电话,既有听筒又有话筒,能边听边说,这就是全双工。
两个人拿同一个电话,一个只用听筒听,一个只用话筒说,就是你说的多线程,这并不影响这通电话是按全双工的方式工作的,只是你这端把收发分别处理了而已。 如果是半双工电话,那通话就要同时打两通电话,第一通设置为只能你说对面听,保持住,然后再打一通,设置为只能你听对面说,这样两边才能对话。 |
7
Jooooooooo 2021-02-23 10:54:28 +08:00
cpu 单核一个时钟只能干一件事, 你理解一下.
|
8
liuminghao233 2021-02-23 12:24:09 +08:00 via iPhone
两个 tcp 对端难道不能同时发送数据吗
|
9
systemcall 2021-02-23 13:08:01 +08:00
@noe132 #5
物理层的话,记得 WiFi 一般是半双工的,一个周期内要么收要么发。百兆的以太网也是支持全双工和半双工的 串口通信全双工模式也不是一边处理发送一边处理接收吧,还是要读对应寄存器看缓冲区有没有满、有没有收到数据之类的。没有写过以太网的东西,不清楚 |
10
fucUup 2021-02-23 13:43:34 +08:00 via Android
一般是 Epoll 边缘触发,另外,不要造垃圾轮子
|
12
alw 2021-02-23 14:59:26 +08:00
好家伙,这个好像一般是串口通信里的用到的名词,搞电子的可能知道。
我估计 计算机科班有可能没听说过 什么叫全双工。 |
13
ScepterZ 2021-02-23 15:19:57 +08:00
lz 的问题看起来是忘记了 cpu 是多核的,可以并行处理
|
14
julyclyde 2021-02-23 15:34:56 +08:00
@newtype0092 你这两通电话不是半双工,而是两个单工
|
15
julyclyde 2021-02-23 15:35:50 +08:00
lz 以为是半双工,其实并不是 tcp/ip 的问题,而是应用层协议是应答型导致的
如果你不考虑请求应答,只是发数据的话,就可以全双工了 |
17
newtype0092 2021-02-23 16:08:46 +08:00
@julyclyde 额,确实我写草率了,应该是同一条线路可切换方向但不可同时传输。
|