Socket通信整理记录

Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。Socket是一种“打开-读/写-关闭”的模式实现,服务器和客户端各自维护一个“文件”。在建立连接打开后,可以向文件写入内容供对方读取或者读取对方的内容,通讯结束时关闭文件。


Socket通信过程

Socket保证了不同计算机之间的通信,也就是网络通信。对于网站而言,通信模型是服务器和客户端之间的通信,两端都建立一个Socket对象,然后通过Socket对象对数据进行传输,通常服务器处于一个无限循环,等待客户端的连接。


客户端过程

创建Socket,连接服务器,将Socket与远程主机连接(只有TCP有连接的概念,其他的没有),发送数据,读取响应数据,直到数据交换完毕,关闭连接,结束TCP对话。

服务端过程

服务端先初始化Socket,建立流式套接字,与本机地址及端口进行绑定,然后通知TCP,准备好接收连接,调用accept()阻塞,等待来自客户端的连接。
如果这时客户端与服务器建立了连接,客户端发送数据请求,服务器接收请求并处理请求,然后把响应数据发送给客户端,客户端读取数据,直到数据交换完毕,最后关闭连接,交互结束。
调用accept(),Socket会进入等待状态,客户端请求连接时,方法建立连接并返回服务器。accpet()返回一个含有两个元素的元组(conn,addr)。第一个元素是新的Socket对象,服务器必须通过它与客户端通信,第二个元素是客户端的ip地址及端口。

服务器和客户端通过send()和recv()通信。服务器调用send(),并采用字符串形式向客户端发送信息,send()返回已发送的字符个数。服务器调用recv()从客户端接收信息。调用recv(),服务器必须指定一个整数,对应于可通过本次方法调用来接收的最大数据量。recv()在接收数据会进入“blocked”状态,最后返回一个字符串,用它表示收到的数据,如果超过了最大值,数据被截断。缓冲在接收端,后续调recv(),多余的数据会从缓冲区删除,传输结束,服务器调用Socket的close()关闭连接。

TCP三次握手的Socket过程

  • 服务器调用socket()、bind()、listen()完成初始化后调用accept()阻塞等待;
  • 客户端Socket对象调用connect()向服务器发送一个SYN(同步序列编号Synchronize Sequence Numbers)并阻塞;
  • 服务器完成了第一次握手,即发送SYN和ACK(确认字符Acknowledge character)应答;
  • 客户端收到服务器发送的应答后,从connect()返回,再发送一个ACK给服务器;
  • 服务器Socket对象接收客户端第三次握手ACK确认,此时服务器从accept()返回,建立连接。

TCP四次挥手的Socket过程

  • 某个应用进程调用close()主动关闭,发送一个FIN(结束finish);
  • 另一端接收到FIN后被动执行关闭,并发送ACK确认;
  • 之后被动执行关闭的应用进程调用close()关闭Socket,并也发送一个FIN;
  • 接收到这个FIN的一端向另一端ACK确认

你可能感兴趣的:(Socket通信整理记录)