Socket

Socket 是什么

如果要连接一台互联网中的设备,首先需要知道它的 IP。但只有 IP 是不能建立连接的,还需要知道 Port (端口)。
IP 像是一栋建筑的地址,而 Port 则是建筑内具体的房间号。Socket 则是 IP + Port。
当然,不是知道了 IP + Port (也就是 Socket) 就一定能建立连接,继续使用 建筑+房间 举例子的话,也就是房间都关着是进不了门的。

一般来说,互联网上真正的地址,是 协议名://IP:端口,比如 http://192.168.1.1:80 这样的。

注: ping 的协议 (ICMP) 比较特殊,并不需要绑定某个端口。一般 ping 某个 IP,是看这台设备是否在线,但是 ping 不通也未必是不在线,因为对方可以不允许 被 ping

Socket 与 Connections

一台设备的端口是有总数限制的,6 万多个,具体的数字你可以很容易查到。端口总数的限制,就像 IP (一栋建筑) 内的 房间数 是有限制的。
这个限制,对于服务器端来说,倒是可有可无的。因为一个端口 (房间) 一旦被某个程序占据之后,别的程序就无法占用了,换句话说,服务器端基本上不会出现需要开出 6 万多个 (端口) 房间来提供服务的,一个程序一般也只要占用一个端口就足够了,哪怕它服务再多的用户。
但对于客户端来说,这个限制倒真可能会被碰到 (虽然也是罕见的)。我们客户端要连到服务器端的端口,可能会在自己本地开很多个端口,同时连接到 服务器上的某个端口,简而言之,就是多对一了。

端口数有物理上的绝对限制,但对于 Connections (连接数) 来说,则没有这个绝对限制,瓶颈主要取决于当前服务器的性能。我们继续举例子,IP 是一栋建筑,Port 是房间,而 Connections 则是来到这个房间的。房间有总数限制 (硬性限制),一个房间内的人数也是有限制的 ,但人数的限制是软性限制,根本上来说,取决于硬件的性能。
上段中说到,客户端可以有多个端口连到同一个服务器端的端口,就像你在服务端的一个房间内,看到好几个长得很像的,他们实际上是同一个人,只是不同的分身而已。

打比方 总是不准确的,希望这个不准确的 打比方 能让你理解 IP、Port、Socket、Connections 的逻辑关系,领会了,就是很简单的事情。

TCP 与 UDP

两个 Socket 之间需要进行数据传输,而 TCP 与 UDP 是数据传输的两种协议 (方式)。
一般来说, TCP 是比 UDP 更稳定的协议。它会经过三次握手,双方的 IP 是不能伪造的,而 UDP 则不然,更注重发数据出去,不做多余的校验,A 通过 UDP 发数据给 B,B 按照数据包中的信息,提取到 A 的 IP,但这个 IP 可能是伪造的。

假设,我们现在通过 Socket 直接传输 1、2、3,TCP 是会接收到 1、2、3 顺序的,而 UDP 则可能是 2、1、3 这样乱序的,虽然乱序的概率也是很低的。

对于我们普通的产品人、开发者而言,并不同太关心 TCP、UDP 的区别。合适的场景下进行选择就好了, DNS 服务器默认要用到 UDP,Web 服务器要用到 TCP。如果自己有特别服务要对应,选择什么协议,按需即可。

很多人,都会认同这种说法:HTTP 协议是 Web 的基础,Web 的数据传输是通过 TCP 协议传输的,使用 TCP 而不是 UDP,是因为 UDP 的不可靠
但是,不可靠如果量化的话,到底到多少才不可靠呢?如果是 0.0001% 的不可靠,其实就可以约等于可靠了。而且 UPD 也能增加其它高效的校验方式,提升可靠性。
有些偏见,会随着技术本身的发展,会逐渐瓦解。据说 HTTP/3 协议,将会使用 UDP,作为数据传输的协议。