Socket(套接字) 是计算机网络编程里最核心的概念之一,可以理解为**“网络通信的端点”**,用来让两台设备上的程序互相收发数据。
一句话理解
Socket = IP 地址 + 端口号
就像:IP 是小区地址,端口是门牌号,Socket 就是“某小区某栋某室”,用来精准找到通信的那一端。
Socket 是什么?
在操作系统中,Socket 是一种文件描述符/抽象接口,应用程序通过它:
- 发起连接(客户端)
- 监听连接(服务器)
- 发送 / 接收数据
它是 TCP/IP 协议栈 暴露给应用层的 API(最典型的是 BSD Socket)。
Socket 的工作流程(以 TCP 为例)
服务器端
socket():创建套接字bind():绑定 IP + 端口listen():开始监听连接accept():接受客户端连接recv() / send():读写数据close():关闭连接
客户端
socket():创建套接字connect():连接服务器 IP + 端口send() / recv():读写数据close():关闭连接
常见 Socket 类型
| 类型 | 说明 | 典型场景 |
|---|---|---|
TCP Socket(SOCK_STREAM) |
面向连接、可靠、流式 | HTTP、FTP、数据库连接 |
UDP Socket(SOCK_DGRAM) |
无连接、不可靠、报文式 | 视频通话、DNS、游戏 |
| Unix Domain Socket | 本机进程间通信 | Nginx ↔ PHP-FPM |
| Raw Socket | 直接操作 IP 层 | ping、网络扫描 |
简单示例(Python TCP)
服务端
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8888))
s.listen(1)
conn, addr = s.accept()
print("Connected by", addr)
data = conn.recv(1024)
conn.sendall(data.upper())
conn.close()
客户端
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8888))
s.sendall(b'hello')
data = s.recv(1024)
print(data.decode())
s.close()
Socket vs HTTP
- Socket:底层通信机制,可自定义协议
- HTTP:基于 TCP Socket 的应用层协议,有固定格式
几乎所有网络应用(浏览器、数据库、消息队列)底层都是 Socket。
常见面试/实战点
- TCP 三次握手发生在
connect()/accept()阶段 select/poll/epoll:高并发 I/O 多路复用- 粘包 / 拆包问题(TCP 流式特性)
- 阻塞 vs 非阻塞 Socket
- C10K 问题