SO_REUSEADDR

这个选项用来设置socket断开之后,是否允许马上复用之前的地址

当TCP衔接封闭的时分,自动封闭衔接的一方会进入TIME_WAIT状况。在这种状况下,该衔接的端口无法被复用。TIME_WAIT状况会继续2MSL(Maximun Segment Lifetime),一般为4分钟。

一般我们期望游服重启之后能够马上绑定之前的端口,因此会设置为true。

SO_BACKLOG

这个选项用来设置衔接行列的大小。

客户端向服务器发送的TCP衔接恳求会被放入到衔接行列中,服务器会通过accept()方法从行列中取出恳求并进行处理。当衔接行列满的时分,新来的衔接恳求就会被操作系统丢掉掉。

衔接行列的大小不能太大,也不能太小。行列过小的话,当服务器接收到很多的衔接恳求,行列很快就会满,导致很多衔接恳求被丢掉掉了;行列也不能过大,这会占用不必要的系统内存,并且过大的行列会导致TCP衔接恳求的均匀处理时刻过大,然后可能会呈现行列中存在过多的失效衔接恳求。关于失效的衔接恳求,客户端可能会触发重连机制,这样会糟蹋服务器的功能。

TCP_NODELAY

这个选项表明是否禁用Nagle算法

Nagle算法是用来提升TCP协议传输功率的算法。通过将多个小的报文合并成一个大的报文再发送,然后提交传输功率,但是这也会相应的增加协议的延时。

关于游戏这种对数据实时性要求比较高的运用来说,会禁用Nagle算法然后提高数据的实时性。

SO_KEEPALIVE

这个选项表明是否敞开TCP衔接存活检测。

它的运行机制如下:

  1. 假如通信双方超过两个小时没有数据交换,那么敞开SO_KEEPALIVE的一方会发送一个keep-alive包给对方。
  2. 假如对方返回ack,那么表明衔接正常,本方会距离两小时再发送keep-alive包。
  3. 假如对方返回rst,那么表明对方程序已在崩溃后重启,这时本方也应该封闭衔接。
  4. 假如对方一直没有回应,本方会距离75秒重新发送keep-alive包,循环发送直至次数上限,最后封闭衔接。

SO_KEEPALIVE的意义是维持长衔接不断开,削减重复创立衔接带来的开销。它的缺陷是keep-alive包发送的距离时刻过长。在实际的游戏服务器中,很难想象会存在长达两小时的时刻没有数据通信。因此,在游戏服务器开发中,一般会选择自己完成运用层的心跳包机制,运用更短的心跳包距离,然后更好的检测衔接是否可用以及玩家的在线情况。

这个选项的敞开关于游戏服务器来说是可选的。

SO_TIMEOUT

这个选项的作用是设置socket堵塞操作的超时时刻。

堵塞操作包含accept、read和UDP的receive。其间影响最大的是read操作。在游戏服务器中,典型的运用场景是先发送消息后接收回包,存在于客户端与服务器、服务器与服务器之间。在这些场合运用堵塞读时需要设置超时时刻。

若不设置超时时刻,SO_TIMEOUT会取系统默许的超时时刻0,即没有超时时刻。这样有可能会永久堵塞进行IO操作的线程。因此,在任何时分都应该为堵塞操作设置一个超时时刻。

CONNECT_TIMEOUT_MILLIS

这个选项是设置TCP衔接恳求的超时时刻。

这个时刻是从客户端建议TCP衔接恳求到服务器成功树立TCP衔接的最大超时时刻,若超出这个时刻,那么操作系统就会以为这个TCP衔接恳求超时不进行处理。

参阅

游戏服务器开发指南(一):设置适宜的Socket选项 – 知乎 (zhihu.com)