先搞懂它是什么
- 传输层协议:解决“数据从哪个程序发给哪个程序”和“怎么送”的问题。
- TCP:面向连接、可靠,像挂号信(要回执、按序送达、丢失重传)。
- UDP:无连接、不可靠,像平信(发出去不管,快但不保证到达)。
- Socket:SDK 提供一套类 BSD 的套接字 API,与 PC 上写网络程序几乎一样。
层层拆解原理
1. TCP 三次握手与四次挥手
为什么是“三次”?为了双方都确认“我能发、我能收”,避免历史连接残留。
2. 客户端 / 服务器 Socket 流程
客户端主动 connect,服务器被动 accept;建立后双方 send/recv。
3. UDP:无连接的数据报
UDP 不需要握手,直接 sendto 发、recvfrom 收,天然支持广播(255.255.255.255)和组播。适合音视频、设备发现等实时场景。
4. 端口与可靠性
- 端口标识“发给哪个程序”(0~65535)。
- TCP 可靠靠:序号 + 确认 + 超时重传 + 滑动窗口。
- UDP 没有这些,应用层需要自己处理丢包/乱序。
结合 SDK 看实现
SDK 客户端流程(lwIP socket API):
c
int sock = socket(AF_INET, SOCK_STREAM, 0); /* TCP 用 SOCK_STREAM,UDP 用 SOCK_DGRAM */
connect(sock, (struct sockaddr *)&dest, sizeof(dest));
send(sock, buffer, len, 0);
recv(sock, buffer, sizeof(buffer), 0);
close(sock);服务器多一个 bind + listen + accept。这就是“服务器/客户端”两类例程的差异所在。
常见考点 / 面试题
TCP 为什么需要三次握手?
让双方都确认收发能力,并同步初始序号,避免过期连接请求造成混乱;两次不够,四次多余。
TCP 和 UDP 各自适合什么场景?
TCP 适合要可靠确认的(文件、网页、MQTT);UDP 适合实时/广播的(音视频、设备发现、游戏)。
客户端和服务器程序流程差在哪?
客户端:socket→connect→收发;服务器:socket→bind→listen→accept→收发。差异在 bind/listen/accept。
UDP 能保证送达吗?
不能。UDP 无确认重传,可能丢包、乱序;需要可靠时要么用 TCP,要么在应用层自己做确认。
端口号起什么作用?
IP 找到设备,端口找到设备上的具体程序;TCP/UDP 报文头都带源/目的端口。
遇到问题?
如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

