为什么socks5协议的服务器回复可以使用虚拟值?

时间:2016-10-12 03:30:25

标签: networking protocols network-protocols socks

我对socks5协议的握手过程感到困惑。根据{{​​3}}的第5页:

  

在对CONNECT的回复中,BND.PORT包含该端口号      服务器分配连接到目标主机,而BND.ADDR      包含关联的IP地址。提供的BND.ADDR经常是      与客户端用于到达SOCKS的IP地址不同      服务器,因为这样的服务器通常是多宿主的。这是预料之中的      SOCKS服务器将使用DST.ADDR和DST.PORT,以及      评估CONNECT时的客户端源地址和端口      请求。

似乎BND.ADDRBND.PORT是冗余且无用的。根据文章RFC1928

  
      
  • IPv4地址:00 00 00 00(我不知道为什么这是零,但由于代理将执行DNS解析并获取页面,因此本地主机不需要知道IP目标机器的地址,所以这显然只是虚拟数据。)
  •   
  • 端口号:00 00(显然也是虚拟值)
  •   

How Socks 5 Works

        self._write_to_sock((b'\x05\x00\x00\x01'
                             b'\x00\x00\x00\x00\x10\x10'),
                            self._local_sock)

似乎他们都建议在socks5服务器的回复中BND.ADDRBND.PORT是不重要的。

那么,为什么存在这两个冗余字段BND.ADDRBND.PORT

1 个答案:

答案 0 :(得分:0)

据我所知,涉及4个对象:

  • SOCKS5客户端
  • SOCKS5服务器
  • 中继服务器
  • 目标服务器

SOCKS5协议仅涉及SOCKS5客户端和SOCKS5服务器。真正的代理进程发生在SOCKS5客户端,中继服务器和目标服务器之间。

# SOCKS5 protocol 
SOCKS5 client <--> SOCKS5 server
# proxy process
SOCKS5 client <--> relay server <--> target server

BND.ADDRBND.PORT用于告诉SOCKS5客户端中继服务器所在的位置。但在大多数情况下,SOCKS5服务器是中继服务器(这意味着负责代理),因此返回BND.ADDR全零将告诉SOCKS5客户端作为中继服务器连接到SOCKS5服务器。