Linux Socket 详解
Socket(套接字) 是操作系统提供的一套用于网络通信的编程接口(API),它位于应用层与传输层之间,为开发者提供了在不同进程(甚至是不同机器)之间进行数据交换的标准方式。
Socket 的核心组成要素
一个完整的 Socket 通信通常由以下三个要素决定:
- IP 地址:标识网络中的目标主机。
- 端口号 (Port):标识主机上的特定进程或服务。
- 协议 (Protocol):规定了数据传输的方式(如 TCP 或 UDP)。
通过将 IP + 端口 + 协议 结合起来,就可以在复杂的网络环境中唯一地定位一个通信端点。
Socket 的分类
根据传输层协议的不同,Socket 主要分为两大类:
流式套接字 (Stream Socket)
- 类型:
SOCK_STREAM - 协议:通常使用 TCP 协议。
- 特点:
- 面向连接:通信前必须建立连接。
- 可靠性:保证数据按顺序、无差错、不丢失地到达。
- 字节流:数据以流的形式传输,没有消息边界。
数据报套接字 (Datagram Socket)
- 类型:
SOCK_DGRAM - 协议:通常使用 UDP 协议。
- 特点:
- 无连接:发送数据前不需要建立连接。
- 不可靠:可能会丢包、乱序或重复。
- 消息边界:数据以独立的数据报形式传输,保留消息边界。
Socket 编程的工作流程
Socket 编程通常分为服务端 (Server) 和 客户端 (Client) 两种角色。
服务端流程
- socket():创建一个新的 Socket 文件描述符。
- bind():将 Socket 绑定到一个特定的 IP 地址和端口号上。
- listen():将 Socket 设置为监听状态,准备接收客户端的连接请求。
- accept():从监听队列中提取一个连接请求,并创建一个新的 Socket 用于后续与该客户端的通信。
- recv() / send():进行数据的接收与发送。
- close():关闭连接。
客户端流程
- socket():创建一个新的 Socket 文件描述符。
- connect():向服务端发起连接请求(如果是 TCP)。
- send() / recv():进行数据的发送与接收。
- close():关闭连接。
核心系统调用详解
socket()
int socket(int domain, int type, int protocol);
- domain:协议族,如
AF_INET(IPv4) 或AF_INET6(IPv6)。 - type:套接字类型,如
SOCK_STREAM(TCP) 或SOCK_DGRAM(UDP)。 - protocol:具体协议,通常设为
0让系统自动选择。
bind()
int bind(int sockfd, const struct sockaddr addr, socklen_t addrlen);
将 Socket 绑定到指定的地址,对于服务端,这一步至关重要,否则客户端无法通过固定的端口找到服务。
listen()
int listen(int sockfd, int backlog);
使 Socket 进入监听状态。backlog 参数指定了等待连接的队列最大长度。
accept()
int accept(int sockfd, struct sockaddr addr, socklen_t addrlen);
从监听队列中取出一个连接。注意:
accept 会返回一个全新的文件描述符,专门用于处理这个特定的客户端连接,而原有的监听 Socket 继续负责监听其他请求。
connect()
int connect(int sockfd, const struct sockaddr addr, socklen_t addrlen);
客户端调用此函数来建立与服务端的连接。
I/O 模型简述
在处理大量 Socket 连接时,如何高效地读写数据是性能的关键,常见的模型包括:
- 阻塞 I/O (Blocking I/O):进程在调用
recv或accept时会被挂起,直到数据到达或连接建立。 - 非阻塞 I/O (Non-blocking I/O):调用后立即返回,如果数据未就绪,返回一个错误码(如
EAGAIN),进程可以继续做其他事。 - I/O 多路复用 (I/O Multiplexing):
- select/poll:通过轮询的方式检查多个 Socket 是否有数据。
- epoll (Linux 特有):基于事件驱动的高性能机制,是目前高性能服务器(如 Nginx)的核心。
- 信号驱动 I/O:通过信号通知数据就绪。
- 异步 I/O (AIO):由内核完成数据传输,完成后通知应用层,效率最高但实现复杂。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/490679.html



