Socket通信原理

什么是Socket:

Socket是在应用层和传输层之间的一个抽象层,是将TCP/IP层复杂的操作抽象为几个简单的接口。

Socket起源于UNIX

Unix的思想是:一切接文件

Socket是一种“打开--读/写--关闭”模式的实现。

Socket所在位置

Socket通信过程:

对于网站,通信模型是服务器与客户端之间的通信。

两端都会建立一个Socket对象,通过Socket对象对数据进行传输。

通常服务器处于一个无限循环,等待客户端的连接。

面向连接的TCP时序图

客户端过程:

创建Socket-->连接服务器-->将Socket与远程主机连接(Tips:只有TCP才有“连接”的概念,一些Socket如UDP、ICMP、ARP没有“连接”的概念)-->发送数据-->读取响应数据-->等待数据交换完毕-->关闭连接-->结束TCP对话。

服务端过程:

初始化Socket-->建立流式套接字 --> 与本机地址及接口进行绑定 -->通知TCP -->准备接受连接 --> 调用accept()阻塞 --> 等待来自客户端的链接 --> (客户端与服务器建立链接后:客户端发送数据请求 --> 服务器接受请求并处理请求 --> 将响应数据发送给客户端 --> 客户端读取数据 --> 等待数据交换完毕) --> 关闭链接 --> 交互结束。

TCP三次握手的Socket过程:

  • 服务器调用socket() bind() listen() 完成初始化后,调用 accept() 阻塞等待
  • 客户端Socket对象调用connect()向服务器发送一个SYN并阻塞
  • 服务器完成了第一次握手(发送SYN、ACK应答)
  • 客户端收到服务端发送的应答之后,从connect() 返回,再发送一个ACK给服务器;
  • 服务器Socket对象接收客户端第三次握手ACK确认,此时服务端从accept()返回,建立链接
  • (解释任然不清楚)

TCP四次挥手的Socket过程:

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

服务端的代码只有处理完一个客户端请求才会去处理下一个客户端请求,这样服务器的处理能力很弱,而实际中服务器都需要有并发处理能力,为了达到并发处理,服务器需要fork一个新的进程或线程去处理请求。

原文地址:https://www.cnblogs.com/yourGod/p/9154989.html