前言
面试官问:“TCP 是全双工还是半双工?” 你心里默念“双工、半双工、全双工……”,嘴上却开始支吾。今天,我用CPU 流水线 + 微信群聊 + 对讲机,一次性帮你焊死这个知识点。
摘要
本文从硬件、协议和操作系统层面,解析双工、半双工、全双工的核心差异在于“同一时刻能否同时收发”。半双工共用单信道,分时传输,需冲突检测,典型如对讲机、集线器和Wi-Fi(实际分时复用),效率低且延迟高;全双工拥有独立收发通道,可同时双向通信,无需冲突检测,如电话、交换机以太网和PCIe总线,操作系统体现为独立Socket缓冲区。澄清常见误区:TCP虽全双工但可跑在半双工链路,蓝牙常因省电降为半双工,Wi-Fi标称带宽并非上下行同时可达。提供“三问法”快速判断,并以双核流水线类比全双工、单核轮转类比半双工。
目录
1. 一句话破题(先记住“核心动作”)
2. 计算机底层视角(从总线到网卡)
2.1 物理层:一根线 vs 两根线
2.2 数据链路层:MAC 状态机
2.3 操作系统层面:Socket 读写缓冲
3. 生活场景“三件套” —— 秒懂区别
4. 那些让你“纠结”的擦边球
4.1 “蓝牙耳机”是半双工还是全双工?
4.2 “Wi-Fi”是半双工?
5. 实战判断“三问法”
6. 一张表终结所有疑问
7. 计算机面试高频题(附答案)
8. 总结(用计算机思维记忆)
1. 一句话破题(先记住“核心动作”)
双工(Duplex):通信双方都能收发数据的能力——这是总称。
半双工(Half-Duplex):同一时刻,只能一方发、一方收(轮流来)。
全双工(Full-Duplex):同一时刻,双方可以同时发和收。
关键不在“能不能”,而在“能不能同时”。
2. 计算机底层视角(从总线到网卡)
2.1 物理层:一根线 vs 两根线
半双工:共用一条传输通道(比如一根同轴电缆)。
发信号时占住总线,收信号时释放——冲突域里必须靠 CSMA/CD(载波监听多路访问/冲突检测)来抢时间片。全双工:使用两条独立的物理通道(发送线 Tx + 接收线 Rx),比如网卡里的双绞线(8 芯中 4 芯用于收发)。
收发互不干扰,同时进行。
计算机内部总线(如 PCIe)采用全双工点对点连接,所以 CPU 能一边从内存读数据,一边向显卡写指令——这不是“并发”,这是真正的“并行”。
2.2 数据链路层:MAC 状态机
半双工时,网卡工作在“半双工模式”,需要启用流控和冲突检测;全双工时,关闭 CSMA/CD,直接收发包,效率翻倍。
一个经典误区:
“TCP 是全双工协议,所以底层网卡一定全双工。”
——错!TCP 可以在半双工链路上跑(比如老式 10M 集线器),但性能会打骨折。现代交换机强制全双工,是因为交换机能隔离冲突域。
2.3 操作系统层面:Socket 读写缓冲
全双工在 OS 里体现为独立的发送缓冲区和接收缓冲区。
你调用send()的同时,另一线程可以recv(),内核互不阻塞。
c
// 全双工 Socket 示例(伪代码) while (true) { // 子线程1:持续发送 send(sockfd, data, len, 0); // 子线程2:同时接收 recv(sockfd, buf, size, 0); }半双工如果强行双线程同时读写,底层会串行化(一个操作等待另一个完成),效率下降。
3. 生活场景“三件套” —— 秒懂区别
| 场景 | 类型 | 为什么? |
|---|---|---|
| 对讲机(walkie-talkie) | 半双工 | 按住“通话键”时只能说话,松手后才能听对方。同一时刻只能一个人讲。 |
| 电话 / 微信语音通话 | 全双工 | 双方可以同时说话、同时听到对方,互不干扰(靠两条音频通道)。 |
| 单行道 + 双向红绿灯 | 半双工 | 同一时间只允许一个方向的车流通过,另一个方向等待。 |
| 双向四车道高速公路 | 全双工 | 去程和返程各两条车道,同时并行。 |
| 微信群“@所有人”后禁言 | 单工(单向) | 但双工一般指双向,单工不属于这里,但提一下:比如广播电台。 |
4. 那些让你“纠结”的擦边球
4.1 “蓝牙耳机”是半双工还是全双工?
经典蓝牙(HFP 协议)支持全双工,因为手机和耳机同时收发音频。
但很多廉价耳机为了省电,把上行(麦克风)和下行(扬声器)分时复用,实际上是半双工——所以你打游戏时开麦,背景音会变单声道,那就是被切成半双工了。
4.2 “Wi-Fi”是半双工?
对!虽然你感觉能同时下载和上传,但 Wi-Fi(802.11)在物理层是半双工——所有终端共用同一信道,同一时刻只能一个设备发送或接收(加上 OFDMA 也只是分时片)。
所以 Wi-Fi 速率标称“总带宽”,不是“上下行同时达到”。
而有线以太网(交换机直连)是全双工——上下行可以同时跑满,所以延迟和抖动更稳定。
5. 实战判断“三问法”
下次见到任何通信系统,问自己三个问题:
物理上有没有两条独立通道?(线、频率、时间槽)
协议允许双方同时发吗?(看是否有冲突检测或收发包调度)
实际体验中,一方发数据时,另一方能否同时发而不丢包?
6. 一张表终结所有疑问
| 维度 | 半双工 | 全双工 |
|---|---|---|
| 传输通道 | 共用一条 | 两条独立(Tx/Rx) |
| 同时收发 | ❌ 不可以 | ✅ 可以 |
| 冲突处理 | 需要 CSMA/CD 或令牌 | 不需要 |
| 典型硬件 | 集线器、对讲机、Wi-Fi、RS-485 | 交换机、电话、光纤、PCIe |
| 效率 | 低(浪费一半时间) | 高(理论 2 倍) |
| 延迟 | 有等待延迟 | 无等待延迟 |
7. 计算机面试高频题(附答案)
Q:为什么 TCP 是全双工,而 HTTP/1.1 是半双工?
A:TCP 是传输层协议,提供双向独立信道;HTTP/1.1 是应用层协议,采用“请求-响应”模型,同一时刻只能一个请求或一个响应,所以应用层行为是半双工。HTTP/2 支持多路复用,可近似全双工。
Q:串口(UART)是全双工吗?
A:看模式。标准 UART 有 TX/RX 两根线,支持全双工;但 RS-232 某些只接 3 根线的简化版,只能半双工。
8. 总结(用计算机思维记忆)
全双工 = 双核流水线(取指和执行同时)
半双工 = 单核轮转(时间分片)
双工 = 能力集(只要是双向通信就是双工)
记住:全双工是“同时双向”,半双工是“轮流双向”,单工是“单向”。
下次再看到“双工”二字,先问自己:同一秒,它能不能同时说话和听话?
如果觉得这篇文章帮你理清了,点个赞👍,转发给那个还在纠结的朋友。
评论区留下你的“生活场景”,一起补充脑洞~
本文原创,首发于 CSDN,转载注明出处。