Socket
Socket
网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
Socket 本身并不是一个协议,而是一个调用接口。它工作在 OSI 模型会话层,是为了方便大家直接使用更底层协议(一般是 TCP 或 UDP )而存在的一个抽象层。Socket 是对 TCP/IP 协议的封装。
Socket 连接流程
创建 Socket 的时候,可以指定网络层使用的是 IPv4 还是 IPv6,传输层使用的是 TCP 还是 UDP。

TCP方式 服务器
- 创建套接字(socket)
- 将套接字绑定到一个本地地址和端口上(bind)
当内核收到TCP报文,会通过端口号找到对应的Socket - 将套接字设为监听模式,准备接收客户端请求(listen)
- 等待客户请求到来,当请求到来后,接收连接请求,返回一个新的对应于此次连接的套接字(accept)
监听 Socket 和真正用来传数据的 Socket 是两个,监听 Socket
以及已连接 Socket
- 用返回的套接字和客户端进行通信(send/recv)
- 返回,等待另一客户请求
- 关闭套接字
在 TCP 连接时,内核为每个 Socket 维护两个队列
- TCP 半连接队列,还没完全建立连接的队列
- TCP 全连接队列,已经建立连接的队列
TCP方式 客户端
- 创建套接字(socket)
- 向服务器发出连接请求(connect)
- 和服务器端进行通信(send/recv)
- 关闭套接字
UDP方式 服务器端
- 创建套接字(socket)
- 将套接字绑定到一个本地地址和端口上(bind)
- 等待接收数据(recvfrom)
- 关闭套接字
UDP方式 客户端
- 创建套接字(socket)
- 向服务器发送数据(sendto)
- 关闭套接字
如何保证 Socket 的长连接
应用层自己实现心跳包