1015 字
5 分钟
RPC1:socket套接字
2026-05-18
无标签
维度TCPUDP
基本机制面向连接(connection-oriented)无连接(connectionless)
通信前提必须三次握手建立连接不需要连接,直接发送
通信模型一对一连接(点对点)一对多 / 多对多(无状态)
数据单位字节流(stream)报文(datagram)
边界❌ 无边界(可能拆包/粘包)✅ 保持消息边界
可靠性✅ 可靠(确认+重传)❌ 不可靠
顺序保证✅ 有序❌ 可能乱序
丢包处理自动重传不处理
重复数据自动去重可能重复
流量控制✅ 有(滑动窗口)❌ 无
拥塞控制✅ 有(慢启动等)❌ 无
传输开销大(头部+控制)
延迟较高较低
吞吐稳定性稳定不稳定
适用场景文件传输、HTTP、RPC视频、语音、DNS
角色TCP 行为UDP 行为
Server 初始化socket → bind → listen → acceptsocket → bind
是否监听连接✅ listen + accept❌ 不需要
是否区分客户端✅ 每个 client 一个 socket❌ 通过地址区分
接收数据recv()(已建立连接)recvfrom()(带来源地址,让目标知道来源)
发送数据send()sendto()(必须指定地址)

Socket 套接字#

Socket(套接字)是应用层与传输层之间的编程接口,用于实现进程之间的网络通信。他封装了传输协议层(TCP/UDP)的细节。

Socket 被归类为 IPC 基元(进程间通信原语),位于传输层(TCP/UDP)之上、远程调用之下的中间件层中

Socket = IP地址 + 端口号 + 协议(TCP/UDP)

UDP-socket#

特点:

  • 无连接:发送数据前不需要建立连接,适合广播和多播。
  • 不可靠:数据包可能丢失、重复或乱序。没有确认或重传
  • 适用于实时应用,如视频会议、在线游戏等。
  • 发送者必须显示将消息碎片化(548bytes)
  • 接收者应有一个缓冲区来存储接收的数据包

通信流程

服务端:

socket()
bind()
recvfrom()
sendto()
close()

客户端:

socket()
sendto()
recvfrom()
close()
  1. Server在已知端口sp处打开UDP套接字SS
  2. SS等待客户端请求
  3. Client在任意端口cp处打开UDP套接字CS
  4. CS向serverIP+端口sp发送请求
  5. Server接收请求并处理
  6. Server通过SS向clientIP+端口cp发送响应
TIP

sendto()和recvfrom()函数中需要指定目标的IP地址和端口号。

服务端通过recvfrom()函数获取客户端的IP地址和端口号,以便发送响应。

TCP-socket#

特点:

  • 面向连接:通信前需要建立连接,适合可靠的数据传输。
  • 可靠:数据包按顺序传输,丢失时会重传。
  • 适用于文件传输、电子邮件等需要可靠通信的应用。
  • 可以发送任意大小的数据,TCP会负责分段和重组。
  • 有拥塞控制调节发送者的速率防止网络过载

通信流程

服务端:

TIP

accept()函数会阻塞等待客户端连接请求,三次握手完成后返回一个新的socket用于通信。后续通信用的是 accept 返回的 socket,而不是最初创建的监听 socket。

socket()
bind()
listen()
accept() ← 建立连接(三次握手完成后返回新 socket)阻塞等待连接
recv/send
close()

客户端:

socket()
connect() ← 建立连接(三次握手)
recv/send
close()

时序:

sequenceDiagram participant Client participant Server Client->>Server: connect() ← 建立连接(三次握手) Server->>Client: accept() ← 建立连接(三次握手完成后返回新 socket)阻塞等待连接 Client->>Server: send() ← 发送请求 Server->>Client: recv() ← 接收请求并处理 Server->>Client: send() ← 发送响应 Client->>Server: recv() ← 接收响应 Client->>Server: close() ← 关闭连接 Server->>Client: close() ← 关闭连接

通信机制:

  1. Server在已知端口sp处打开TCP套接字SS
  2. SS监听端口sp等待客户端连接请求
  3. Client在任意端口cp处打开TCP套接字CS
  4. CS向serverIP+端口sp发送连接请求(三次握手)
  5. Server接受连接请求,SS在一个新端口nsp上创建一个新的套接字SS2与客户端通信
  6. Client和Server通过CS和SS2进行通信
RPC1:socket套接字
https://biscuit0613.github.io/posts/net_dist_sys/rpc-socket/
作者
Biscuit
发布于
2026-05-18
许可协议
CC BY-NC-SA 4.0