在欺诈领域,这些被称为速度控制,而在流量管理中,它类似于“流量整形”。基本上,您允许每个时间段的有限使用,例如,您可能只允许 10 个请求/分钟/IP 地址。
对于每个“请求”,确定远程地址(C 中的 getpeername()),此函数将始终是远程用户的 IP 地址。然后简单地计算每个时间段如何处理请求,如果超出限制,请执行任何操作。在伪代码中
Get block for remote ip
If time-now is new window, then reset usage to zero
Add one to usage count
If usage > allowance then .....
Else if usage > allowance*0.75 then slow-down
Else ok
虽然我展示了一个周期,但大多数实现通常是多个周期的平均值,例如每分钟一小时等。它们也倾向于允许突发并且只限制持续负载,但这取决于您希望允许的配置文件。
如果这是针对 API 的,那么简单地减慢请求而不是提供硬错误是正常的。不能保证另一端的客户端会处理该错误。如果是用户屏幕,则可以显示超出限制。
您当然可以通过任何您希望的维度进行限制,IP 地址、引用、浏览器类型!、pageurl、cookie。如果您使用 getpeername,请注意,如果多个并发用户位于公共专用路由器后面,则他们都可以拥有相同的远程 IP 地址。