套接字简史(探索SO_REUSEPORT、SO_REUSEPORT)


从套接字的起源探索SO_REUSEPORT、SO_REUSEPORT参数在不同系统的异同

今天在研究套接字的时候,发现 SO_REUSEPORT、SO_REUSEPORT 这两个参数,在不同类型的操作系统中他们经常不一样,有的操作系统甚至没有 SO_REUSEPORT 这个参数。

所以这两个参数究竟有什么不同,在不同操作系统上又有什么限制。

这要从 1977 年讲起。

套接字的起源

1977至1995年加州大学伯克利分校开发和发布了 BSD (Berkeley Software Distribution,伯克利软件套件)(Unix的衍生系统)

(话外音: 今天,“BSD”并不特指任何一个BSD衍生版本,而是类UNIX操作系统中的一个分支的总称。)

BSD 套接字的实现是所有套接字实现的基础。基本上,所有的套接字都是在某个时间点复制了 BSD 套接字的实现,开始自行发展。就像你在 github 上 fork 了一个分支,然后开始自行发展。

同时,BSD 的套接字也在不断的演进。相当于你 fork 的那家还在发展。

这就导致了,后边复制它的系统具有早期复制它的系统所没有的功能。

(话外音:看来理解BSD套接字实现是理解所有其他套接字实现的关键呀)

套接字的使用

一个 TCP/UDP 的连接由这五个值构成:{, , , , } 这五个元素的组合的唯一值(unique)可以标识一个连接(任何两个连接不能五个值全都一样)。

首先通过 socket() 来创建一个套接字协议,然后通过 bind() 来绑定源地址和端口。