1、Socket是什么
Socket是一个抽象层,主要是把TCP/IP层复杂的操作抽象为几个简单的接口提供给应用层调用,进而实现应用进程在网络中通信。Socket主要是端到端之间的传输协议(网络层之上的协议)。因为Socket是一种高层的抽象网络API,是一种端到端的通信,只能访问到端到端协议之上的网络层和传输层。
Socket起源于Unix,在Unix中,一切皆文件,Socket也不例外,是一种打开-读/写-关闭
的模式实现的。在服务器和客户端各自维护了一个文件。
2、基于TCP的Socket通信交互流程
我们先来看一下基本TCP客户/服务器程序的套接字函数调用过程:
TCP Socket的文件结构
在内核中,Socket是一个文件,不过Socket对应的inode不是保存在硬盘上,而是在内存中,该inode指向了Socket在内核的Socket结构。内核的Socket接口主要由两个队列:发送队列,接收队列。
内核为监听套接字维护的两个队列
对于每个监听Socket,内核都为其维护了两个队列:
- 未完成队列(incomplete connection queue):这个队列的套接字服务端正在等待完成TCP三次握手,处于SYN_RCVD状态;
- 已完成连接队列(completed connection queue):完成了三次握手的Socket连接会进入这个队列,处于ESTABLISHED状态。
如下图:
3、基于UDP的Socket通信交互流程
UDP不需要三次握手,所以不需要listen和connect,但是交互仍然需要IP和端口号,需要bind。
UDP不用维护连接状态,所以不需要针对每个连接建立一组Socket,只需要一个就可以了。
以下是UDP的Socket通信交互流程图:
到目前为止,我们把物理层、数据链路层、网络层、传输层主要的协议和功能都介绍了一遍。基于这些底层的协议栈支撑,我们可以很快的构建出应用层的程序,接下来我们简单讲一下应用层。