Origin X Documentation

天行有常,不为尧存,不为桀亡。——荀子《天论》

TCP协议中的Reuse

既然Vert.x中已经出现了,那么这个章节我们就谈谈TCP协议中的Reuse,我不是这一块的专家,但尽可能收集相关资料加上自己的解读,把这一块的内容呈现给读者。

如果说《后记》表示文章后边的一部分补充记录,还不如解释成:思考过后的记录。

本来想通过这篇文章来详细阐述一下关于TCP连接复用的内容,后来想想引用文【Reference】已经很详细了,毕竟本书不是大百科,所以直接针对Vert.x中的参数部分来讲解复用的点。

Vert.x的NetworkOptions有下边两个参数:

Json配置节点 set方法名 默认值
reuseAddress setReuseAddress DEFAULT_REUSE_ADDRESS = true
reusePort setReusePort DEFAULT_REUSE_PORT = false

1. 地址复用

Address Reuse,又称为地址复用(对应底层TCP协议中的SO_REUSEADDR套接字),它主要包含了以下功能:

  1. 它允许启动一个监听服务器并且绑定一个开放的端口——即使这个端口已经被以前的连接占用过。
  2. SO_REUSEADDR允许在同一个端口上启动同一个服务器的多个实例,只要每个实例绑一个不同的本地IP即可。
  3. SO_REUSEADDR允许单个进程捆绑同一个端口到多个套接字上,只要每次捆绑指定不同的本地IP地址即可。
  4. SO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口已绑定到某个套接字上时,如果传输协议支持,同样的IP地址和端口还可以绑定到另一个套接字上。——一般来说,本特性仅支持UDP套接字。

这里解释一下在已经占用的端口上绑定一个开放的端口

一般是这样处理:

  • 1)启动一个监听器。
  • 2)连接请求到的,派生一个子进程来处理这个客户端。
  • 3)监听服务器终止,但子进程继续为现有已经连接上的客户端提供服务。
  • 4)重启监听服务器。

默认情况下,当监听服务器在步骤4中调用socket, bind, listen重新启动时,由于它试图捆绑一个现有连接上的端口,从而bind调用会失败。但是如果该服务器在socket和bind两个调用之间设置了SO_REUSEADDR套接字选项,那么bind将会成功,所有的TCP服务器都应该制定该套接字选项,允许服务器在这种情形下被重启。

2. 端口复用

Port Reuse,又称为端口复用(对应底层TCP协议中的SO_REUSEPORT套接字),它主要包含下边几个功能:

  1. 该选项允许完全重复的捆绑,不过只有在想要捆绑的同一个IP地址和端口的每个套接字都指定了本套接字选项时才行。
  2. 如果被捆绑的IP地址是一个多播地址,那么这两个选项被认为是等效的。