Skip to content

先搞懂它是什么

  • 传输层协议:解决“数据从哪个程序发给哪个程序”和“怎么送”的问题。
  • 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

Released under the MIT License. Build Time 2026-09-11 14:52:23