如果一个 sock 代理可以连接多个客户端,并且所有客户端都同时发送和接收数据,那么代理如何跟踪每个单独的请求?
由于它们都连接到同一个端口上的同一个 IP 地址,代理如何知道谁请求了什么以及将答复发送给谁?
答案1
袜子运行于OSI 第 5 层(会话层),因此它可以添加有关流的其他信息,包括目的地信息。这被称为电路级网关。
对于代理 TCP 连接,当客户端请求在 socks 代理和目标之间建立 socks 连接时,客户端会发送 CONNECT 命令,其中包含目标信息。此时服务器会记录客户端地址/端口,因此它知道哪个客户端请求了该连接。
然后代理服务器建立TCP 连接与目标服务器进行通信,这涉及协商序列号。此号码可用于将连接中的所有数据包绑定在一起并与初始客户端请求绑定在一起。
在与代理的后续连接中,客户端使用 BIND 动词,该动词允许服务器区分客户端的第一个流与第二个、第三个……第 n 个流。它只需记住客户端信息和序列号。
对于代理 UDP 流,初始客户端 -> 代理通信在 TCP 中处理,调用 UDP ASSOCIATE 动词,这允许代理将 UDP 连接绑定到客户端并赋予其一个身份,通过该身份它可以将 UDP 流发送到客户端。
请参阅此处的规格详情:http://www.faqs.org/rfcs/rfc1928.html