Socket,也称“套接字”,用于描述IP地址和端口,是一个通讯链的句柄,能够用来实现不一样虚拟机或不一样计算机之间的通讯。咱们知道不一样的程序之间的网络通信是要经过端口来区分的。简单来讲,网络上的两个程序经过一个双向的通讯链接实现数据的交换,这个链接的一端称为一个socket,而创建网络通讯链接至少要一对端口号(socket)。服务器
Socket本质是对TCP/IP的封装,是一套用来实现TCP或UDP通信的API。 根据网络通信的OSI参考模型的定义,IP位于网络层,TCP/UDP位于传输层,HTTP位于应用层,而Socket位于传输层和应用层之间,是它们以前的桥梁。网络
TCP传输协议:TCP是面向链接的,须要“三次握手,四次挥手”,是可靠的传输,用来传输大的数据,可是,创建时间要花费时间和资源,相对于UDP速度较慢。socket
UDP:UDP是面向无链接的,发送端不会关心数据是否到达目标端,简单高效。常常用于如下几方面:函数
Socket的TCP通信流程图: 3d
- 服务端:经过socket()初始化一个socket,bing()绑定端口号,listen()监听端口,accept()阻塞直到有客户端链接。
- 客服端:经过socket()初始化一个socket,connect() 与服务端创建链接
- 若是链接成功,即可互相发送接受数据
- 当客户端调用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
相对TCP,UDP少了connect()的创建链接,也没有三次握手和四次挥手cdn