什么是Socket

Socket的定义

Socket,也称“套接字”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。我们知道不同的程序之间的网络通讯是要通过端口来区分的。简单来说,网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,而建立网络通信连接至少要一对端口号(socket)。

Socket和TCP/IP的关系

Socket本质是对TCP/IP的封装,是一套用来实现TCP或UDP通讯的API。 根据网络通讯的OSI参考模型的定义,IP位于网络层,TCP/UDP位于传输层,HTTP位于应用层,而Socket位于传输层和应用层之间,是它们之前的桥梁。

Socket是怎样通讯的

  • TCP传输协议:TCP是面向连接的,需要“三次握手,四次挥手”,是可靠的传输,用来传输大的数据,但是,建立时间要花费时间和资源,相对于UDP速度较慢。
  • UDP:UDP是面向无连接的,发送端不会关心数据是否到达目标端,简单高效。经常用于以下几方面:
  • 总量较小的通讯(DNS,SNMP等)
  • 视频、音频等多媒体通讯(即时通讯)
  • 限定于LAN等特定网络中的应用通讯
  • 广播通讯(广播、多播)
  • Socket的TCP通讯流程图:
  1. 服务端:通过socket()初始化一个socket,bing()绑定端口号,listen()监听端口,accept()阻塞直到有客户端连接。
  2. 客服端:通过socket()初始化一个socket,connect() 与服务端建立连接
  3. 如果连接成功,便可互相发送接受数据
  • Socket的TCP的“三次握手,四次挥手”图:



  1. 当客户端调用connect时,触发了连接请求,向服务器发送了SYNJ包,这时connect进入阻塞状态;
  2. 服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态
  3. 客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立



  1. 某个应用进程首先调用 close 主动关闭连接,这时 TCP 发送一个 FIN M
  2. 另一端接收到 FIN M 之后,执行被动关闭,对这个 FIN 进行确认。它的接收也作为文件结束符传递给应用进程,因为 FIN 的接收意味着应用进程在相应的连接上再也接收不到额外数据
  3. 一段时间之后,接收到文件结束符的应用进程调用 close 关闭它的 socket。这导致它的 TCP 也发送一个 FIN N
  4. 接收到这个 FIN 的源发送端 TCP 对它进行确认。这样每个方向上都有一个 FIN 和 ACK
  • Socket的UDP通讯流程图:



相对TCP,UDP少了connect()的建立连接,也没有三次握手和四次挥手