最基本的 socket 模型
socket 模型可以使两个进程跨主机通信,创建 Socket 的时候,可以指定网络层使用的是 IPv4 还是 IPv6,传输层使用的是 TCP 还是 UDP。
以 TCP 的 socket 为例:
服务端首先调用 socket 函数创建网络协议及传输协议,然后调用 bind 函数,为 socket 绑定 ip 地址和端口,最后调用 listen 函数监听并通过 accept 函数从内核获取客户端连接。
客户端创建 socket,调用 connect 函数,指定 ip 地址和端口,TCP 三次握手后就可以和服务端通信了。
TCP 连接过程中,服务器的内核实际上为每个 Socket 维护了两个队列:
- 「还没完全建立」连接的队列,称为 TCP 半连接队列,这个队列都是没有完成三次握手的连接,此时服务端处于 syn_rcvd 的状态;
- 「已经建立」连接的队列,称为 TCP 全连接队列,这个队列都是完成了三次握手的连接,此时服务端处于 established 状态;
