Socket
1. 什么是Socket
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
socket本质是编程接口(API),对TCP/IP的封装,用来实现不同虚拟机或者计算机之间的通信,通常称为“套接字”。在Internet上的主机一般运行了多个服务软件,同时提供集中服务,每种服务打开一个socket,并绑定到一个端口上,不同的端口对应不同的服务。
具体而言:我们利用ip地址+协议+端口号唯一标示网络中的一个进程,然后利用socket进行通信,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
2. Socket通信机制
服务器:服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。具体过程:
服务器:
1)socket():服务器首先根据地址类型(IPV4/IPV6)、socket类型及协议初始化socket。
2)bind():为socket绑定IP地址和端口号
3)listen():监听端口号请求,随时准备接受客户端发来的连接,这时服务器的socket并没有打开。
客户端:
4)socket:客户端创建socket()
5)connect():根据服务器的Ip地址和端口号试图连接服务器socket
服务器:
6)服务器socket接收到客户端socket的请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket处于阻塞状态。(TCP的三次连接)
客户端:
7)客户端连接成功,向服务器发送连接状态信息。
服务器端:
8)服务器端accept()方法返回,连接成功
客户端:
9)客户端向socket写入信息
服务器
10)服务器读取信息
客户端
11)客户端关闭
服务器端
12)服务器端关闭
3. 三次握手
在TCP/IP协议中,TCP协议通过三次握手建立一个可靠的连接
第一次握手:客户端尝试连接服务器,向服务器发送syn包(同步序列编号Synchronize Sequence Numbers),syn=j,客户端进入SYN_SEND状态等待服务器确认
第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手
定睛一看,服务器socket与客户端socket建立连接的部分其实就是三次握手