什么是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通讯流程图:
- 服务端:通过socket()初始化一个socket,bing()绑定端口号,listen()监听端口,accept()阻塞直到有客户端连接。
- 客服端:通过socket()初始化一个socket,connect() 与服务端建立连接
- 如果连接成功,便可互相发送接受数据
- Socket的TCP的“三次握手,四次挥手”图:
- 当客户端调用connect时,触发了连接请求,向服务器发送了SYNJ包,这时connect进入阻塞状态;
- 服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态
- 客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立
- 某个应用进程首先调用 close 主动关闭连接,这时 TCP 发送一个 FIN M
- 另一端接收到 FIN M 之后,执行被动关闭,对这个 FIN 进行确认。它的接收也作为文件结束符传递给应用进程,因为 FIN 的接收意味着应用进程在相应的连接上再也接收不到额外数据
- 一段时间之后,接收到文件结束符的应用进程调用 close 关闭它的 socket。这导致它的 TCP 也发送一个 FIN N
- 接收到这个 FIN 的源发送端 TCP 对它进行确认。这样每个方向上都有一个 FIN 和 ACK
- Socket的UDP通讯流程图:
相对TCP,UDP少了connect()的建立连接,也没有三次握手和四次挥手