首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

SOCKS 四协议中文文档意译版

2012-09-04 
SOCKS 4协议中文文档意译版SOCKS协议最初由David Koblas设计,后经Ying-Da Lee改进成SOCKS 4协议。SOCKS4协

SOCKS 4协议中文文档意译版

SOCKS协议最初由David Koblas设计,后经Ying-Da Lee改进成SOCKS 4协议。

SOCKS4协议主要是如下几个RFC
http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol
http://www.rfc-editor.org/rfc/rfc1928.txt
http://www.smartftp.com/Products/SmartFTP/RFC/socks4a.protocol



SOCKS 4只支持TCP转发。

请求报文格式如下:

+----+----+----+----+----+----+----+----+----+----+...+----+
| VN | CD | DSTPORT |? ?? ?DSTIP? ?? ???| USERID? ?? ?|NULL|
+----+----+----+----+----+----+----+----+----+----+...+----+
? ?1? ? 1? ?? ?2? ?? ?? ?? ???4? ?? ?? ???variable? ?? ? 1

VN? ?? ?SOCKS协议版本号,应该是0x04

CD? ?? ?SOCKS命令,可取如下值:

? ?? ???0x01? ? CONNECT
? ?? ???0x02? ? BIND

DSTPORT CD相关的端口信息

DSTIP? ?CD相关的地址信息

USERID??客户方的USERID

NULL? ? 0x00

响应报文格式如下:

+----+----+----+----+----+----+----+----+
| VN | CD | DSTPORT |? ?? ?DSTIP? ?? ???|
+----+----+----+----+----+----+----+----+
? ?1? ? 1? ?? ?2? ?? ?? ?? ???4

VN? ?? ?应该为0x00而不是0x04

CD? ?? ?可取如下值:

? ?? ???0x5A? ? 允许转发
? ?? ???0x5B? ? 拒绝转发,一般性失败
? ?? ???0x5C? ? 拒绝转发,SOCKS 4 Server无法连接到SOCS 4 Client所在主机的
? ?? ?? ?? ?? ? IDENT服务
? ?? ???0x5D? ? 拒绝转发,请求报文中的USERID与IDENT服务返回值不相符

DSTPORT CD相关的端口信息

DSTIP? ?CD相关的地址信息

1) CONNECT命令

对于CONNECT请求,DSTIP/DSTPORT指明转发目的地。

SOCKS 4 Server根据源IP、DSTPORT、DSTIP、USERID以及可从SOCS 4 Client所在主
机的IDENT服务(RFC 1413)获取的信息进行综合评估,以决定建立相应连接还是拒绝
转发。

假设CONNECT请求被允许,SOCKS 4 Server试图建立到转发目的地的TCP连接,然后向
SOCKS 4 Client发送响应报文,指明是否成功建立转发连接。

如果CONNECT请求被拒绝,SOCKS 4 Server也向SOCKS 4 Client发送响应报文,随后
立即关闭连接。

CONNECT响应包中只有VN、CD字段有意义,DSTPORT、DSTIP字段被忽略。如果CD等于
0x5A,表示成功建立转发连接,之后SOCKS 4 Client直接在当前TCP连接上发送待转
发数据。

2) BIND命令

FTP协议在某些情况下要求FTP Server主动建立到FTP Client的连接,即FTP数据流。

FTP Client - SOCKS 4 Client - SOCKS 4 Server - FTP Server

a. FTP Client试图建立FTP控制流。SOCKS 4 Client向SOCKS 4 Server发送CONNECT
? ?请求,后者响应请求,最终FTP控制流建立。

? ?CONNECT请求包中指明FTPSERVER.ADDR/FTPSERVER.PORT。

b. FTP Client试图建立FTP数据流。SOCKS 4 Client建立新的到SOCKS 4 Server的
? ?TCP连接,并在新的TCP连接上发送BIND请求。

? ?BIND请求包中仍然指明FTPSERVER.ADDR/FTPSERVER.PORT。

? ?SOCKS 4 Server收到BIND请求,根据这两个信息以及USERID对BIND请求进行评估。
? ?创建新套接字,侦听在AddrA/PortA上,并向SOCKS 4 Client发送第一个BIND响应
? ?包。

? ?BIND响应包中CD不等于0x5A时表示失败,包中DSTPORT、DSTIP字段被忽略。

? ?BIND响应包中CD等于0x5A时,包中DSTIP/DSTPORT对应AddrA/PortA。如果DSTIP等
? ?于0(INADDR_ANY),SOCKS 4 Client应将其替换成SOCKS 4 Server的IP,当SOCKS
? ?4 Server非多目(multi-homed)主机时就可能出现这种情况。

c. SOCKS 4 Client收到第一个BIND响应包。

? ?FTP Client调用getsockname(不是getpeername)获取AddrA/PortA,通过FTP控制
? ?流向FTP Server发送PORT命令,通知FTP Server应该主动建立到AddrA/PortA的
? ?TCP连接。

d. FTP Server收到PORT命令,主动建立到AddrA/PortA的TCP连接,假设TCP连接相关
? ?四元组是:

? ?AddrB,PortB,AddrA,PortA

e. SOCKS 4 Server收到来自FTP Server的TCP连接请求,检查这条入连接的源IP(
? ?AddrB)是否与FTPSERVER.ADDR匹配,然后向SOCKS 4 Client发送第二个BIND响应
? ?包。

? ?源IP不匹配时第二个BIND响应包中CD字段设为0x5B,然后SOCKS 4 Server关闭这
? ?条用于发送第二个BIND响应包的TCP连接,同时关闭与FTP Server之间的TCP连接,
? ?但主TCP连接(与CONNECT请求相关的那条TCP连接)继续保持中。

? ?源IP匹配时CD字段设为0x5A。然后SOCKS 4 Server开始转发FTP数据流。

? ?无论如何,第二个BIND响应包中DSTPORT、DSTIP字段被忽略。

对于CONNECT、BIND请求,SOCKS 4 Server有一个定时器(当前CSTC实现采用两分钟)。
假设定时器超时,而SOCKS 4 Server与Application Server之间的TCP连接(出连接或
入连接)仍未建立,SOCKS 4 Server将关闭与SOCKS 4 Client之间相应的TCP连接并放
弃相应的转发。

热点排行