2.4 Why UDP? (为什么使用UDP?)
2.4 Why UDP? (为什么使用UDP?)
一个经常被问到的问题是为什么 RADIUS 使用 UDP 而不是 TCP 作为传输协议.UDP 的选择纯粹是出于技术原因.
有许多问题必须被理解.RADIUS 是一个基于事务的协议, 具有几个有趣的特性:
-
如果对主认证服务器的请求失败, 则必须查询辅助服务器.
为了满足这一要求, 必须在传输层之上保留请求的副本以允许替代传输.这意味着仍然需要重传定时器.
-
此特定协议的时序要求与 TCP 提供的显著不同.
在一个极端情况下, RADIUS 不需要对丢失数据进行 "响应式" 检测.用户愿意等待几秒钟以完成认证.通常激进的 TCP 重传 (基于平均往返时间) 不是必需的, TCP 的确认开销也不是必需的.
在另一个极端情况下, 用户不愿意等待几分钟进行认证.因此, 两分钟后可靠传递 TCP 数据是没有用的.更快地使用备用服务器允许用户在放弃之前获得访问权限.
-
该协议的无状态特性简化了 UDP 的使用.
客户端和服务器来来去去.系统被重新启动或独立地进行电源循环.通常这不会造成问题, 通过创造性的超时和对丢失的 TCP 连接的检测, 可以编写代码来处理异常事件.然而, UDP 完全消除了所有这些特殊处理.每个客户端和服务器可以只打开一次它们的 UDP 传输, 并在网络上的所有类型的故障事件中保持打开状态.
-
UDP 简化了服务器实现.
在 RADIUS 的最早实现中, 服务器是单线程的.这意味着接收、处理和返回单个请求.在后端安全机制需要实时 (1 秒或更长时间) 的环境中, 这被发现是无法管理的.服务器请求队列会填满, 在每分钟对数百人进行认证的环境中, 请求周转时间增加到超过用户愿意等待的时间 (当数据库中的特定查找或通过 DNS 的查找花费 30 秒或更长时间时, 这尤其严重).显而易见的解决方案是使服务器多线程化.使用 UDP 很容易实现这一点.生成单独的进程来服务每个请求, 这些进程可以直接使用简单的 UDP 数据包响应客户端 NAS 到客户端的原始传输.
这并非万能良药.如前所述, 使用 UDP 需要 TCP 内置的一件事: 使用 UDP, 我们必须人为地管理到同一服务器的重传定时器, 尽管它们不需要 TCP 提供的相同时序关注.这一个代价是为 UDP 在此协议中的优势付出的小代价.
没有 TCP, 我们可能仍然会使用用绳子连接的锡罐.但对于这个特定的协议, UDP 是一个更好的选择.