目录

Socket 连接的建立步骤

目录

Socket 中文可以译作插口或者插座,在计算机学科中有起专有名称,既为套接字。

网络中的设备进行通信,就需要创建套接字,套接字是形如 IP:Port 这样的IP地址对,这样对形式是 IPv4 版本,新的套接字可以指定为 IPv6。这部分是在网络层指定。

传输层可以指定使用 TCP 连接的方式,还是使用 UDP 连接的方式。一般来说在网络通信中是由服务器先开启进行服务,等待客户端去建立连接,所以客户端和服务端的概念是一个相对的概念。

服务端创建一个 IPv4TCP 传输的 socket 的步骤:

  1. 调用系统函数 socket(),创建并绑定一个 IP 地址和端口。
  2. 调用系统函数 listen(),进行地址监听。此时可以通过 netstate 命令查看对应端口是否被监听。
  3. 调用系统函数 accept(),从内核获取客户端的连接,如果没有客户端进行连接,则会阻塞等待。

客户端发起连接的步骤:

  1. 客户端创建 socket 连接
  2. 调用系统函数 connect() 发起连接请求,在该函数中指定要连接的服务端的 IPPort,然后进行 TCP 三次握手确认连接状态

TCP 连接中,内核要为每个 socket 维护两个队列

  • 半连接队列
    • 没有完全建立连接的队列
    • 还未完成三次握手,服务端处于 syn_rcvd 状态,既等待客户端发送回执
  • 全连接队列
    • 建立连接的队列
    • 完成了三次握手,服务端处于 established 状态

当TCP全连接队列不为空时,服务端的 accept() 函数就会从队列中取出完成的连接返回给应用,后续的数据传输度使用这个 socket。建立连接后,客户端和服务端就可以互相传输数据了,双方都可以通过 read()write() `函数来读写数据了。