几乎无处不在的 sockets

什么是 sockets ?

我自己接触 sockets 是因为学习 Python Web 编程。

现在想想,学校安排的暑期实习项目的核心也是 sockets 编程,但当时自己懵懵懂懂,虽然使用 sockets 做出了一个简易的通讯模块,但并依然不知道 sockets 的重要性,只知道它和网络通信有关,还有一个不知所云的翻译:「套接字」。

后来,自己慢慢开始了解计算机最基础的软硬件系统,学习到多线程以及端到端的通信时,再次遇到了 sockets 通讯,记住了一句话:计算机间的通信,在本质上依然是计算机进程或线程之间的通信,就像计算机的进程间通讯一样。

之后自己也不怎么用得到这部分知识,学到这么一点也基本被遗忘了。

直到昨天的面试中涉及到 sockets 编程,但自己竟然忘光了,只能写一点框架。

所以决定今天好好了解一下 sockets 到底是个什么东西。

sockets 是 IPC 的一种形式。

在计算机科学中,IPC 是 inter-process communication 的缩写,意思是「进程间通信」。说到计算机的进程间通信,必然和不同的操作系统有关系,而 sockets 作为网络通讯的「核心基础」,也就要跨平台实现不同操作系统进程间的网络通讯,当然,在同一台计算机上也是可以 sockets 通信的。

在某一种具体的操作系统中,都有比 sockets 更快的 IPC 形式,但在互联网的世界里,跨平台是必然的。而在跨平台的 IPC 形式中,sockets 大约是唯一的玩家。

sockets 的最基础概念

sockets 实现的是端到端的通信。粗略地讲,这里的端首先要分为两类:

这样,一个 socket 库就要分别具备 client 和 server 的功能,在建立一个具体的 socket.socket() 之后,使用 connect() 方法生成一个连接到某一个 server 的 client,之后使用 send 和 recv 发送和接收;使用 bind() 方法生成一个具备独家地址的 server ,随后通过 listen() 方法开始监听来自客户端的请求,并可指定可同时监听的客户端数目,最后,在一个循环中使用 accept() 方法接收来自 client 的请求,并可使用 recv() 方法获取请求内容,使用 send() 方法发送响应内容。

此外,还有一点需要注意,由于需要不停地在 send 和 recv 之间切换,所以需要在切换之前使用 flush 清掉之前的 buffer 缓存。

因为网络环境的复杂性引起的 sockets 通信的复杂性

sockets 通信用一句话概括就是:client 端发送请求,sever 获取client 请求内容,并发送响应内容,client 端接收响应内容。

问题在于,具体实现的时候,我们如何判断并保证发送和接收的完整性和及时性。

保护完整性是一个问题,一般通过一些 client 和 server 共同遵守的通信协议来实现。

保障及时性是另一个问题。及时性是对于大规模请求的及时到达问题。应付大规模请求,必须使用 non-block 也就是非阻塞技术:

总结

以上是最基础的使用背景,涉及到一些概念,很粗略,但至少可以作为一个完整的 sockets 入门中的基础入门了,日后用到的话,来翻阅自己写的东西,肯定要方便一些,也能唤醒一些鲜活的记忆。


不知是该恭喜,还是该怎样,总之阅读到该文的,你是第 人。每一次刷新,都是不同的自己。