关于协议的应用与实现
首先为什么我会想到写这样一个博客,是因为,在工作中,用到的一些技术,时常是一些不常用的协议,虽然网上有些开源的实现,但是,了解协议本身的内容是必须得,这也迫使的我不得不去阅读rfc文档,不得不去了解每一个数据包得意义。
比如,目前,项目用到用TCP 协议模拟处理http请求,SOCKS协议,RTMP协议,SIP协议,这些有些很常见,有些没用过,通过阅读协议,我们可以了解各个协议的内容是怎样的,具体实现时,也不要想的那么复杂,按照协议一条一条的来,具体怎么做就要看各个协议本身了。
1.HTTP协议
request:
GET /form.html HTTP/1.1 (CRLF)
Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)
Accept-Language:zh-cn (CRLF)
Accept-Encoding:gzip,deflate (CRLF)
If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)
If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)
User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)
Host:www.guet.edu.cn (CRLF)
Connection:Keep-Alive (CRLF)
response:
HTTP/1.1 200 OK //请求成功
Server: Microsoft-IIS/5.0 //web服务器
Date: Thu,08 Mar 200707:17:51 GMT
Connection: Keep-Alive
Content-Length: 23330
Content-Type: text/html
Expries: Thu,08 Mar 2007 07:16:51 GMT
Set-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/
Cache-control: private
2.SOCKS协议
下面是客户端向SOCKS 4代理服务器,发送的连接请求包的格式(以字节为单位):
+——+——+——+——+——+——+——+——+——+——+....+——+
| VN | CD | DSTPORT | DSTIP | USERID |NULL|
+——+——+——+——+——+——+——+——+——+——+....+——+
1 1 2 4 variable 1
VN是SOCK版本,应该是4;
CD是SOCK的命令码,1表示CONNECT请求,2表示BIND请求;
DSTPORT表示目的主机的端口;
DSTIP指目的主机的IP地址;
NULL是0;
代理服务器而后发送回应包(以字节为单位):
+——+——+——+——+——+——+——+——+
| VN | CD | DSTPORT | DSTIP |
+——+——+——+——+——+——+——+——+
1 1 2 4
VN是回应码的版本,应该是0;
CD是代理服务器答复,有几种可能:
90,请求得到允许;
91,请求被拒绝或失败;
92,由于SOCKS服务器无法连接到客户端的identd(一个验证身份的进程),请求被拒绝;
93,由于客户端程序与identd报告的用户身份不同,连接被拒绝。
DSTPORT与DSTIP与请求包中的内容相同,但被忽略。
如果请求被拒绝,SOCKS服务器马上与客户端断开连接;如果请求被允许,代理服务器就充当客户端与目的主机之间进行双向传递,对客户端而言,就如同直接在与目的主机相连。
首先为什么我会想到写这样一个博客,是因为,在工作中,用到的一些技术,时常是一些不常用的协议,虽然网上有些开源的实现,但是,了解协议本身的内容是必须得,这也迫使的我不得不去阅读rfc文档,不得不去了解每一个数据包得意义。
比如,目前,项目用到用TCP 协议模拟处理http请求,SOCKS协议,RTMP协议,SIP协议,这些有些很常见,有些没用过,通过阅读协议,我们可以了解各个协议的内容是怎样的,具体实现时,也不要想的那么复杂,按照协议一条一条的来,具体怎么做就要看各个协议本身了。
1.HTTP协议
request:
GET /form.html HTTP/1.1 (CRLF)
Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)
Accept-Language:zh-cn (CRLF)
Accept-Encoding:gzip,deflate (CRLF)
If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)
If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)
User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)
Host:www.guet.edu.cn (CRLF)
Connection:Keep-Alive (CRLF)
response:
HTTP/1.1 200 OK //请求成功
Server: Microsoft-IIS/5.0 //web服务器
Date: Thu,08 Mar 200707:17:51 GMT
Connection: Keep-Alive
Content-Length: 23330
Content-Type: text/html
Expries: Thu,08 Mar 2007 07:16:51 GMT
Set-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/
Cache-control: private
2.SOCKS协议
下面是客户端向SOCKS 4代理服务器,发送的连接请求包的格式(以字节为单位):
+——+——+——+——+——+——+——+——+——+——+....+——+
| VN | CD | DSTPORT | DSTIP | USERID |NULL|
+——+——+——+——+——+——+——+——+——+——+....+——+
1 1 2 4 variable 1
VN是SOCK版本,应该是4;
CD是SOCK的命令码,1表示CONNECT请求,2表示BIND请求;
DSTPORT表示目的主机的端口;
DSTIP指目的主机的IP地址;
NULL是0;
代理服务器而后发送回应包(以字节为单位):
+——+——+——+——+——+——+——+——+
| VN | CD | DSTPORT | DSTIP |
+——+——+——+——+——+——+——+——+
1 1 2 4
VN是回应码的版本,应该是0;
CD是代理服务器答复,有几种可能:
90,请求得到允许;
91,请求被拒绝或失败;
92,由于SOCKS服务器无法连接到客户端的identd(一个验证身份的进程),请求被拒绝;
93,由于客户端程序与identd报告的用户身份不同,连接被拒绝。
DSTPORT与DSTIP与请求包中的内容相同,但被忽略。
如果请求被拒绝,SOCKS服务器马上与客户端断开连接;如果请求被允许,代理服务器就充当客户端与目的主机之间进行双向传递,对客户端而言,就如同直接在与目的主机相连。