-----------------------------------------------------------------------------------------------------------------------------------------------
SOCKS 5协议详解
由于在有些软件用到了socks5(如oicq,icq等),对其原理不甚了解,相信很多朋友对其也不是很了解,于是仔细研读了一下rfc1928,觉得有必要译出来供大家参考。 
1.介绍: 
  防火墙的使用,有效的隔离了机构的内部网络和外部网络,这种类型的Internet 架构变得越来越流行。这些防火墙系统大都充当着网络之间的应用层网关的角色,通常提供经过控制的Telnet,FTP,和SMTP访问。为了推动全球信息的交流,更多的新的应用层协议的推出。这就有必要提供一个总的架构使这些协议能够更明显和更安全的穿过防火墙。也就有必要在实际上为它们穿过防火墙提供一个更强的认证机制。这种需要源于客户机-服务器联系在不同组织网络之间的实现,而这种联系需要被控制和是很大程度上被认证的。 
  该协议被描述为用来提供在TCP和UDP域下为客户机-服务器应用程序便利和安全的穿过防火墙的一个架构。该协议在概念上被描述为一个介于应用层和传输层之间的"隔离层",但是这类服务并不提供网络层网关服务,如ICMP报文的传输。 
2.现状: 
  SOCKS 4为基于TCP的客户机-服务器应用程序提供了一种不安全的穿越防火墙的机制,包括TELNET,FTP和当前最流行的信息发现协议如HTTP,WAIS和GOPHER. 
  新协议为了包括UDP扩展了SOCKS 4,为了包括对总体上更强的认证机制的支持扩展了协议架构,为了包括域名和IPv6地址的支持扩展了地址集。 
  SOCKS协议执行最具代表性的是包括了在SOCKS库中利用适当的封装程序来对基于TCP的客户程序进行重编译和重链结。 
注意: 
  除非特别提及,封装在包格式中的十进制数表示的是通讯域的长度(用八位组octect表示)。一个给定的八位组必须具有指定的值,格式X'hh'被用来表示在该域中单个八位组的值。当单词"变量Variable"被使用时,它指出了通讯域拥有一个可变长度,这个可变长度要么由一个联合的(一个或两个八位组)长度域定义,要么由一个数据类型域所定义。 
3.基于TCP客户机的程序 
  当一台基于TCP的客户机希望和目标主机建立连接时,而这台目标主机只有经过防火墙才能到达(这种情况?一直持续到?它被执行时),它就必须在SOCKS服务器端的适当的SOCKS端口打开一个TCP连结。SOCKS服务按常例来说定位于TCP端口1080。如果连接请求成功,客户机为即将使用的认证方式进行一种协商,对所选的方式进行认证,然后发送一个转发请求。SOCKS服务器对该请求进行评估,并且决定是否建立所请求转发的连接。 
  客户机连接到服务器,发送一个版本标识/方法选择报文: 
  +----+----------+----------+ 
  |VER | NMETHODS | METHODS | 
  +----+----------+----------+ 
  | 1 |   1  | 1 to 255 | 
  +----+----------+----------+ 
  VER(版本)在这个协议版本中被设置为X'05'。NMETHODS(方法选择)中包含在METHODS(方法)中出现的方法标识八位组的数目。 
  服务器从METHODS给出的方法中选出一种,发送一个METHOD selection(方法选择)报文: 
  +----+--------+ 
  |VER | METHOD | 
  +----+--------+ 
  | 1 |  1  | 
  +----+--------+ 
  如果所选择的METHOD的值是X'FF',则客户机所列出的方法是没有可以被接受的,客户机就必须关闭连接。 
当前被定义的METHOD的值有: 
  >> X'00' 无验证需求 
  >> X'01' 通用安全服务应用程序接口(GSSAPI) 
  >> X'02' 用户名/密码(USERNAME/PASSWORD) 
  >> X'03' 至 X'7F' IANA 分配(IANA ASSIGNED) 
  >> X'80' 至 X'FE' 私人方法保留(RESERVED FOR PRIVATE METHODS) 
  >> X'FF' 无可接受方法(NO ACCEPTABLE METHODS) 
***IANA是负责全球INTERNET上的IP地址进行编号分配的机构(译者著)*** 
  于是客户机和服务器进入方法细节的子商议。方法选择子商议另外描述于独立的文档中。 
  欲得到该协议新的METHOD支持的开发者可以和IANA联系以求得到METHOD号。已分配号码的文档需要参考METHOD号码的当前列表和它们的通讯协议。 
  如果想顺利的执行则必须支持GSSAPI和支持用户名/密码(USERNAME/PASSWORD)认证方法。 
4.需求 
  一旦方法选择子商议结束,客户机就发送请求细节。如果商议方法包括了完整性检查的目的和/或机密性封装,则请求必然被封在方法选择的封装中。 
SOCKS请求如下表所示: 
  +----+-----+-------+------+----------+----------+ 
  |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT | 
  +----+-----+-------+------+----------+----------+ 
  | 1 |  1 | X'00' |  1 | Variable |   2  | 
  +----+-----+-------+------+----------+----------+ 
其中: 
 o VER protocol version:X'05' 
 o CMD 
 o CONNECT X'01' 
 o BIND X'02' 
 o UDP ASSOCIATE X'03' 
 o RSV RESERVED 
 o ATYP address type of following address 
 o IP V4 address: X'01' 
 o DOMAINNAME: X'03' 
 o IP V6 address: X'04' 
 o DST.ADDR desired destination address 
 o DST.PORT desired destination port in network octet order 
5.地址 
  在地址域(DST.ADDR,BND.ADDR)中,ATYP域详细说明了包含在该域内部的地址类型: 
    o X'01' 
  该地址是IPv4地址,长4个八位组。 
    o X'03' 
  该地址包含一个完全的域名。第一个八位组包含了后面名称的八位组的数目,没有中止的空八位组。 
    o X'04' 
  该地址是IPv6地址,长16个八位组。 
6.回应 
  到SOCKS服务器的连接一经建立,客户机即发送SOCKS请求信息,并且完成认证商议。服务器评估请求,返回一个回应如下表所示: 
  +----+-----+-------+------+----------+----------+ 
  |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT | 
  +----+-----+-------+------+----------+----------+ 
  | 1 | 1 | X'00' | 1  | Variable |   2  | 
  +----+-----+-------+------+----------+----------+ 
其中: 
  o VER protocol version: X'05' 
  o REP Reply field: 
  o X'00' succeeded 
  o X'01' general SOCKS server failure 
  o X'02' connection not allowed by ruleset 
  o X'03' Network unreachable 
  o X'04' Host unreachable 
  o X'05' Connection refused 
  o X'06' TTL expired 
  o X'07' Command not supported 
  o X'08' Address type not supported 
  o X'09' to X'FF' unassigned 
  o RSV RESERVED 
  o ATYP address type of following address 
  o IP V4 address: X'01' 
  o DOMAINNAME: X'03' 
  o IP V6 address: X'04' 
o BND.ADDR server bound address 
o BND.PORT server bound port in network octet order 
标志RESERVED(RSV)的地方必须设置为X'00'。 
  如果被选中的方法包括有认证目的封装,完整性和/或机密性的检查,则回应就被封装在方法选择的封装套中。