2 回答
TA贡献1825条经验 获得超4个赞
仅通过查看加密数据无法可靠地区分“正常”HTTP 流量和 Websockets。
人们可以通过查看流量模式来尝试做一些启发式方法,即在哪个方向上在哪个时间传输了多少数据以及数据之间有多少空闲时间。这种启发式可以基于以下假设:HTTP 是一种请求 + 响应协议,通常小请求紧随其后是较大的响应,而 Websockets 可以显示任意流量模式。
但任意流量模式也意味着 Websockets 也可以以请求 + 响应的方式使用。(虽然包括请求+响应)。此外,在某些用例中,HTTP 的使用模式主要由大请求和小响应组成。因此,根据应用程序的类型,这种启发式方法可能会成功,也可能会失败。
TA贡献1856条经验 获得超17个赞
定义全局服务器超时始终是一个好习惯,以确保资源不会永远被锁定。该超时不应小于所有处理程序中最长的超时。
DefaultServer = &http.Server{
Handler: http.TimeoutHandler(handler, wssTimeout, timeoutResponse),
...
}
在处理 http 和 wss 请求的 handler 中,我们需要动态设置超时时间。
func (proxy *ProxyHttpServer) handleHttps(w http.ResponseWriter, r *http.Request) {
// Request Context is going to be cancelled if client's connection closes, the request is canceled (with HTTP/2), Server we created above time outed.
// all code down the stack should respect that ctx.
ctx := r.Context()
timeoit := httpTimeout
if itIsWSS(r) {
timeout = wssTimeout
}
ctx, cancel = cWithTimeout(ctx, timeout)
defer cancel()
// all code below to use ctx instead of context.Backgound()/TODO()
- 2 回答
- 0 关注
- 102 浏览
添加回答
举报