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 的长连接

应用层自己实现心跳包