﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-IT小小鸟的学习日记-随笔分类-网络知识/网络编程</title><link>http://www.cnitblog.com/lenatem/category/7882.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 13:41:03 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 13:41:03 GMT</pubDate><ttl>60</ttl><item><title>WSAStartup（）函数</title><link>http://www.cnitblog.com/lenatem/archive/2010/03/17/64704.html</link><dc:creator>雅量</dc:creator><author>雅量</author><pubDate>Wed, 17 Mar 2010 08:16:00 GMT</pubDate><guid>http://www.cnitblog.com/lenatem/archive/2010/03/17/64704.html</guid><wfw:comment>http://www.cnitblog.com/lenatem/comments/64704.html</wfw:comment><comments>http://www.cnitblog.com/lenatem/archive/2010/03/17/64704.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/lenatem/comments/commentRss/64704.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/lenatem/services/trackbacks/64704.html</trackback:ping><description><![CDATA[函数原型<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;WSAStartup<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;wVersionRequested,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPWSADATA&nbsp;lpWSAData<br>}；</span></div>
使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本，其中高位字节
指明副版本、低位字节指明主版本；操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时，操作系统根
据请求的Socket版本来搜索相应的Socket库，然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的
其它Socket函数了。该函数执行成功后返回0.例：假如一个程序要使用2.1版本的Socket，那么程序代码如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">wVersionRequested&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MAKEWORD(&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;);<br>err&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;WSAStartup(&nbsp;wVersionRequested,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">wsaData&nbsp;);</span></div>
返回值：0表示成功。<img src ="http://www.cnitblog.com/lenatem/aggbug/64704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/lenatem/" target="_blank">雅量</a> 2010-03-17 16:16 <a href="http://www.cnitblog.com/lenatem/archive/2010/03/17/64704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置WinPcap开发环境</title><link>http://www.cnitblog.com/lenatem/archive/2008/12/05/52234.html</link><dc:creator>雅量</dc:creator><author>雅量</author><pubDate>Fri, 05 Dec 2008 03:14:00 GMT</pubDate><guid>http://www.cnitblog.com/lenatem/archive/2008/12/05/52234.html</guid><wfw:comment>http://www.cnitblog.com/lenatem/comments/52234.html</wfw:comment><comments>http://www.cnitblog.com/lenatem/archive/2008/12/05/52234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/lenatem/comments/commentRss/52234.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/lenatem/services/trackbacks/52234.html</trackback:ping><description><![CDATA[摘自：<a href="http://hi.baidu.com/ejoywx/blog/item/395efdfdc1b3b585b801a042.html">http://hi.baidu.com/ejoywx/blog/item/395efdfdc1b3b585b801a042.html</a><br>一.下载WinPcap。<br>&nbsp;&nbsp; 依照下面的地址下载WinPacp的驱动和开发包&nbsp;&nbsp; <br>&nbsp;&nbsp; WinPcap4驱动(<a href="http://www.winpcap.org/install/bin/WinPcap_4_1_beta4.exe" target=_blank><u><font color=#0000ff>http://www.winpcap.org/install/bin/WinPcap_4_1_beta4.exe</font></u></a>)<br>&nbsp;&nbsp; WinPcap4SDK(<a href="http://www.winpcap.org/install/bin/WpdPack_4_1_beta4.zip" target=_blank><u><font color=#0000ff>http://www.winpcap.org/install/bin/WpdPack_4_1_beta4.zip</font></u></a>)<br>二.配置WinPcap。<br>&nbsp;&nbsp; 首先安装WinPcap4驱动，安装完毕后最好重启计算机。<br>&nbsp;&nbsp; 然后安装WinPcap开发包。解压WpdPack_4_1_beta2.zip至到文件夹XXX中，然后复制XXX下Include的中的所有文件和文 件夹至VC目录下的Include中。[比如，我的vc6安装在D盘根目录下，vc6的Include为在D:\Microsoft Visual Studio\VC98\之下，则我只需要将xxx下Include文件夹复制到D:\Microsoft Visual Studio\VC98\]。同理，复制XXX下Lib的中的所有文件和文件夹至VC目录下的Lib中。如下图：<br><img height=578 alt="" src="http://www.cnitblog.com/images/cnitblog_com/lenatem/winpcap.png" width=790 border=0><br>三.使用WinPcapSDK<br>&nbsp;&nbsp; 一般，直接使用#include &lt;pcap.h&gt;不会有多大麻烦，不过我觉得最好使用如下方式引用头文件<br>&nbsp;&nbsp; #define HAVE_REMOTE<br>&nbsp;&nbsp; #include &lt;pcap.h&gt;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; 当然，做到这一步，还不够，因为，你的应用程序需要静态链接库。在vc6中，你需要选择&#8220;工程&#8221;－&#8220;设置&#8221;，切换到&#8220;连接&#8221;页，在&#8220;对象/库模块&#8221;中添加&#8220;wpcap.lib&#8221;和&#8220;wsock32.lib&#8221;，如果有必要，还需要添加&#8220;Packet.lib&#8221; <br>&nbsp;&nbsp; 到这一步，你应该可以使用WinPcapSDK开发网络程序了。Enjoy it! 
<img src ="http://www.cnitblog.com/lenatem/aggbug/52234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/lenatem/" target="_blank">雅量</a> 2008-12-05 11:14 <a href="http://www.cnitblog.com/lenatem/archive/2008/12/05/52234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打开139端口、vsftpd启动</title><link>http://www.cnitblog.com/lenatem/archive/2008/11/27/51940.html</link><dc:creator>雅量</dc:creator><author>雅量</author><pubDate>Thu, 27 Nov 2008 08:20:00 GMT</pubDate><guid>http://www.cnitblog.com/lenatem/archive/2008/11/27/51940.html</guid><wfw:comment>http://www.cnitblog.com/lenatem/comments/51940.html</wfw:comment><comments>http://www.cnitblog.com/lenatem/archive/2008/11/27/51940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/lenatem/comments/commentRss/51940.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/lenatem/services/trackbacks/51940.html</trackback:ping><description><![CDATA[打开139端口可用如下命令：<br>netsh firewall set portopening TCP 139 enable<br><br>vsftpd启动：<br>service ftpd start<br><br><br>
<img src ="http://www.cnitblog.com/lenatem/aggbug/51940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/lenatem/" target="_blank">雅量</a> 2008-11-27 16:20 <a href="http://www.cnitblog.com/lenatem/archive/2008/11/27/51940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windump介绍</title><link>http://www.cnitblog.com/lenatem/archive/2008/11/27/51933.html</link><dc:creator>雅量</dc:creator><author>雅量</author><pubDate>Thu, 27 Nov 2008 07:24:00 GMT</pubDate><guid>http://www.cnitblog.com/lenatem/archive/2008/11/27/51933.html</guid><wfw:comment>http://www.cnitblog.com/lenatem/comments/51933.html</wfw:comment><comments>http://www.cnitblog.com/lenatem/archive/2008/11/27/51933.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/lenatem/comments/commentRss/51933.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/lenatem/services/trackbacks/51933.html</trackback:ping><description><![CDATA[Windump是Windows环境下一款经典的网络协议分析软件，其Unix版本名称为Tcpdump。它可以捕捉网络上两台电脑之间所有的数据包，供网络管理员/入侵分析员做进一步流量分析和入侵检测。在这种监视状态下，任何两台电脑之间都没有秘密可言，所有的流量、所有的数据都逃不过你的眼睛（当然加密的数据不在讨论范畴之内，而且，对数据包分析的结果依赖于你的TCP/IP知识和经验，不同水平的人得出的结果可能会大相径庭）。如果你做过 DEBUG或者反汇编，你会发现二者是那么惊人的相似。在W.Richard Stevens的鼎鼎大作《TCP/IP详解》卷一中，通篇采用Tcpdump捕捉的数据包来向读者讲解TCP/IP；而当年美国最出色的电脑安全专家下村勉在追捕世界头号黑客米特尼克时，也使用了Tcpdump，Tcpdump/Windump的价值由此可见一斑。 <br>&nbsp;&nbsp;&nbsp; windump下载地址：<a href="http://www.hackbase.com/soft/2003-12-23/15431.html">http://www.hackbase.com/soft/2003-12-23/15431.html</a>（还必须安装winpacap哦）<br>Windump的用法<br>1.下载解压缩后放入*盘，打开命令提示符，进入*盘，即可输入相应的命令使用。<br>2.运行windump -D 可列出目前系统中所有可使用的网络界面。<br>3.要使用专门的配置器，用-i命令和配置器号运行程序。<br><img height=267 alt="" src="http://www.cnitblog.com/images/cnitblog_com/lenatem/windump.jpg" width=641><br><br><br>&nbsp;&nbsp;&nbsp; windump手册<br>命令格式 <br>windump [ -aBdDeflnNOpqRStvxX ] [ -c count ] [ -F file ]
<p>[ -i interface ] [ -m module ] [ -r file ]</p>
<p>[ -s snaplen ] [ -T type ] [ -w file ]</p>
<p>[ -E algo:secret ] [ expression ] <br>描述 <br>Tcpdump 输出网卡数据包中匹配布尔表达式的数据包头。 <br>SunOS 系统下使用nit或bpf:要运行tcpdump，你必须有对dev/nit或/dev/bpf*的权利。Solaris系统下使用dlpi:你必须有对网络假设置的权利。HP-UX系统下使用dlpi:你应该以超级用户ROOT或安装SETUID到ROOT下。IRIX下使用SNOOP：你应该以超级用户ROOT或安装SETUID到ROOT下。LINUX下：你应该以超级用户ROOT或安装SETUID到ROOT下。在系统Ultrix和 Digital UNIX： <br>命令参数</p>
<p>-a <br>将网络和广播地址转化为名称</p>
<p>-c <br>接收指定数据包后退出</p>
<p>-d <br>接收人可读的包匹配编译代码到标准输出，然后停止</p>
<p>-dd <br>以C程序分段方式捕获包匹配代码</p>
<p>-ddd <br>以十进制数据形式捕获包匹配代码</p>
<p>-e <br>在每个捕获行打印链路层头标</p>
<p>-E <br>algo:secret为解密IPSE ESP包使用算法。算法可以是des-cbc, 3des-cbc, blowfish-cbc, rc3-cbc, cast128-cbc, 或none。默认值是desc-cbc。只有当TCPDUMP编译时使用激活加密选项时，才可以解密数据包。Secret是ESP密匙是ASCII码。当前还不能认为一定是二进制值。该选项是以RFC2406ESP为假设，而不是RFC1827 ESP。只用于调试，不鼓励用真正的密码作为选项。当你在PS或其他场合，把IPSEC密码写在命令行上时，会被他人看到。</p>
<p>-f <br>不用符号而用数字方式输出外部英特网地址</p>
<p>-F <br>使用文件作为过滤表达式的输入。命令行的其他部分会被忽略。</p>
<p>-i <br>在接口上监听。如果没有指定，TCPDUMP将搜索系统接口列表中最小，被配置激活的接口（LOOPBACK接口除外）。可用最先匹配替换这种关系。在WINDOWS中接口可以是网卡的名称，或是网卡的号码（-D参数可显示该号码）。内核为2。2或其后的LINUX系统，参数&#8220;ANY&#8221;可以获取所有接口的数据。应注意的是在混乱模式下不能使用&#8220;ANY&#8221;参数。</p>
<p>-l <br>标准输出行缓存。如果你想在捕获数据时查看的话，这个参数很有用。例如：&#8220;tcpdump -l │ tee dat or ``tcpdump -l &gt; dat &amp; tail -f dat.&#8221; <br></p>
<p>-n <br>不要将地址（如主机地址，端口号）转换为名称</p>
<p>-N <br>不要打印主机名称的域名限定。如：如果你使用该参数，TCPDUMP会输出&#8220;NIC&#8221;而不是&#8220;NIC。DDN。MIL&#8221;。</p>
<p>-m <br>从文件模块中载入SMI MIB 模块定义。这个选项可以为TCPDUMP载入多个MIB模块</p>
<p>-O <br>不要运行包匹配代码优化器。只有在你怀疑优化器有问题时可以使用这个参数。</p>
<p>-p <br>不要让接口处于&#8220;混乱&#8221;模式。注意接口可能由于其他原因处于&#8220;混乱&#8221;模式；因此&#8220;-p&#8221;不能用作以太网络主机或广播的缩写。</p>
<p>-q <br>快速（安静？）输出。打印较少的协议信息，因此输出行更短。</p>
<p>-r <br>从文件中读取包（与参数据-W一起使用）。如果文件是&#8220;-&#8221;就使用标准输入。</p>
<p>-s <br>不使用默认的68个字节，更改从每个包中获取数据的字节数量（ SunOS系统实际最小为96）。对于IP，ICMP，TCP和UDP包68个字节已足够，但是对命名服务和NFS包，他们的协议会被截断（见下面）。包被截断是因为在使用参数``[│proto]输出时指定受限制的快照，proto是被截断协议层的名称。注意如果使用大的快照会增加处理包的时间，并且明显地减少包的缓存数量。也许会导致包的丢失。你应该将snaplen 设置成你感兴趣协议的最小数。当snaplen 为0时接收整个包。</p>
<p>-T <br>根据表达式将选中的数据包表达成指定的类型。当前已有的类型有CNFP（Cisco的网络流量协议），rpc（远端程序调用），rtp（实时程序协议），rtcp（实时程序控制协议），snmp（简单网络管理协议），vat（可视单频工具），和wb（分布式白板）。</p>
<p>-R <br>假设ESP/AH包遵守旧的说明（RFC1825到RFC1829）。如果该参数被指定，TCPDUMP不打输出域。因为在ESP/AH说明中没有协议版本，TCPDUMP就无法推断出其版本号。</p>
<p>-S <br>输出绝对TCP序列号，而不是相对号。</p>
<p>-t <br>每个捕获行不要显示时间戳。</p>
<p>-tt <br>每个捕获行显示非格式化的时间时间戳。</p>
<p>-v <br>详细输出。例如，显示生存时间TTL，标识符，总长度和IP数据包的选项。也进行额外的包完整性较验，如验证IP和ICMP的头标较验值。</p>
<p>-vv <br>更为详细的输出。例如，显示NFS中继包中的其他域。</p>
<p>-vvv <br>很详细的输出。如，完全输出TELNET SB&#8230; SE选项。带-X参数的TELNET，打印并以十六进制输出。</p>
<p>-w <br>不对原始数据包解析打印而是转到文件中去。以后可用-r选项打印。当文件名为&#8220;-&#8221;表示标准输出。</p>
<p>-x <br>以十六进制（去除链路层头标）输出每个数据包。输出整个包的小部分或snaplen 个字节。</p>
<p>-X <br>输出十六进制同时，输出ASCII码。如果-x也被设置，数据包会以十六制/ASCII码显示。这对于分析新协议非常方便。如果-x也没有设置，一些数据包的部分会以十六制/ASCII码显示。 <br>Win32特殊扩展</p>
<p>-B <br>以千字节为单位设置驱动缓存。默认缓存为1M（即1000）。如果在获取数据包时有数据丢失，建议使用该参数增大核心缓存大小，因为驱动缓存大小对数据捕获性能有很大影响。</p>
<p>-D <br>显示系统上可用的网卡列表。该参数将返回每块网卡的号码，名称和描述。用户可以输入&#8220;WinDump &#8211;i 网卡名称&#8221;或&#8220;WinDump &#8211;i 网卡号码&#8221;。如果机器有多块网卡，不带参数的WINDUMP命令会从系统的第一块可用网卡开始。</p>
<p><br></p>
<p>表达式</p>
<p>选择哪些包被捕获。如果没有指定表达式，会捕获所有在网络中的数据包。否则只获捕表达式为真的数据包。 <br>表达式由一个或多个原语组成。原语通常由一个ID（名称或号码）前面加一个或多个限定词组成。有三种不同的限定词。 <br>类型 <br>限定词指出id，名称或号码属于哪种类型。可能的类型包括：host,net和port。如&#8217;host foo&#8217;, `net 128.3', `port 20'. 如果没有指定类型，假设为host。</p>
<p>方向 <br>限定词指出特定的传输方向，是从id传来还是传到id。可能方向是src, dst, src or dst 和 src and dst。例如`src foo', `dst net 128.3', `src or dst port ftp-data'。如果没有方向限定词将指定src or dst。对于&#8216;空&#8217;链路层（像SLIP这样的点到点协议），可以用inbound和outbound 限定词指明需要的方向。</p>
<p>协议 <br>限定词限定匹配某类特定的协议。可能的协议有：ether, fddi, tr, ip, ip6, arp, rarp, decnet, tcp和udp。如`ether src foo', `arp net 128.3', `tcp port 21'。如没指定协议，则假设匹配所有协议。如`src foo' 指 `(ip or arp or rarp) src foo' (但后面的表达式不合法法)（except the latter is not legal syntax）, `net bar' 指 `(ip or arp or rarp) net bar' 和 `port 53' 指 `(tcp or udp) port 53'。 <br>`fddi' 实际上是&#8217;ether&#8217;的别名；解析器会认为两者都是指&#8220;指定接口中使用的数据链路层&#8221;FDDI头标包括类似以太网的源和目的地址，经常包含类似以太网的包类型，所以你可像对以太网字段一样过滤FDDI域。FDDI头标也包括其他域，但你不能在表达式中直接使用他们。 <br>同样&#8217;tr&#8217;也是&#8217;ether&#8217;的别名；前一段FDDI头标的情况也适用于令牌环网头标。 <br>除了以上所讲的，还有一些特殊的原语关键字不使用这种方式：gateway, broadcast, less, greater 和算术表达式，都描述如下： <br>通过使用and, or和 not 结合原语，构成更复杂的过滤表达式。如`host foo and not port ftp and not port ftp-data'。为了减少输入，可以忽略相同的限定词列表。如`tcp dst port ftp or ftp-data or domain' 实际等同于 `tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain'.</p>
<br>
<img src ="http://www.cnitblog.com/lenatem/aggbug/51933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/lenatem/" target="_blank">雅量</a> 2008-11-27 15:24 <a href="http://www.cnitblog.com/lenatem/archive/2008/11/27/51933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>http请求和响应消息</title><link>http://www.cnitblog.com/lenatem/archive/2008/11/10/51273.html</link><dc:creator>雅量</dc:creator><author>雅量</author><pubDate>Mon, 10 Nov 2008 02:26:00 GMT</pubDate><guid>http://www.cnitblog.com/lenatem/archive/2008/11/10/51273.html</guid><wfw:comment>http://www.cnitblog.com/lenatem/comments/51273.html</wfw:comment><comments>http://www.cnitblog.com/lenatem/archive/2008/11/10/51273.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/lenatem/comments/commentRss/51273.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/lenatem/services/trackbacks/51273.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 14pt"><strong>HTTP请求消息</strong></span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1次完整的http请求消息包括：一个请求行、若干消息头以及实体内容，而消息头和实体内容可以没有，消息头和实体内容间有一个空行。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们来看一个例子（为了便于说明，我在每行前加了序号）：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Get /mattmarg/ HTTP/1.0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 User-Agent: Mozilla/2.0 (Macintosh; I; PPC)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 Accept: text/html; */*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 Cookie: name = value<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 Referer: http://www.XXX.com/a.html<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中，第1行就是请求行：请求方式为Get（除了Get之外，还有Post、Put、Delete方式），请求的文件位于"根目录/mattmarg/"下，当然也可以直接给出需要的页面（如：/mattmarg/index.asp，也可以加上一些其它字段 如：/mattmarg/index.asp？id=1&amp;uid=xxx。当我们通过Get请求时，提交给服务器的请求行长度不能超过1K,而如果利用Post方式，则是把所提交的信息以实体内容形式发送给服务器，所以如果服务器没有限制的话，原则上讲可以传输无限大的内容），HTTP/1.0 表示了http的版本为1.0。其余几行就是消息头了，消息头主要是用来向服务器传达某种信息或指示。如告诉服务器自己的终端（User-Agent）是什么(如果是浏览器则返回相应的浏览器型号),终端所可以解释的类型（Accept）是什么，是从哪个页面提交的请求（Referer），以及浏览器所能解释的语言（Accept-Language）等等。我们这里拿Accept-Language来举个例子，大家都知道google在中国大陆显示的是简体中文，而在其它的国家则显示对应的语言，这个是怎么做到的呢？其实就是浏览器向服务器递交的请求信息中包含了Accept-Language,而我们的浏览器默认是zh-cn,然后服务器在接受到该信息时返回对应的页面。<br><br><span style="FONT-SIZE: 14pt"><strong>HTTP响应消息<br></strong></span><br><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>Http响应消息的格式为：一个状态行、若干消息头和实体内容，其中消息头和实体内容可以没有，消息头和实体内容间有一个空行。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们依旧先来看一个例子：<br><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 01 HTTP/1.1 200 OK<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 02 Server: Microsoft-IIS/5.1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 03 X-Powered-By: ASP.NET<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 04 Date: Sun, 06 Jul 2008 11:01:21 GMT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;05 Content-Type: text/html<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 06 Accept-Ranges: bytes<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 07 Last-Modified: Wed, 02 Jul 2008 01:01:26 GMT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 08 ETag: "0f71527dfdbc81:ade"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 09 Content-Length: 46<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10<br></font><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11 &lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;adfasfa&lt;/body&gt;&lt;/html&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其中，01行是状态行，用于显示服务器响应的状态，HTTP/1.1显示了对应的http协议版本，200为状态数字，OK为状态信息用于解释状态数字（这里OK对应200，表示请求正常）；02~09是消息头部分，10为空行，11为实体内容（也就是服务器返回的网页内容）。</font> 
<img src ="http://www.cnitblog.com/lenatem/aggbug/51273.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/lenatem/" target="_blank">雅量</a> 2008-11-10 10:26 <a href="http://www.cnitblog.com/lenatem/archive/2008/11/10/51273.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>http协议（一）</title><link>http://www.cnitblog.com/lenatem/archive/2008/11/10/51272.html</link><dc:creator>雅量</dc:creator><author>雅量</author><pubDate>Mon, 10 Nov 2008 02:17:00 GMT</pubDate><guid>http://www.cnitblog.com/lenatem/archive/2008/11/10/51272.html</guid><wfw:comment>http://www.cnitblog.com/lenatem/comments/51272.html</wfw:comment><comments>http://www.cnitblog.com/lenatem/archive/2008/11/10/51272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/lenatem/comments/commentRss/51272.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/lenatem/services/trackbacks/51272.html</trackback:ping><description><![CDATA[<p>摘自：<a href="http://baike.baidu.com/view/9472.htm">http://baike.baidu.com/view/9472.htm</a><strong><br><br>HTTP是什么?</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当我们想浏览一个网站的时候，只要在浏览器的地址栏里输入网站的地址就可以了，例如<a href="http://www.baidu.com/">www.baidu.com</a>,但是在浏览器的地址栏里面出现的却是：<a href="http://www.baidu.com/">http://www.baidu.com</a> ,你知道为什么会多出一个&#8220;http&#8221;吗？ <br>　　我们在浏览器的地址栏里输入的网站地址叫做URL (Uniform Resource Locator，统一资源定位符)。就像每家每户都有一个门牌地址一样，每个网页也都有一个Internet地址。当你在浏览器的地址框中输入一个URL或是单击一个超级链接时，URL就确定了要浏览的地址。浏览器通过超文本传输协议(HTTP)，将Web服务器上站点的网页代码提取出来，并翻译成漂亮的网页。因此，在我们认识HTTP之前，有必要先弄清楚URL的组成,例如：<a href="http://www.baidu.com/china/index.htm">http://www.baidu.com/china/index.htm</a>。它的含义如下： <br>　　1. http://：代表超文本传输协议，通知baidu.com服务器显示Web页，通常不用输入；<br>　　2. www：代表一个Web（万维网）服务器； <br>　　3. baidu.com/：这是装有网页的服务器的域名，或站点服务器的名称； <br>　　4. China/：为该服务器上的子目录，就好像我们的文件夹； <br>　　5. Index.htm：index.htm是文件夹中的一个HTML文件（网页）。 <br>　　我们知道，Internet的基本协议是TCP/IP协议，然而在TCP/IP模型最上层的是应用层（Application layer），它包含所有高层的协议。高层协议有：文件传输协议FTP、电子邮件传输协议SMTP、域名系统服务DNS、网络新闻传输协议NNTP和HTTP协议等。 <br>　　HTTP协议（HyperText Transfer Protocol，超文本传输协议）是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效，使网络传输减少。它不仅保证计算机正确快速地传输超文本文档，还确定传输文档中的哪一部分，以及哪部分内容首先显示(如文本先于图形)等。这就是你为什么在浏览器中看到的网页地址都是以http://开头的原因。 <br>　　自WWW诞生以来，一个多姿多彩的资讯和虚拟的世界便出现在我们眼前，可是我们怎么能够更加容易地找到我们需要的资讯呢？当决定使用超文本作为WWW文档的标准格式后，于是在1990年，科学家们立即制定了能够快速查找这些超文本文档的协议，即HTTP协议。经过几年的使用与发展，得到不断的完善和扩展，目前在WWW中使用的是HTTP/1.0的第六版。<br><br><strong>HTTP是怎样工作的</strong></p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 既然我们明白了URL的构成，那么HTTP是怎么工作呢？我们接下来就要讨论这个问题。 <br>　　一次HTTP操作称为一个事务，其工作过程可分为四步：<br>　　首先客户机与服务器需要建立连接。只要单击某个超级链接，HTTP的工作就开始了。<br>　　立连接后，客户机发送一个请求给服务器，请求方式的格式为：统一资源标识符（URL）、协议版本号，后边是MIME信息包括请求修饰符、客户机信息和可能的内容。<br>　　服务器接到请求后，给予相应的响应信息，其格式为一个状态行，包括信息的协议版本号、一个成功或错误的代码，后边是MIME信息包括服务器信息、实体信息和可能的内容。 <br>　　客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上，然后客户机与服务器断开连接。<br>　　如果在以上过程中的某一步出现错误，那么产生错误的信息将返回到客户端，有显示屏输出。对于用户来说，这些过程是由HTTP自己完成的，用户只要用鼠标点击，等待信息显示就可以了。<br>　　许多HTTP通讯是由一个用户代理初始化的并且包括一个申请在源服务器上资源的请求。最简单的情况可能是在用户代理和服务器之间通过一个单独的连接来完成。在Internet上，HTTP通讯通常发生在TCP/IP连接之上。缺省端口是TCP 80，但其它的端口也是可用的。但这并不预示着HTTP协议在Internet或其它网络的其它协议之上才能完成。HTTP只预示着一个可靠的传输。 <br>　　这个过程就好像我们打电话订货一样，我们可以打电话给商家，告诉他我们需要什么规格的商品，然后商家再告诉我们什么商品有货，什么商品缺货。这些，我们是通过电话线用电话联系（HTTP是通过TCP/IP），当然我们也可以通过传真，只要商家那边也有传真。 <br>　　以上简要介绍了HTTP协议的宏观运作方式，下面介绍一下HTTP协议的内部操作过程。 <br>　　在WWW中，&#8220;客户&#8221;与&#8220;服务器&#8221;是一个相对的概念，只存在于一个特定的连接期间，即在某个连接中的客户在另一个连接中可能作为服务器。基于HTTP协议的客户/服务器模式的信息交换过程，它分四个过程：建立连接、发送请求信息、发送响应信息、关闭连接。这就好像上面的例子，我们电话订货的全过程。 <br>　　其实简单说就是任何服务器除了包括HTML文件以外，还有一个HTTP驻留程序，用于响应用户请求。你的浏览器是HTTP客户，向服务器发送请求，当浏览器中输入了一个开始文件或点击了一个超级链接时，浏览器就向服务器发送了HTTP请求，此请求被送往由IP地址指定的URL。驻留程序接收到请求，在进行必要的操作后回送所要求的文件。在这一过程中，在网络上发送和接收的数据已经被分成一个或多个数据包（packet），每个数据包包括：要传送的数据；控制信息，即告诉网络怎样处理数据包。TCP/IP决定了每个数据包的格式。如果事先不告诉你，你可能不会知道信息被分成用于传输和再重新组合起来的许多小块。 <br>　　也就是说商家除了拥有商品之外，它也有一个职员在接听你的电话，当你打电话的时候，你的声音转换成各种复杂的数据，通过电话线传输到对方的电话机，对方的电话机又把各种复杂的数据转换成声音，使得对方商家的职员能够明白你的请求。这个过程你不需要明白声音是怎么转换成复杂的数据的。<br><br><strong>http协议基础<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP（HyperText Transfer Protocol）是超文本传输协议的缩写，它用于传送WWW方式的数据，关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求，请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应，相应的内容包括消息协议的版本，成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。<br>　　通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行，一个或者多个头域，一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头，请求头，响应头和实体头四个部分。每个头域由一个域名，冒号（:）和域值三部分组成。域名是大小写无关的，域值前可以添加任何数量的空格符，头域可以被扩展为多行，在每行开始处，使用至少一个空格或制表符。<br>　　通用头域<br>　　通用头域包含请求和响应消息都支持的头域，通用头域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展，如果存在不支持的通用头域，一般将会作为实体头域处理。下面简单介绍几个在UPnP消息中使用的通用头域。<br>　　Cache-Control头域<br>　　Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached，响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下：<br>　　Public指示响应可被任何缓存区缓存。<br>　　Private指示对于单个用户的整个或部分响应消息，不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息，此响应消息对于其他用户的请求无效。<br>　　no-cache指示请求或响应消息不能缓存<br>　　no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。<br>　　max-age指示客户机可以接收生存期不大于指定时间（以秒为单位）的响应。<br>　　min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。<br>　　max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值，那么客户机可以接收超出超时期指定值之内的响应消息。<br>　　Date头域<br>　　Date头域表示消息发送的时间，时间的描述格式由rfc822定义。例如，Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时，换算成本地时间，需要知道用户所在的时区。<br>　　Pragma头域<br>　　Pragma头域用来包含实现特定的指令，最常用的是Pragma:no-cache。在HTTP/1.1协议中，它的含义和Cache-Control:no-cache相同。<br>　　请求消息<br>　　请求消息的第一行为下面的格式：<br>　　MethodSPRequest-URISPHTTP-VersionCRLFMethod表示对于Request-URI完成的方法，这个字段是大小写敏感的，包括OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE。方法GET和HEAD应该被所有的通用WEB服务器支持，其他所有方法的实现是可选的。GET方法取回由Request-URI标识的信息。HEAD方法也是取回由Request-URI标识的信息，只是可以在响应时，不返回消息体。POST方法可以请求服务器接收包含在请求中的实体信息，可以用于提交表单，向新闻组、BBS、邮件群组和数据库发送消息。<br>　　SP表示空格。Request-URI遵循URI格式，在此字段为星号（*）时，说明请求并不用于某个特定的资源地址，而是用于服务器本身。HTTP-Version表示支持的HTTP版本，例如为HTTP/1.1。CRLF表示换行回车符。请求头域允许客户端向服务器传递关于请求或者关于客户机的附加信息。请求头域可能包含下列字段Accept、Accept-Charset、Accept-Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If-Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、Proxy-Authorization、Range、Referer、User-Agent。对请求头域的扩展要求通讯双方都支持，如果存在不支持的请求头域，一般将会作为实体头域处理。<br>　　典型的请求消息：<br>　　GET <a href="http://download.microtool.de/somedata.exe">http://download.microtool.de:80/somedata.exe</a><br>　　Host: download.microtool.de<br>　　Accept: */*<br>　　Pragma: no-cache<br>　　Cache-Control: no-cache<br>　　Referer: <a href="http://download.microtool.de/">http://download.microtool.de/</a><br>　　User-Agent: Mozilla/4.04[en](Win95;I;Nav)<br>　　Range: bytes=554554-<br>　　上例第一行表示HTTP客户端（可能是浏览器、下载程序）通过GET方法获得指定URL下的文件。棕色的部分表示请求头域的信息，绿色的部分表示通用头部分。<br>　　Host头域<br>　　Host头域指定请求资源的Intenet主机和端口号，必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域，否则系统会以400状态码返回。<br>　　Referer头域<br>　　Referer头域允许客户端指定请求uri的源资源地址，这可以允许服务器生成回退链表，可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址，Referer不能被发送。如果指定的是部分uri地址，则此地址应该是一个相对地址。<br>　　Range头域<br>　　Range头域可以请求实体的一个或者多个子范围。例如，<br>　　表示头500个字节：bytes=0-499<br>　　表示第二个500字节：bytes=500-999<br>　　表示最后500个字节：bytes=-500<br>　　表示500字节以后的范围：bytes=500-<br>　　第一个和最后一个字节：bytes=0-0,-1<br>　　同时指定几个范围：bytes=500-600,601-999<br>　　但是服务器可以忽略此请求头，如果无条件GET包含Range请求头，响应会以状态码206（PartialContent）返回而不是以200（OK）。<br>　　User-Agent头域<br>　　User-Agent头域的内容包含发出请求的用户信息。<br>　　响应消息<br>　　响应消息的第一行为下面的格式：<br>　　HTTP-VersionSPStatus-CodeSPReason-PhraseCRLF<br>　　HTTP-Version表示支持的HTTP版本，例如为HTTP/1.1。Status-Code是一个三个数字的结果代码。Reason-Phrase给Status-Code提供一个简单的文本描述。Status-Code主要用于机器自动识别，Reason-Phrase主要用于帮助用户理解。Status-Code的第一个数字定义响应的类别，后两个数字没有分类的作用。第一个数字可能取5个不同的值：<br>　　1xx:信息响应类，表示接收到请求并且继续处理<br>　　2xx:处理成功响应类，表示动作被成功接收、理解和接受<br>　　3xx:重定向响应类，为了完成指定的动作，必须接受进一步处理<br>　　4xx:客户端错误，客户请求包含语法错误或者是不能正确执行<br>　　5xx:服务端错误，服务器不能正确执行一个正确的请求<br>　　响应头域允许服务器传递不能放在状态行的附加信息，这些域主要描述服务器的信息和Request-URI进一步的信息。响应头域包含Age、Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW-Authenticate。对响应头域的扩展要求通讯双方都支持，如果存在不支持的响应头域，一般将会作为实体头域处理。<br>　　典型的响应消息：<br>　　HTTP/1.0200OK<br>　　Date:Mon,31Dec200104:25:57GMT<br>　　Server:Apache/1.3.14(Unix)<br>　　Content-type:text/html<br>　　Last-modified:Tue,17Apr200106:46:28GMT<br>　　Etag:"a030f020ac7c01:1e9f"<br>　　Content-length:39725426<br>　　Content-range:bytes554554-40279979/40279980<br>　　上例第一行表示HTTP服务端响应一个GET方法。棕色的部分表示响应头域的信息，绿色的部分表示通用头部分，红色的部分表示实体头域的信息。<br>　　Location响应头<br>　　Location响应头用于重定向接收者到一个新URI地址。<br>　　Server响应头<br>　　Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释，产品标识一般按照重要性排序。<br>　　实体<br>　　请求消息和响应消息都可以包含实体信息，实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息，实体头包括Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。extension-header允许客户端定义新的实体头，但是这些域可能无法未接受方识别。实体可以是一个经过编码的字节流，它的编码方式由Content-Encoding或Content-Type定义，它的长度由Content-Length或Content-Range定义。<br>　　Content-Type实体头<br>　　Content-Type实体头用于向接收方指示实体的介质类型，指定HEAD方法送到接收方的实体介质类型，或GET方法发送的请求介质类型Content-Range实体头<br>　　Content-Range实体头用于指定整个实体中的一部分的插入位置，他也指示了整个实体的长度。在服务器向客户返回一个部分响应，它必须描述响应覆盖的范围和整个实体长度。一般格式：<br>　　Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth<br>　　例如，传送头500个字节次字段的形式：Content-Range:bytes0-499/1234如果一个http消息包含此节（例如，对范围请求的响应或对一系列范围的重叠请求），Content-Range表示传送的范围，Content-Length表示实际传送的字节数。<br>　　Last-modified实体头<br>　　Last-modified实体头指定服务器上保存内容的最后修订时间。 <br>　　例如，传送头500个字节次字段的形式：Content-Range:bytes0-499/1234如果一个http消息包含此节（例如，对范围请求的响应或对一系列范围的重叠请求），Content-Range表示传送的范围，Content-Length表示实际传送的字节数。<br>　　Last-modified实体头<br><br><strong>http协议结构</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP报文由从客户机到服务器的请求和从服务器到客户机的响应构成。请求报文格式如下：<br>　　请求行 － 通用信息头 － 请求头 － 实体头 － 报文主体<br>　　请求行以方法字段开始，后面分别是 URL 字段和 HTTP 协议版本字段，并以 CRLF 结尾。SP 是分隔符。除了在最后的 CRLF 序列中 CF 和 LF 是必需的之外，其他都可以不要。有关通用信息头，请求头和实体头方面的具体内容可以参照相关文件。<br>　　应报文格式如下：<br>　　状态行 － 通用信息头 － 响应头 － 实体头 － 报文主体<br>　　状态码元由3位数字组成，表示请求是否被理解或被满足。原因分析是对原文的状态码作简短的描述，状态码用来支持自动操作，而原因分析用来供用户使用。客户机无需用来检查或显示语法。有关通用信息头，响应头和实体头方面的具体内容可以参照相关文件。<br><br><strong>HTTP错误代码详细介绍</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "100" : Continue<br>　　"101" : witching Protocols<br>　　"200" : OK<br>　　"201" : Created<br>　　"202" : Accepted<br>　　"203" : Non-Authoritative Information<br>　　"204" : No Content<br>　　"205" : Reset Content<br>　　"206" : Partial Content<br>　　"300" : Multiple Choices<br>　　"301" : Moved Permanently<br>　　"302" : Found<br>　　"303" : See Other<br>　　"304" : Not Modified<br>　　"305" : Use Proxy<br>　　"307" : Temporary Redirect<br>　　HTTP 400 - 请求无效<br>　　HTTP 401.1 - 未授权：登录失败<br>　　HTTP 401.2 - 未授权：服务器配置问题导致登录失败<br>　　HTTP 401.3 - ACL 禁止访问资源<br>　　HTTP 401.4 - 未授权：授权被筛选器拒绝<br>　　HTTP 401.5 - 未授权：ISAPI 或 CGI 授权失败<br>　　HTTP 403 - 禁止访问<br>　　HTTP 403 - 对 Internet 服务管理器 (HTML) 的访问仅限于 Localhost<br>　　HTTP 403.1 禁止访问：禁止可执行访问<br>　　HTTP 403.2 - 禁止访问：禁止读访问<br>　　HTTP 403.3 - 禁止访问：禁止写访问<br>　　HTTP 403.4 - 禁止访问：要求 SSL<br>　　HTTP 403.5 - 禁止访问：要求 SSL 128<br>　　HTTP 403.6 - 禁止访问：IP 地址被拒绝<br>　　HTTP 403.7 - 禁止访问：要求客户证书<br>　　HTTP 403.8 - 禁止访问：禁止站点访问<br>　　HTTP 403.9 - 禁止访问：连接的用户过多<br>　　HTTP 403.10 - 禁止访问：配置无效<br>　　HTTP 403.11 - 禁止访问：密码更改<br>　　HTTP 403.12 - 禁止访问：映射器拒绝访问<br>　　HTTP 403.13 - 禁止访问：客户证书已被吊销<br>　　HTTP 403.15 - 禁止访问：客户访问许可过多<br>　　HTTP 403.16 - 禁止访问：客户证书不可信或者无效<br>　　HTTP 403.17 - 禁止访问：客户证书已经到期或者尚未生效<br>　　HTTP 404.1 - 无法找到 Web 站点<br>　　HTTP 404 - 无法找到文件<br>　　HTTP 405 - 资源被禁止<br>　　HTTP 406 - 无法接受<br>　　HTTP 407 - 要求代理身份验证<br>　　HTTP 410 - 永远不可用<br>　　HTTP 412 - 先决条件失败<br>　　HTTP 414 - 请求 - URI 太长<br>　　HTTP 500 - 内部服务器错误<br>　　HTTP 500.100 - 内部服务器错误 - ASP 错误<br>　　HTTP 500-11 服务器关闭<br>　　HTTP 500-12 应用程序重新启动<br>　　HTTP 500-13 - 服务器太忙<br>　　HTTP 500-14 - 应用程序无效<br>　　HTTP 500-15 - 不允许请求 global.asa<br>　　Error 501 - 未实现<br>　　HTTP 502 - 网关错误 
<img src ="http://www.cnitblog.com/lenatem/aggbug/51272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/lenatem/" target="_blank">雅量</a> 2008-11-10 10:17 <a href="http://www.cnitblog.com/lenatem/archive/2008/11/10/51272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tcpdump命令</title><link>http://www.cnitblog.com/lenatem/archive/2008/11/05/51121.html</link><dc:creator>雅量</dc:creator><author>雅量</author><pubDate>Wed, 05 Nov 2008 09:09:00 GMT</pubDate><guid>http://www.cnitblog.com/lenatem/archive/2008/11/05/51121.html</guid><wfw:comment>http://www.cnitblog.com/lenatem/comments/51121.html</wfw:comment><comments>http://www.cnitblog.com/lenatem/archive/2008/11/05/51121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/lenatem/comments/commentRss/51121.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/lenatem/services/trackbacks/51121.html</trackback:ping><description><![CDATA[<p>tcpdump采用命令行方式，它的命令格式为：<br>　　tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]<br>　　　　　　　　　　[ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]<br>　　　　　　　　　　[ -T 类型 ] [ -w 文件名 ] [表达式 ]</p>
<p>　　1. tcpdump的选项介绍<br>　　　-a 　　　将网络地址和广播地址转变成名字；<br>　　　-d 　　　将匹配信息包的代码以人们能够理解的汇编格式给出；<br>　　　-dd 　　　将匹配信息包的代码以c语言程序段的格式给出；<br>　　　-ddd 　　　将匹配信息包的代码以十进制的形式给出；<br>　　　-e 　　　在输出行打印出数据链路层的头部信息；<br>　　　-f 　　　将外部的Internet地址以数字的形式打印出来；<br>　　　-l 　　　使标准输出变为缓冲行形式；<br>　　　-n 　　　不把网络地址转换成名字；<br>　　　-t 　　　在输出的每一行不打印时间戳；<br>　　　-v 　　　输出一个稍微详细的信息，例如在ip包中可以包括ttl和服务类型的信息；<br>　　　-vv 　　　输出详细的报文信息；<br>　　　-c 　　　在收到指定的包的数目后，tcpdump就会停止；<br>　　　-F 　　　从指定的文件中读取表达式,忽略其它的表达式；<br>　　　-i 　　　指定监听的网络接口；<br>　　　-r 　　　从指定的文件中读取包(这些包一般通过-w选项产生)；<br>　　　-w 　　　直接将包写入文件中，并不分析和打印出来；<br>　　　-T 　　　将监听到的包直接解释为指定的类型的报文，常见的类型有rpc （远程过程调用）和snmp（简单网络管理协议；）</p>
<p>　　2. tcpdump的表达式介绍<br>　　　表达式是一个正则表达式，tcpdump利用它作为过滤报文的条件，如果一个报文满足表达式的条件，则这个报文将会被捕获。如果没有给出任何条件，则网络上所有的信息包将会被截获。<br>　　　在表达式中一般如下几种类型的关键字，一种是关于类型的关键字，主要包括host，net，port, 例如 host 210.27.48.2，指明 210.27.48.2是一台主机，net 202.0.0.0 指明202.0.0.0是一个网络地址，port 23 指明端口号是23。如果没有指定类型，缺省的类型是<br>host.<br>　　　第二种是确定传输方向的关键字，主要包括src , dst ,dst or src, dst and src ,<br>这些关键字指明了传输的方向。举例说明，src 210.27.48.2 ,指明ip包中源地址是210.27.<br>48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字，则<br>缺省是src or dst关键字。<br>　　　第三种是协议的关键字，主要包括fddi,ip ,arp,rarp,tcp,udp等类型。Fddi指明是在<br>FDDI(分布式光纤数据接口网络)上的特定的网络协议，实际上它是"ether"的别名，fddi和e<br>ther具有类似的源地址和目的地址，所以可以将fddi协议包当作ether的包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议，则tcpdump将会监听所有协议的信息包。<br>　　　除了这三种类型的关键字之外，其他重要的关键字如下：gateway, broadcast,less,<br>greater,还有三种逻辑运算，取非运算是 ''not '' ''! '', 与运算是''and'',''&amp;&amp;'';或运算 是''o<br>r'' ,''||''；<br>　　　这些关键字可以组合起来构成强大的组合条件来满足人们的需要，下面举几个例子来说明。<br>　　　(1)想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包：<br>　　　　#tcpdump host 210.27.48.1 <br>　　　(2) 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信，使用命令：（在命令行中适用　　　括号时，一定要<br>　　　　#tcpdump host 210.27.48.1 and (210.27.48.2 or 210.27.48.3 ) <br>　　　(3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包，使用命令：<br>　　　　#tcpdump ip host 210.27.48.1 and ! 210.27.48.2<br>　　　(4)如果想要获取主机210.27.48.1接收或发出的telnet包，使用如下命令：<br>　　　　#tcpdump tcp port 23 host 210.27.48.1 </p>
<p>　　3. tcpdump 的输出结果介绍<br>　　　下面我们介绍几种典型的tcpdump命令的输出信息<br>　　　(1) 数据链路层头信息<br>　　　使用命令#tcpdump --e host ice<br>　　　ice 是一台装有linux的主机，她的MAC地址是0：90：27：58：AF：1A<br>　　　H219是一台装有SOLARIC的SUN工作站，它的MAC地址是8：0：20：79：5B：46；上一条命令的输出结果如下所示：21:50:12.847509 eth0 &lt; 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 &gt; ice.telnet 0:0(0) ack 22535 win 8760 (DF)<br>　　分析：21：50：12是显示的时间， 847509是ID号，eth0 &lt;表示从网络接口eth0 接受该数据包，eth0 &gt;表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机H219的MAC地址,它表明是从源地址H219发来的数据包. 0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 &gt; ice.telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535<br>表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.</p>
<p>　　(2) ARP包的TCPDUMP输出信息<br>　　　使用命令#tcpdump arp <br>　　　得到的输出结果是：<br>　　22:32:42.802509 eth0 &gt; arp who-has route tell ice (0:90:27:58:af:1a)<br>　　22:32:42.802902 eth0 &lt; arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af<br>:1a)<br>　　分析: 22:32:42是时间戳, 802509是ID号, eth0 &gt;表明从主机发出该数据包, arp表明是ARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 0:90:27:58:af:1a是主机ICE的MAC地址。</p>
<p>　　(3) TCP包的输出信息<br>　　　用TCPDUMP捕获的TCP包的一般输出信息是：<br>　　src &gt; dst: flags data-seqno ack window urgent options<br>　　src &gt; dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (F<br>IN), P (PUSH) , R (RST) "." (没有标记); data-seqno是数据包中的数据的顺序号, ack是<br>下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针. <br>Options是选项.</p>
<p>　　(4) UDP包的输出信息<br>　　　用TCPDUMP捕获的UDP包的一般输出信息是：<br>　　route.port1 &gt; ice.port2: udp lenth<br>　　UDP十分简单，上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机ICE的port2端口，类型是UDP， 包的长度是lenth </p>
<img src ="http://www.cnitblog.com/lenatem/aggbug/51121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/lenatem/" target="_blank">雅量</a> 2008-11-05 17:09 <a href="http://www.cnitblog.com/lenatem/archive/2008/11/05/51121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>