一、socket
什么是socket?
SOCKET称为套接字,它就可以看成一个文件接口,也可以看成一个文件。套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
socket函数:
int socket(int domain, int type, int protocol),
它会创建一个套接字描述符,套接字描述符是属于件描述符的一种。所以可以对套接字进行文件操作。
TCP通信步骤
1、首先你得搭建好服务器。有服务器才可以有客户端去连接,完成通信。
1)创建socket套接字接口
2)把socket套接字接口绑定在我们的一个固定地址中去,这个地址就是ip地址和端口的组合。这样,客户端connet的请求连接的时候就可以通过这个固定的地址实现通信。
3)监听这个套接字,就是对那个固定的地址实时监听。如果监听到有客户端连接的请求,就进行下一步的处理。如果没有将一直阻塞。等待客户端的请求。
4)如果收到客户端的请求,经历了三次握手成功之后。客户端和服务器也就建立了连接。就会生成一个新的套接字,。然后监听套接字就会继续的监听是否还有别的客户端请求连接。
5)可以对这个新的套接字文件描述符进行文件Io的操作实现通信。
2、客户端
1)客户端创建套接字接口
这里不需要进行绑定地址:有系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。
2)客户端对指定的地址(服务器的固定地址)发送连接请求。实现连接。
3)连接完之后客户端也会得到一个和服务器一样的新的套接字,对这个套接字实现文件ioj就可以完成通行。
———————————————————————————————————————————————
TCP三次握手过程
TCP建立连接的时候会经历三次握手过程,确认连接之后才会发送数据。
第一次握手:
握手只能由客户端发起连接请求。发送一个报文,告诉服务器我想请求连接。
第二次握手:
服务器接收到客户端发送的连接请求之后,会做出应答,发送一个报文。告诉客户端我接收到你的连接请求了,我现在的状态可以接收连接。
第三次握手:
客户端接收到服务器发过来的报文,也会做出应答,告诉服务器,我可以接收到你的报文,现在可以进行通信了。
如果进行握手过程中有任意一方断开或者没有接收到信号:
就会实现超时重传,当重传了设定次数(默认(为5次)之后就会断开连接。
——————————————————————————————————————————————————
四次挥手过程:
挥手过程可以由任意一方发起(当使用close套接字描述符)就意味着挥手的开始。
假设是客户端要断开连接。
1)第一次挥手:
客户端关闭套接字描述符,并给服务器发送一个FIN报文,告诉服务器我要断开连接了
2)第二次挥手:
服务器接收到客户端的断开请求,并发送一个应答,告诉客户端我接收到你的断开连接请求了。
3)第三次挥手:
当服务器接收到客户端的断开请求,之后它内部也会关闭套接字描述符,,并给客户端发送一个FIN报文,告诉客户端我也关闭了,套接字描述符。
4)第四次挥手:
客户端接收到服务器的FIN报文之后,做出应答告诉服务器我收到了,然后断开连接。
——————————————————————————————————————————————————————
编程代码: