套接字(Socket)是一个抽象层,位于应用层和传输层之间,将TCP/IP复杂的操作抽象出几个简单接口,供应用层调用,实现网络进程之间的通信。
套接字实际是传输层连接的端点,使用“IP地址:端口号”进行唯一标识。在网络通信中,套接字一定是成对出现的,两个套接字组成的socket pair唯一标识一个连接。一端的发送缓冲区对应对方的接收缓冲区。使用同一个文件描述符检索套接字的发送缓冲区和接收缓冲区。
网络系统一般提供三种不同类型的套接字:
- 流式套接字(SOCK_STREAM):提供可靠的、面向连接的双向数据传输服务,使用TCP协议来实现。
- 数据报套接字(SOCK_DGRAM):提供不可靠、无连接的双向数据传输服务,使用UDP协议来实现。
- 原始套接字(SOCK_RAW):使用较低层协议(IP或ICMP)进行直接访问。
Unix Socket通信流程如下:
socket():创建套接字。
bind():绑定本地地址。
很多时候,应用程序不关心使用的本地地址,这时不用调用bind(),而由系统自动分配。但在知名端口上操作的进程必须指定本地端口,这时就使用bind()为套接字指定本地地址。listen():监听连接请求。
connect():请求连接。
accept():接受连接。
read()/write():双向通信。
close():关闭套接字。