目录UDP 连接实验基础配置reuseportproxy_xxx directives动态代理总结
UDP 连接
众所周知,UDP 并不像 TCP 那样是基于连接的。但有些时候,我们需要往一个固定的地址发送多个 UDP 来完成一个 UDP 请求。为了保证服务端能够知道这几个 UDP 包构成同一个会话,我们需要在发送 UDP 包时绑定某个端口,这样当网络栈通过五元组(协议、客户端IP、客户端端口、服务端IP、服务端端口)进行区分时,那几个 UDP 包能够分到一起。通常我们会把这种现象称之为 UDP 连接。
但这样又有了一个新的问题。不同于 TCP 那样有握手和挥手,UDP 连接仅仅意味着使用固定的客户端端口。虽然作为服务端,由于事先就跟客户端约定好了一套固定的协议,可以知道一个 UDP 连接应当在何处终止。但如果中间使用了代理服务器,那么代理是如何区分某几个 UDP 包是属于某个 UDP 连接呢?毕竟没有握手和挥手作为分隔符,一个中间人是不清楚某个会话应当在何处放下句号的。
通过下面的实验,我们会看到 Nginx 是如何处理这个问题的。
实验
在接下来的几个实验中,我都会用一个固定的客户端。这个客户端会向 Nginx 监听的地址建立 UDP “连接”,然后发送 100 个 UDP 包。
// save it as main.go, and run it like `go run main.go`
package main
import (
“fmt”
“net”
“os”
)
func main() {
conn, err := net.Dial(“udp”, “127.0.0.1:1994”)
if err != nil {
fmt.Printf(“Dial err %v”, err)
os.Exit(-1)
}
defer conn.Close()
msg := “H”
for i := 0; i
暂无评论内容