﻿<?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>C++博客-w2001-随笔分类-Linux开发</title><link>http://www.cppblog.com/w2001/category/3750.html</link><description>camouflage.</description><language>zh-cn</language><lastBuildDate>Sat, 06 Aug 2011 15:11:41 GMT</lastBuildDate><pubDate>Sat, 06 Aug 2011 15:11:41 GMT</pubDate><ttl>60</ttl><item><title>VirtualBox + Android x86如何定制出与HD2同样的分辨率？</title><link>http://www.cppblog.com/w2001/archive/2011/08/06/152680.html</link><dc:creator>w2001</dc:creator><author>w2001</author><pubDate>Sat, 06 Aug 2011 14:41:00 GMT</pubDate><guid>http://www.cppblog.com/w2001/archive/2011/08/06/152680.html</guid><wfw:comment>http://www.cppblog.com/w2001/comments/152680.html</wfw:comment><comments>http://www.cppblog.com/w2001/archive/2011/08/06/152680.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/w2001/comments/commentRss/152680.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/w2001/services/trackbacks/152680.html</trackback:ping><description><![CDATA[1. Ctrl+R -&gt; CMD -&gt; Vbox目录下 -&gt; 输入VBoxManage setextradata "你的Android x86虚拟机名称" "CustomVideoMode1" "480x800x16"<br />2. 启动Android x86虚拟机，选择(HDPI)启动配置，按'e'键，编辑其启动选项<br />3. 在kernel行上按'e'键，编辑该启动选项。在最后面添加两个行参数"vga=ask UVESA_MODE=480x800"，确认之<br />4. 然后按'b'，booting，接下来你就会看到DPI和分辨率跟HD2一摸一样的Android x86了.....<br /><img src ="http://www.cppblog.com/w2001/aggbug/152680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/w2001/" target="_blank">w2001</a> 2011-08-06 22:41 <a href="http://www.cppblog.com/w2001/archive/2011/08/06/152680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STUN检测NAT类型原理(转)</title><link>http://www.cppblog.com/w2001/archive/2009/01/14/72012.html</link><dc:creator>w2001</dc:creator><author>w2001</author><pubDate>Wed, 14 Jan 2009 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/w2001/archive/2009/01/14/72012.html</guid><wfw:comment>http://www.cppblog.com/w2001/comments/72012.html</wfw:comment><comments>http://www.cppblog.com/w2001/archive/2009/01/14/72012.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/w2001/comments/commentRss/72012.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/w2001/services/trackbacks/72012.html</trackback:ping><description><![CDATA[STUN是RFC3489规定的一种NAT穿透方式，它采用辅助的方法探测NAT的IP和端口。毫无疑问的，它对穿越早期的NAT起了巨大的作用，并且还将继续在ANT穿透中占有一席之地。<br>STUN的探测过程需要有一个公网IP的STUN Server，在NAT后面的UAC（User Agent Client）必须和此Server配合，互相之间发送若干个UDP数据包。UDP包中包含有UAC需要了解的信息，比如NAT外网 IP，PORT等等。UAC通过是否得到这个UDP包和包中的数据判断自己的NAT类型。<br>假设有如下UAC（B），NAT（A），STUN SERVER（C），UAC的IP为IPB，NAT的IP为IPA，SERVER的IP为IPC1、IPC2。请注意，STUN 服务器C有两个IP，后面你会理解为什么需要两个IP。<br><br><span style="font-weight: bold;">STEP1：</span><br>B向C的IP1的port1端口发送一个UDP包。C收到这个包后，会把它收到包的源IP和port写到UDP包中，然后把此包通过IP1和port1发还给B。这个IP和port也就是NAT的外网IP和port，也就是说UAC在STEP1中就得到了NAT的外网IP。<br>如果在UAC向一个STUN服务器发送数据包后，没有收到STUN的任何回应包，那只有两种可能：1、STUN服务器不存在，或者port弄错了；2、你的NAT拒绝一切UDP包从外部向内部通过（我们公司的NAT就是）。<br>当B收到此UDP后，把此UDP中的IP和自己的IP做比较，如果是一样的，就说明自己是在公网。如果不一样，说明有NAT的存在，系统进行STEP2的操作。<br><br><span style="font-weight: bold;">STEP2：</span><br>B向C的IP1发送一个UDP包，请求C通过另外一个IP2和PORT（不同与SETP1的IP1）向B返回一个UDP数据包（现在知道为什么C要有两个IP了吧，呵呵）。<br>我们来分析一下，如果B收到了这个数据包，那说明什么？说明NAT来者不拒，不对数据包进行任何过滤，这也就是STUN标准中的full cone NAT。遗憾的是，full cone NAT太少了，这也意味着你能收到这个数据包的可能性不大。如果没收到，那么系统进行STEP3的操作。<br><br><span style="font-weight: bold;">STEP3：</span><br>B向C的IP2的port2发送一个数据包，C收到数据包后，把它收到包的源IP和port写到UDP包中，然后通过自己的IP2和port2把此包发还给B。和step1一样，B肯定能收到这个回应UDP包。此包中的port是我们最关心的数据，下面我们来分析：<br>如果这个port和step1中的port一样，那么可以肯定这个NAT是个CONE NAT，否则是对称NAT。道理很简单：根据对称NAT的规则，当目的地址的IP和port有任何一个改变，那么NAT都会重新分配一个port使用，而在step3中，和step1对应，我们改变了IP和port。因此，如果是对称NAT,那这两个port肯定是不同的。<br>如果在你的应用中，到此步的时候PORT是不同的，恭喜你，你的STUN已经死了。如果不同，那么只剩下了restrict cone和port restrict cone。系统用step4探测是是哪一种。<br><br><span style="font-weight: bold;">STEP4：</span><br>B向C的IP2的一个端口PD发送一个数据请求包，要求C用IP2和不同于PD的port返回一个数据包给B。<br>我们来分析结果：如果B收到了，那也就意味着只要IP相同，即使port不同，NAT也允许UDP包通过。显然这是restrict cone NAT。如果没收到，没别的好说，port restrict NAT.<br>  <img src ="http://www.cppblog.com/w2001/aggbug/72012.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/w2001/" target="_blank">w2001</a> 2009-01-14 16:57 <a href="http://www.cppblog.com/w2001/archive/2009/01/14/72012.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>四种不同的NAT类型</title><link>http://www.cppblog.com/w2001/archive/2007/04/13/21795.html</link><dc:creator>w2001</dc:creator><author>w2001</author><pubDate>Fri, 13 Apr 2007 07:43:00 GMT</pubDate><guid>http://www.cppblog.com/w2001/archive/2007/04/13/21795.html</guid><wfw:comment>http://www.cppblog.com/w2001/comments/21795.html</wfw:comment><comments>http://www.cppblog.com/w2001/archive/2007/04/13/21795.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/w2001/comments/commentRss/21795.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/w2001/services/trackbacks/21795.html</trackback:ping><description><![CDATA[<p><strong>讨论前提<br /></strong><br />考虑到UDP的无状态特性，目前针对其的NAT实现大致可分为Full Cone、Restricted Cone、Port Restricted Cone和Symmetric NAT四种。值得指出的是，对于TCP协议而言，一般来说，目前NAT中针对TCP的实现基本上是一致的，其间并不存在太大差异，这是因为TCP协议本身便是面向连接的，因此无需考虑网络连接无状态所带来复杂性。</p>
<p><strong>用语定义</strong><br /><strong><br />1.内部Tuple</strong>：指内部主机的私有地址和端口号所构成的二元组，即内部主机所发送报文的源地址、端口所构成的二元组<br /><strong>2.外部Tuple</strong>：指内部Tuple经过NAT的源地址/端口转换之后，所获得的外部地址、端口所构成的二元组，即外部主机收到经NAT转换之后的报文时，它所看到的该报文的源地址（通常是NAT设备的地址）和源端口<br /><strong>3.目标Tuple</strong>：指外部主机的地址、端口所构成的二元组，即内部主机所发送报文的目标地址、端口所构成的二元组</p>
<p><strong>详细释义</strong><br /><strong><br />1. Full Cone NAT</strong>：所有来自同一个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y，而不管这些请求是不是属于同一个应用或者是多个应用的。除此之外，当X-Y的转换关系建立之后，任意外部主机均可随时将Y中的地址和端口作为目标地址和目标端口，向内部主机发送UDP报文，由于对外部请求的来源无任何限制，因此这种方式虽然足够简单，但却不那么安全<br /><strong><br />2. Restricted Cone NAT</strong>：它是Full Cone的受限版本：所有来自同一个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y，这与Full Cone相同，但不同的是，只有当内部主机曾经发送过报文给外部主机（假设其IP地址为Z）后，外部主机才能以Y中的信息作为目标地址和目标端口，向内部主机发送UDP请求报文，这意味着，NAT设备只向内转发（目标地址/端口转换）那些来自于当前已知的外部主机的UDP报文，从而保障了外部请求来源的安全性<br /><strong><br />3. Port Restricted Cone NAT</strong>：它是Restricted Cone NAT的进一步受限版。只有当内部主机曾经发送过报文给外部主机（假设其IP地址为Z且端口为P）之后，外部主机才能以Y中的信息作为目标地址和目标端口，向内部主机发送UDP报文，同时，其请求报文的源端口必须为P，这一要求进一步强化了对外部报文请求来源的限制，从而较Restrictd Cone更具安全性<br /><strong><br />4. Symmetric NAT</strong>：这是一种比所有Cone NAT都要更为灵活的转换方式：在Cone NAT中，内部主机的内部Tuple与外部Tuple的转换映射关系是独立于内部主机所发出的UDP报文中的目标地址及端口的，即与目标Tuple无关；在Symmetric NAT中，目标Tuple则成为了NAT设备建立转换关系的一个重要考量：只有来自于同一个内部Tuple 、且针对同一目标Tuple的请求才被NAT转换至同一个外部Tuple，否则的话，NAT将为之分配一个新的外部Tuple；打个比方，当内部主机以相同的内部Tuple对2个不同的目标Tuple发送UDP报文时，此时NAT将会为内部主机分配两个不同的外部Tuple，并且建立起两个不同的内、外部Tuple转换关系。与此同时，只有接收到了内部主机所发送的数据包的外部主机才能向内部主机返回UDP报文，这里对外部返回报文来源的限制是与Port Restricted Cone一致的。不难看出，如果说Full Cone是要求最宽松NAT UDP转换方式，那么，Symmetric NAT则是要求最严格的NAT方式，其不仅体现在转换关系的建立上，而且还体现在对外部报文来源的限制方面。<br /><br />参考：<a href="http://kangxy.spaces.live.com/Blog/cns!1pPRmwqHVL0ggOeJCDmZc6Pg!116.entry">UDP&quot;打洞&quot;原理</a></p><img src ="http://www.cppblog.com/w2001/aggbug/21795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/w2001/" target="_blank">w2001</a> 2007-04-13 15:43 <a href="http://www.cppblog.com/w2001/archive/2007/04/13/21795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux小经验(随时修改中)</title><link>http://www.cppblog.com/w2001/archive/2007/03/14/19784.html</link><dc:creator>w2001</dc:creator><author>w2001</author><pubDate>Tue, 13 Mar 2007 16:22:00 GMT</pubDate><guid>http://www.cppblog.com/w2001/archive/2007/03/14/19784.html</guid><wfw:comment>http://www.cppblog.com/w2001/comments/19784.html</wfw:comment><comments>http://www.cppblog.com/w2001/archive/2007/03/14/19784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/w2001/comments/commentRss/19784.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/w2001/services/trackbacks/19784.html</trackback:ping><description><![CDATA[1. 如何让Fedora 4启动以后直接进入Console或者X-Windows?<br>vim /etc/inittab，id: x: initdefault:... 字样，x=3为Console，而x=5则为X-Windows<br><br>2. Linux提供了6个虚拟控制台，在Console下用Alt+F1~F6切换，而在X-window下则用Ctrl+Alt+F1~F6切换；注意，虚拟控制台7默认为X-Windows；在VMWare中，应该按Ctrl+Alt+Space+F1~F7<br><br>3. 如何更改引导Console屏幕的分辨率<br>打开/boot/grub/menu.lst，在kernel字样行末追加vga=0x314(800*600*16)，或vga=0x317(1024*768*16)<br><br>4. lftp/ncftp是两个支持ipv6的ftp client<br><br>5. 手工配置网络<br>/etc/resolv.conf<br>/etc/hosts<br>/etc/sysconfig/network<br>/etc/sysconfig/networking/devices/ifcfg-eth0<br>/etc/sysconfig/networking/profiles/default/*<br>/etc/sysconfig/network-scripts/ifcfg-eth0p<br>---------------------------------------------------<br>/etc/init.d/network restart<br>/etc/rc.d/init.d/network restart<br>service network restart<br><br>6. 查看系统配置<br>#cat /proc/cpuinfo <br>#cat /proc/meminfo <br>#fdisk -l <br>#lspci <br><br>7. 比较耗的几个命令备忘<br>prelink /&nbsp;updatedb / makewhatis<br><br>8. 启用(不启用)交换分区 swapon -s / swapoff<br><br>9. 使用U盘：fdisk -l看U盘盘符，然后mount -t vfat /dev/sda1 /mnt/usb，卸载用umount /dev/sda1<br><br>10. 在/etc/sysconfig/network-scripts中的ifcfg-eth0脚本中可以修改网卡的MAC地址及其与IP地址的绑定关系<br><br>11. 修改fstab时，不要用label，而应该直接填入fdisk -l所得到的值，如/dev/hda8等<br><br>12. 有iso和winxp，如何从硬盘安装本地的Linux（双系统）?<br>变态大法，在winxp里面装一个vmware，把整个物理盘当作一个虚拟盘挂上(entire disk)，在vmware里面用iso装linux，装好以后重启...记得首先必须在xp中用磁盘管理器将要划给linux的分区和逻辑盘符全卸载掉，否则linux安装会出错.用这种方法最适合无需X-windows的情况.
<img src ="http://www.cppblog.com/w2001/aggbug/19784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/w2001/" target="_blank">w2001</a> 2007-03-14 00:22 <a href="http://www.cppblog.com/w2001/archive/2007/03/14/19784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Fedora Linux里面的Console中文编码问题</title><link>http://www.cppblog.com/w2001/archive/2007/03/12/19637.html</link><dc:creator>w2001</dc:creator><author>w2001</author><pubDate>Mon, 12 Mar 2007 07:50:00 GMT</pubDate><guid>http://www.cppblog.com/w2001/archive/2007/03/12/19637.html</guid><wfw:comment>http://www.cppblog.com/w2001/comments/19637.html</wfw:comment><comments>http://www.cppblog.com/w2001/archive/2007/03/12/19637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/w2001/comments/commentRss/19637.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/w2001/services/trackbacks/19637.html</trackback:ping><description><![CDATA[问题表现：小企鹅输入法的编码配置导致Console中的Man出现&lt;A1&gt;&lt;AF&gt;的乱码，比如，man setup/man tcpdump<br /><br />解决方案：禁止Console使用中文编码，在.bash_profile或.bashrc中将CHARSET和LANG均修改为en_US.utf8；同时记得在SecureCRT中将Session的编码改为UTF-8即可。<br /><br />遗留问题：上述方法带来了一些新问题，首先，cat一个GB2312编码的文件，发现SecureCRT中是乱码，这是因为GB2312被SecureCRT解释成了UTF-8，翻了翻man，发现一个自带的编码转换工具iconv不错，于是将它作为一个alias写在.bashrc里面了："alias ic='iconv -f GB2312 -t UTF-8'"，这样，只需"cat filename | ic"可正确输出GB2312编码的文件。其次，还存在着一个问题，那便是vim，vim一个GB2312编码的文件，也发现了乱码，仔细思考了一下，发现只需要把/etc/vimrc中vim打开文件的默认编码改成GB2312即可，即在其最后添加上"set fileencoding=gbk"、"set fileencodings=utf-8,gbk,utf-16,big5"即可。<br /><br />至此，问题全部解决。<img src ="http://www.cppblog.com/w2001/aggbug/19637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/w2001/" target="_blank">w2001</a> 2007-03-12 15:50 <a href="http://www.cppblog.com/w2001/archive/2007/03/12/19637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>