觉得有帮助请点赞关注收藏~~~
Socket编程,就是对网络中不同主机上的应用进程进行双向通信的端点的抽象,一个Socket就是网络上进程通信的一端,提供了应用层利用网络协议交换数据的机制,从所处的地位来讲,Socket上连应用进程,下连网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议进行交互的接口
提起Socket就不得避免的要说到TCP/IP 而Socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口,也就是复杂的TCP/IP协议族隐藏在Socket接口后面,让Socket去组织数据,以符合指定的协议
一、Socket简介
上面已经知道网络中的进程是通过Socket通信的,Socket起源于UNIX 而UNIX/LINUX基本原理之一就是一切皆文件,都可以用打开读写模式操作,Socket相当于是一个特殊的文件,Socket函数就是对网络进行的操作。
Socket的任务就是让服务器端和客户端进行连接,然后发送数据,先从服务端说起,服务端先初始化Socket,然后与端口绑定,对端口进行监听,调用Accept函数阻塞,等待客户端连接,在这时,如果客户端初始化一个Socket,然后连接服务器,如果连接成功,这时客户端与服务器端的连接就建立了,客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束
二、Socket函数的基本使用
Socket函数,既然Socket是 Open-Write/Read-Close模式的一种实现,那么Socket就提供了这些操作对应的函数接口
public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType,protocolType);
Bind函数
当调用Socket函数创建一个Socket对象时,返回的Socket对象存在于协议族空间中,但没有一个具体的地址,要想给他赋予一个地址,就必须调用Bind函数 否则会随机分配一个端口
public void Bind(EndPoint localEP);
Listen,Connect函数
如果一台服务器在调用Socket Bind函数后 就会调用Listen函数监听这个Socket对象,如果客户端这时调用Connect函数发出连接请求,服务器端就会接收到这个请求
Accept函数
调用完上面的函数后,服务器端会调用Accept函数接收请求,这样连接就建立好了,此时就可以进行网络IO操作了,Accept函数代表启动TCP连接
public Socket Accept();
Send,Receive函数
Receive函数负责读取内容,Send函数将buffer中的bytes字节内容发送出去
Close函数
完成上述操作后要关闭响应的Socket对象,就像操作完文件后要调用Close函数关闭文件一样
public void Close();
三、Socket中TCP的三次握手详解
我们知道TCP建立连接时要进行三次握手,三次握手即建立TCP连接,就是指建立一个TCP连接时,需要客户端总共三个包以确认连接的建立,在Socket编程中,这一过程由客户端执行Connect出发
第一次握手:客户端执行Connect函数触发连接,将标识位SYN置为1,并产生一个随机值sqe=j,并将该数据包发送给服务器端,客户端进入发送状态,等待服务器端确认
第二次握手:服务器端收到数据包后由标识位SYN=1知道客户端请求建立连接,客户端将标识位SYN置为1,然后令ACK=J+1 并产生一个随机数seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入接收状态
第三次握手: 客户端收到数据包后,检查ACK是否为J+1,如果正确则将标识位ACK置为1,之后再令ACK=k+1,并将数据包发送给服务器端,服务器端检查ACK是否为K+1,如果正确则连接成功,客户端和服务器端进入成功状态,完成三次握手,客户端和服务器端就可以开始传输数据
四、Socket中TCP的四次挥手
结束连接时TCP需要四次挥手 如下图所示
某个应用进程首先调用Close函数主动关闭连接,这时TCP发送一个FIN M
另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认,它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到其他数据
一段时间之后,接收到文件结束符的应用进程调用Close函数关闭它的Socket,这会使他的TCP也发送一个FIN N
接收到这个FIN的源发送端的TCP对它进行确认,这样每个方向上都有一个FIN和一个ACK
创作不易 觉得有帮助请点赞关注收藏~~~