<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Gavin</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/22578/rss</id><updated>2011-04-08T06:27:48Z</updated><author><name>YZG</name><uri>http://www.cnblogs.com/yizhinantian/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yizhinantian/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/22578/rss"/><entry><id>http://www.cnblogs.com/yizhinantian/archive/2011/04/04/2005406.html</id><title type="text">如何在Linux下实现50万并发</title><summary type="text">网络上发现的一篇文章，虽然对问题介绍的不是特别深入，不过作为了解性的文章很不错。标题颇有标题党的感觉。。。 或参考http://gavin1992.gotoip2.com/papperdetails_tech.php?pid=15&amp;amp;tit=如何在Linux下实现50万并发%20C500K原文地址：http://urbanairship.com/blog/2010/09/29/linux-kernel-tuning-for-c500k/Linux Kernel Tuning for C500kBy Jared &amp;quot;Lucky&amp;quot; Kuolt • September 29t</summary><published>2011-04-04T13:16:00Z</published><updated>2011-04-04T13:16:00Z</updated><author><name>YZG</name><uri>http://www.cnblogs.com/yizhinantian/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yizhinantian/archive/2011/04/04/2005406.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yizhinantian/archive/2011/04/04/2005406.html"/><content type="html">&lt;div&gt; &lt;!--[endif]--&gt;&#xD;
&lt;p&gt;网络上发现的一篇文章，虽然对问题介绍的不是特别深入，不过作为了解性的文章很不错。标题颇有标题党的感觉。。。 &lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div&gt;&lt;div&gt;或参考&lt;/div&gt;http://gavin1992.gotoip2.com/papperdetails_tech.php?pid=15&amp;amp;tit=如何在Linux下实现50万并发%20C500K&lt;/div&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;原文地址：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&#xD;
&lt;div&gt;&lt;a href="http://urbanairship.com/blog/2010/09/29/linux-kernel-tuning-for-c500k/"&gt;&lt;span style="font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; color: windowtext; text-decoration: none;"&gt;http://urbanairship.com/blog/2010/09/29/linux-kernel-tuning-for-c500k/&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&#xD;
&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;span style="font-size: 24pt; font-family: 宋体;"&gt;Linux Kernel Tuning for C500k&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;By Jared "Lucky" Kuolt &amp;#8226; September 29th, 2010 &amp;#8226; Posted in &lt;a href="http://urbanairship.com/blog/categories/android/" title="View all posts in Android"&gt;Android&lt;/a&gt; &amp;#8226; &lt;a href="http://urbanairship.com/blog/2010/09/29/linux-kernel-tuning-for-c500k/#comments" title="Comment on Linux Kernel Tuning for C500k"&gt;24 Comments&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;Note: Concurrency, as defined in this article, is the same as it is for &lt;a href="http://www.kegel.com/c10k.html"&gt;The C10k problem&lt;/a&gt;: concurrent clients (or sockets).&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;At Urban Airship we recently published a &lt;a href="http://urbanairship.com/blog/2010/08/24/c500k-in-action-at-urban-airship/"&gt;blog post&lt;/a&gt; about scaling beyond 500,000 concurrent socket connections. Hitting these numbers was not a trivial exercise so we&amp;#8217;re going to share what we&amp;#8217;ve come across during our testing. This guide is specific to Linux and has some information related to Amazon EC2, but it is not EC2-centric. These principles should apply to just about any Linux platform.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;For our usage, squeezing out as many possible socket connections per server is valuable. Instead of running 100 servers with 10,000 connections each, we&amp;#8217;d rather run 2 servers with 500,000 connections apiece. To do this we made the socket servers pretty much &lt;em&gt;just&lt;/em&gt; socket servers. Any communication between the client and server is passed through &lt;a href="http://kr.github.com/beanstalkd/"&gt;a queue&lt;/a&gt; and processed by a worker. Having less for the socket server to do means less code, cpu-usage, and ram-usage.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;To get to these numbers we must consider the Linux kernel itself. A number of configurations needed tweaking. But first, an anecdote. &lt;strong&gt;（&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-size: 12pt; font-family: 宋体; color: red;"&gt;下面开始讲故事....）&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;span style="font-size: 18pt; font-family: 宋体;"&gt;The Kernel, OOM, LOWMEM, and You&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;We first tested our code on a local Linux box that had &lt;strong&gt;Ubuntu 64-bit with 6GB of RAM&lt;/strong&gt;, connecting with several Ubuntu VMs per client using bridged network adapters so we could ramp up our connections. We&amp;#8217;d fire up the server and run our clients locally to see just how many connections we could hit. We noticed that we could hit 512,000 with our Java server not even breaking a sweat.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;The next step was to test on EC2. We first wanted to see what sort of numbers we could get on &lt;strong&gt;&amp;#8220;Small&amp;#8221; instances, which are&lt;/strong&gt; &lt;strong&gt;1.7GB 32-bit VMs&lt;/strong&gt;. We also had to fire up a number of other EC2 instances to act as clients.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;We watched the numbers go up and up without a hitch until, seemingly randomly, the Java server fell over. It didn&amp;#8217;t print any exceptions or die gracefully&amp;#8212;it was killed.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;We tried the same process again to see if we could replicate the behavior. Killed again.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;Grepping through syslog, we found this line:&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;Out of Memory&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;: Killed process 2178 java&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;The OOM-killer killed the Java process. Having watched the free RAM closely, this was odd because we had at least 500MB free at the time of the kill.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;The next time we ran it we watched the contents of &lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;/proc/meminfo&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;. What we noticed was a steady decline of the field &amp;#8220;LowFree&amp;#8221;, the amount of LOWMEM that is available. LOWMEM is the kernel-addressable RAM space used for kernel data. Data like socket buffers.&lt;/span&gt;&lt;br /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;As we increased the number of sockets each socket&amp;#8217;s buffers increased the amount of LOWMEM used. Once LOWMEM was full the kernel (instead of simply panicking) found the user process responsible for the usage and promptly killed it so it could continue to function.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;On a standard EC2 Small, the configuration is such that the LOWMEM is around 717MB and the rest is &amp;#8220;given&amp;#8221; to the user. The kernel is smart about reallocating LOWMEM for the user, but not the other way around. The assumption is that the kernel will use very little ram, or at least a predictable finite amount, and the user should be allowed to go crazy. What we needed with our socket server was just the opposite. We needed the kernel to use all the ram it needed&amp;#8212;our Java server rarely uses above a few hundred MB.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;strong&gt;(&lt;span style="color: red;"&gt;简单的说：在32位Linux机器上，服务器端运行一段时间就被killed掉，由于Linux内核可用内存不够,即低端内存不够，大约只有717MB可用，&lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong style="color: red;"&gt;32位Linux系统下，内核空间极限896M&lt;/strong&gt;&lt;strong style="color: red;"&gt;)。 &lt;/strong&gt;&lt;/p&gt;&#xD;
&amp;nbsp;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;(For an in-depth rundown, take a look at &lt;a href="http://kerneltrap.org/node/2450"&gt;High Memory In The Linux Kernel&lt;/a&gt;)&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;On a 32-bit system the kernel-addressable RAM space is 4GB. Making sure the proper space reserved for the kernel is important. But on 64-bit (x86-64) Linux the &lt;a href="http://en.wikipedia.org/wiki/X86-64#Linux"&gt;kernel-addressable space is 64TB (terabytes)&lt;/a&gt;. At the current state of computing this is effectively limitless, and as such you will not even see LowMem in &lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;/proc/meminfo&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt; because it is &lt;em&gt;all&lt;/em&gt; LOWMEM.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;So we created some EC2 Large instances (&lt;strong&gt;each of which is 64-bit with 7.5GB of RAM)&lt;/strong&gt; and ran our tests again, this time without any surprises. The sockets were added happily and the kernel took all the RAM it needed.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;span style="font-size: 12pt; font-family: 宋体; color: red;"&gt;Long story short, you can only scale to so many sockets on a 32-bit platform.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;span style="font-size: 18pt; font-family: 宋体;"&gt;Kernel Options&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong style="color: red;"&gt;（为了使服务器能接收尽量多的连接，需要调整的内核参数）&lt;/strong&gt;&lt;span style="color: red;"&gt; &lt;/span&gt;&lt;br style="color: red;" /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;Several parameters exist to allow for tuning and tweaking of socket-related parameters. In &lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;/etc/sysctl.conf&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt; there are a few options we&amp;#8217;ve modified.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;First is &lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;fs.file-max&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;, the maximum file descriptor limit. The default is quite low so this should be adjusted. Be careful if you&amp;#8217;re not ready to go super high.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;Second, we have the socket buffer parameters &lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;net.ipv4.tcp_rmem&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt; and &lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;net.ipv4.tcp_wmem&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;. These are the buffers for reads and writes respectively. Each requires three integer inputs: min, default, and max. These each correspond to the number of bytes that may be buffered for a socket. Set these low with a tolerant max to reduce the amount of ram used for each socket.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;The relevant portions of our config look like this:&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;fs.file-max = 999999&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;net.ipv4.tcp_rmem = 4096 4096 16777216&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;net.ipv4.tcp_wmem = 4096 4096 16777216&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;Meaning that the kernel allows for 999,999 open file descriptors and each socket buffer has a minimum and default 4096-byte buffer, with a sensible max of 16MB.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br style="color: red;" /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;We also modified &lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;/etc/security/limits.conf&lt;/span&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt; to allow for 999,999 open file descriptors for all users.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;#&amp;lt;domain&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;type&amp;gt;&amp;nbsp;&amp;lt;item&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nofile&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 999999&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;You may want to look at the &lt;a href="http://ss64.com/bash/limits.conf.html"&gt;manpage&lt;/a&gt; for more information.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;strong style="color: red;"&gt;（作者调整的是文件系统中最大文件数限制，tcp读写buffer大小。如果是单进程，还需要调整每个进程能打开的最大文件数，ulimit -n）&lt;/strong&gt; &lt;/div&gt;&#xD;
&amp;nbsp;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;span style="font-size: 18pt; font-family: 宋体;"&gt;Testing&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;When testing, we were able to get about 64,000 connections per client by increasing the number of ephemeral ports allowed on both the client and the server.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;echo "1024 65535" &amp;gt; /proc/sys/net/ipv4/ip_local_port_range&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;This effectively allows every ephemeral port above 1024 be used instead of the default, which is a much lower (and typically more sane) default.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong style="color: red;"&gt;（调整端口范围，必须在1024之后。）&lt;/strong&gt;&lt;span style="color: red;"&gt; &lt;/span&gt;&lt;br style="color: red;" /&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;span style="font-size: 13.5pt; font-family: 宋体;"&gt;The 64k Connection Myth&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;It&amp;#8217;s a common misconception that you can only accept 64,000 connections per IP address and the only way around it is to add more IPs. This is &lt;em&gt;absolutely false&lt;/em&gt;.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;The misconception begins with the premise that there are only so many ephemeral ports per IP. The truth is that the limit is based on the IP &lt;em&gt;pair&lt;/em&gt;, or said another way, the client and server IPs together. A single client IP can connect to a server IP 64,000 times and so can another client IP.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;Were this myth true it would be a significant and easy-to-exploit DDoS vector.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong style="color: red;"&gt;&amp;nbsp;（常见误区）&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;&lt;span style="font-size: 18pt; font-family: 宋体;"&gt;Scaling for Everyone&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;When we set out to establish half a million connections on a single server we were diving deep into water that wasn&amp;#8217;t well documented. Sure, we know that C10k is relatively trivial, but how about an order of magnitude (and then some) above that?&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;span style="font-size: 12pt; font-family: 宋体;"&gt;Fortunately we&amp;#8217;ve been able to achieve success without too many serious problems. Hopefully our solutions can help save time for those out there looking to solve the same problems.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;//////////////////////////////////////////&lt;strong&gt;/&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;strong style="color: red;"&gt;摘抄了部分精彩回复&lt;/strong&gt;&lt;span style="color: red;"&gt;&amp;nbsp;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;cite&gt;&lt;span style="font-family: 宋体;"&gt;&lt;a href="http://twitter.com/jkalucki"&gt;John Kalucki&lt;/a&gt;&lt;/span&gt;&lt;/cite&gt; at 12:10 am on October 1, 2010&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;If you lose connectivity to a large fraction of the internet, your sockets will back up and you might exhaust memory and cause the TCP stack to freeze. &lt;strong&gt;Setting the aggregate wmem demand possible to be only a fraction of RAM avoids this out-of-memory situation at the cost of throughput-per-socket. (正确的设置tcp_wmen，否则网络状况不好的时候，oom)&lt;br /&gt;&#xD;
&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;We&amp;#8217;ve experienced just this situation a number of times on the User Streams clusters of the Twitter Streaming API. A route flap, or a LB restart can cause an entire cluster of boxes to lock up if we don&amp;#8217;t manage wmem correctly.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;You may also want to tune tcp_retries2 down from the default of 15, which is about 2 hours, to something more reasonable. This allows you to reap connections to devices that have been shut off, and thus increase your density of active users per server. Otherwise the number of dead connections per server can, &lt;strong&gt;in our use-case, reach as high as 30%. We tuned down to 5 or 6, and the ratio of stale established connections is now very low.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&lt;strong style="color: red;"&gt;(补充tcp_retries2：&lt;/strong&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong style="color: red;"&gt;How many times to retry before killing alive TCP connection. RFC1122 says that the limit should be longer than 100 sec. It is too small number. The default value of 15 corresponds to ~ 13 - 30 minutes, depending on RTO. &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong style="color: red;"&gt;参考tcp协议栈性能调整系列文章)&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/yizhinantian/aggbug/2005406.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yizhinantian/archive/2011/04/04/2005406.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yizhinantian/archive/2011/04/03/2004347.html</id><title type="text">Linux tcp socket相关参数设置</title><summary type="text">内容主要从网络上摘抄的，稍作了一下整理来源1： http://www.cnblogs.com/alli/archive/2011/01/11/1932599.html1.进程打开文件数限制ulimit –n ==》 ulimit –n 1000000这表示当前用户的每个进程最多允许同时打开1024个文件，这1024个文件中还得除去每个进程必然打开的标准输入，标准输出，标准错误，服务器监听socket，进程间通讯的unix域socket等文件，那么剩下的可用于客户端socket连接的文件数就只有大概1024-10=1014个左右。也就是说缺省情况下，基于Linux的通讯程序最多允许同时1014个</summary><published>2011-04-03T04:38:00Z</published><updated>2011-04-03T04:38:00Z</updated><author><name>YZG</name><uri>http://www.cnblogs.com/yizhinantian/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yizhinantian/archive/2011/04/03/2004347.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yizhinantian/archive/2011/04/03/2004347.html"/><content type="html">&lt;p&gt;内容主要从网络上摘抄的，稍作了一下整理&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;来源1： &lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/alli/archive/2011/01/11/1932599.html"&gt;&lt;span&gt;http://www.cnblogs.com/alli/archive/2011/01/11/1932599.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1.进程打开文件数限制&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;ulimit &amp;#8211;n&lt;span&gt;&amp;nbsp;&amp;nbsp; ==&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体"&gt;》&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt; ulimit &amp;#8211;n 1000000&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10.5pt; font-family: 宋体"&gt;&amp;nbsp;这表示当前用户的每个进程最多允许同时打开&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'"&gt;1024&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 宋体"&gt;个文件，这&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'"&gt;1024&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 宋体"&gt;个文件中还得除去每个进程必然打开的标准输入，标准输出，标准错误，服务器监听&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'"&gt;socket&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 宋体"&gt;，进程间通讯的&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'"&gt;unix&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 宋体"&gt;域&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'"&gt;socket&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 宋体"&gt;等文件，那么剩下的可用于客户端&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'"&gt;socket&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 宋体"&gt;连接的文件数就只有大概&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'"&gt;1024-10=1014&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 宋体"&gt;个左右。也就是说缺省情况下，基于&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'"&gt;Linux&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 宋体"&gt;的通讯程序最多允许同时&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'"&gt;1014&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 宋体"&gt;个&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif'"&gt;TCP&lt;/span&gt;&lt;span style="font-size: 10.5pt; font-family: 宋体"&gt;并发连接。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10.5pt; font-family: 宋体"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 10.5pt; color: red; font-family: 宋体"&gt;典型现象：当connect,accpet 1000个左右连接后开始失败。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10.5pt; font-family: 宋体"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10.5pt; font-family: 宋体"&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;2&lt;span style="font-family: 宋体"&gt;、网络内核对&lt;/span&gt;TCP&lt;span style="font-family: 宋体"&gt;连接的有关限制&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.1 端口号范围限制&lt;/p&gt;&#xD;
&lt;p&gt;net.ipv4.ip_local_port_range = 1025 65000&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="color: red"&gt;到同一个主机的连接，超过端口用完后就会失败，这就是我们经常在网上看到的，说客户端最多只能向服务器发起6万多个连接。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2.2 iptable netfilter&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;第二种无法建立&lt;/span&gt;TCP&lt;span style="font-family: 宋体"&gt;连接的原因可能是因为&lt;/span&gt;Linux&lt;span style="font-family: 宋体"&gt;网络内核的&lt;/span&gt;IP_TABLE&lt;span style="font-family: 宋体"&gt;防火墙对最大跟踪的&lt;/span&gt;TCP&lt;span style="font-family: 宋体"&gt;连接数有限制。此时程序会表现为在&lt;/span&gt;connect()&lt;span style="font-family: 宋体"&gt;调用中阻塞，如同死机，如果用&lt;/span&gt;tcpdump&lt;span style="font-family: 宋体"&gt;工具监视网络，也会发现根本没有&lt;/span&gt;TCP&lt;span style="font-family: 宋体"&gt;连接时客户端发&lt;/span&gt;SYN&lt;span style="font-family: 宋体"&gt;包的网络流量。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;net.ipv4.ip_conntrack_max = 10240&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3.进程号&lt;/p&gt;&#xD;
&lt;p  style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"&gt;&lt;span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-bidi-font-size: 11.0pt; mso-font-kerning: 0pt"&gt;cat /proc/sys/kernel/pid_max &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span lang="EN-US"&gt;But you &lt;em&gt;&lt;span style="font-family: 宋体; mso-bidi-font-family: 宋体"&gt;can&lt;/span&gt;&lt;/em&gt; change that too; on a 32-bit machine that'd be 2**22 as an absolute upper limit, &lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span lang="EN-US"&gt;so:&lt;code&gt;&lt;font face="宋体"&gt;% sudo bash -c 'echo 4194303 &amp;gt; /proc/sys/kernel/pid_max'&lt;/font&gt;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span lang="EN-US"&gt;&lt;code&gt;&lt;font face="宋体"&gt;&lt;/font&gt;&lt;/code&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span lang="EN-US"&gt;&lt;code&gt;&lt;font face="宋体"&gt;4. tcp 协议栈参数&lt;/font&gt;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span lang="EN-US"&gt;&lt;code&gt;&lt;font face="宋体"&gt;&amp;nbsp;待续...&lt;/font&gt;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 10.5pt; font-family: 宋体"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yizhinantian/aggbug/2004347.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yizhinantian/archive/2011/04/03/2004347.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yizhinantian/archive/2011/04/03/2004340.html</id><title type="text">对Linux下socket限制的理解</title><summary type="text">最近在网络上看到一个关于Linux下socket数量限制相关的讨论，主要讨论在linux下，是否能支持10甚至百万个tcp并发连接。讨论1：在32为系统下，最大连接数的极限值是多少？从系统内存的角度考虑，32位系统最大支持4G内存，内核空间为1G。如果每个socket占用的内存为C,那么最大连接数为：maxconn = 1GB/C如何分析每个socket占用的内核空间内存呢？分析socket占用内存的组成部分：文件系统inode +socket结构 + tcp windows。tcp windows的内存实际上就是挂在sk结构下的skb队列，skb是真正存储数据的地方，也就是消耗内存的地方。如</summary><published>2011-04-03T04:25:00Z</published><updated>2011-04-03T04:25:00Z</updated><author><name>YZG</name><uri>http://www.cnblogs.com/yizhinantian/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yizhinantian/archive/2011/04/03/2004340.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yizhinantian/archive/2011/04/03/2004340.html"/><content type="html">&lt;p&gt;最近在网络上看到一个关于Linux下socket数量限制相关的讨论，主要讨论在linux下，是否能支持10甚至百万个tcp并发连接。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;讨论&amp;nbsp;1：在32为系统下，最大连接数的极限值是多少？&lt;/p&gt;&#xD;
&lt;p&gt;从系统内存的角度考虑，32位系统最大支持4G内存，内核空间为1G。如果每个socket占用的内存为C,那么最大连接数为：&lt;/p&gt;&#xD;
&lt;p&gt;maxconn = 1GB/C&lt;/p&gt;&#xD;
&lt;p&gt;如何分析每个socket占用的内核空间内存呢？分析socket占用内存的组成部分：文件系统inode +&amp;nbsp;socket结构 + tcp windows。&lt;/p&gt;&#xD;
&lt;p&gt;tcp windows的内存实际上就是挂在sk结构下的skb队列，skb是真正存储数据的地方，也就是消耗内存的地方。如果CPU的响应速度足够快，网络响应也很快，&lt;/p&gt;&#xD;
&lt;p&gt;那么skb队列只需要保留1个就可以，假定为1.5K。&lt;/p&gt;&#xD;
&lt;p&gt;文件系统inode +&amp;nbsp;socket结构 是固定大小的，大约为1K。&lt;/p&gt;&#xD;
&lt;p&gt;理想情况下：每个socket占用的内存为2~3K。以2K计算，内核空间实际可用内存约在800M，那么800M/2K = 400K.&lt;/p&gt;&#xD;
&lt;p&gt;粗略估计，Linux下，32位系统，能支持40万tcp并发连接差不多就到极限了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;分析过程是否有问题，还望高手指教。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;HAProxy是通过socket的方式实现的，一直没有找到关于最大并发连接的测试结果，在32位Linux上，最大值估计在20万并发连接左右。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yizhinantian/aggbug/2004340.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yizhinantian/archive/2011/04/03/2004340.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yizhinantian/archive/2011/04/03/2004266.html</id><title type="text">Linux 网卡如何支持TSO GSO指南</title><summary type="text">Linux 网卡如何支持TSO GSO指南</summary><published>2011-04-03T03:25:00Z</published><updated>2011-04-03T03:25:00Z</updated><author><name>YZG</name><uri>http://www.cnblogs.com/yizhinantian/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yizhinantian/archive/2011/04/03/2004266.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yizhinantian/archive/2011/04/03/2004266.html"/><content type="html">&lt;p&gt;&lt;div&gt;来源链接：http://gavin1992.gotoip2.com/papperdetails_tech.php?pid=11&lt;/div&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;1.什么是TSO GSO&lt;/p&gt;&#xD;
&lt;p&gt;TSO是&lt;strong&gt;tcp segment offload&lt;/strong&gt;的缩写，GSO是&amp;nbsp;&lt;strong&gt;generic segmentation offload&lt;/strong&gt; 的缩写&lt;strong&gt;。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp; &lt;/strong&gt;详细解释&lt;strong&gt;参看&lt;a href="http://en.wikipedia.org/wiki/Large_segment_offload"&gt;http://en.wikipedia.org/wiki/Large_segment_offload&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp; &lt;/strong&gt;对TSO的简单理解就是：&lt;/p&gt;&#xD;
&lt;p&gt;比如：我们要用汽车把3000本书送到另一个城市，每趟车只能装下1000本书，&lt;/p&gt;&#xD;
&lt;p&gt;那么我们就要书分成3次来发。如何把3000本书分成3份的事情是我们做的，汽车司机只负责运输。&lt;/p&gt;&#xD;
&lt;p&gt;TSO的概念就是：我们把3000本书一起给司机，由他去负责拆分的事情，这样我们就有更多的时间处理其他事情。&lt;/p&gt;&#xD;
&lt;p&gt;对应到计算机系统中，&amp;#8220;我们&amp;#8221;就是CPU，&amp;#8220;司机&amp;#8221;就是网卡。&lt;/p&gt;&#xD;
&lt;p&gt;在网络系统中，发送tcp数据之前，CPU需要根据MTU（一般为1500）来将数据放到多个包中发送，对每个数据包都要添加ip头，tcp头，分别计算IP校验和，TCP校验和。如果有了支持TSO的网卡，CPU可以直接将要发送的大数据发送到网卡上，由网卡硬件去负责分片和计算校验和。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2. TSO GSO网卡驱动与系统的接口：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"&gt;&lt;span&gt;步骤1.&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;设置支持&lt;/span&gt;TSO support flag&lt;span style="font-family: 宋体;"&gt;，&lt;/span&gt; &lt;span&gt;同时需要支持&lt;/span&gt;SG&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;netdev-&amp;gt;features |= NETIF_F_TSO;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;netdev-&amp;gt;features |= NETIF_F_SG | NETIF_F_IP_CSUM;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;font face="Verdana"&gt;&lt;span&gt;步骤2&lt;/span&gt;&amp;nbsp;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;设置&lt;/span&gt;GSO&lt;span style="font-family: 宋体;"&gt;最大值&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt;"&gt;netdev&lt;strong&gt; &lt;/strong&gt;-&amp;gt;gso_max_size = 8*1024&lt;strong&gt;;&lt;/strong&gt;&amp;nbsp; //网卡支持的gso size，通知系统每个tcp数据块的最大长度。&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt;"&gt;//TCP的窗口大小最大为64K，&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;步骤3：&amp;nbsp;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;"&gt; &lt;/span&gt;&lt;span style="font-family: 宋体;"&gt;发送函数需要处理skb&lt;/span&gt;数据&lt;span style="font-family: 宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt;"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;/span&gt;&amp;nbsp;支持tso的skb数据存储格式如下：&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt;"&gt;第一块数据存储在skb的data-&amp;gt;tail之间，其他分块存储在&lt;span style="font-size: 10.5pt; font-family: 'Calibri','sans-serif';" lang="EN-US"&gt;skb_shinfo(skb)-&amp;gt;frags&lt;/span&gt;中。&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt;"&gt;代码示例如下：&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt;"&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('8637813c-28e4-4881-b20a-f0527183b3ea')"&gt;&lt;img  id="code_img_opened_8637813c-28e4-4881-b20a-f0527183b3ea" style="display: none;" onclick="cnblogs_code_hide('8637813c-28e4-4881-b20a-f0527183b3ea',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div  id="cnblogs_code_open_8637813c-28e4-4881-b20a-f0527183b3ea"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;xmit_support_sg_tso(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;sk_buff&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;skb)&lt;br /&gt;&#xD;
{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(skb&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;tail&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;skb&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;data);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;the&amp;nbsp;first&amp;nbsp;fragment&amp;nbsp;is&amp;nbsp;stored&amp;nbsp;in&amp;nbsp;the&amp;nbsp;skb.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(f&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;f&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;skb_shinfo(skb)&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;nr_frags;&amp;nbsp;f&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;skb_shinfo(skb)&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;frags[f].size;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;/other&amp;nbsp;frags&amp;nbsp;.&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(dbg_send_queue,&amp;nbsp;skb&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;data,&amp;nbsp;&amp;nbsp;&amp;nbsp;skb&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;tail&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;skb&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;data);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;real&amp;nbsp;first&amp;nbsp;frag&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(f&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;f&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;skb_shinfo(skb)&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;nr_frags;&amp;nbsp;f&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;process&amp;nbsp;frags.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;skb_frag_struct&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;frag;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;f_offset&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;f_len&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;addr;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frag&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;skb_shinfo(skb)&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;frags[f];&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f_len&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;frag&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;size;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f_offset&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;frag&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;page_offset;&lt;br /&gt;&#xD;
&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;addr&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)page_address(frag&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;page)&amp;nbsp;;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;change&amp;nbsp;page&amp;nbsp;addr&amp;nbsp;to&amp;nbsp;virt&amp;nbsp;addr.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(dbg_send_queue,&amp;nbsp;addr&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;f_offset,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f_len);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;offset&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;f_len;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;步骤4：&amp;nbsp;支持&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;ethtool &lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt;"&gt;static struct ethtool_ops comNIC_ethtool_ops = {&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.get_settings&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = netdev_get_settings,&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;.set_settings&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = netdev_set_settings,&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;.get_drvinfo&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = netdev_get_drvinfo,&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;.get_link&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = netdev_get_link,&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;.get_rx_csum&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = cmb_ethtool_op_get_rx_csum,&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;.set_rx_csum&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = cmb_ethtool_op_set_rx_csum,&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;.get_tx_csum&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = cmb_ethtool_op_get_tx_csum,&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;.set_tx_csum&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;nbsp;cmb_ethtool_op_set_tx_csum,&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;//.set_sg&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = ethtool_op_set_sg,&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;#ifdef NETIF_F_TSO&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;.get_tso&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;nbsp;cmb_ethtool_op_get_tso,&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;.set_tso&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;nbsp;cmb_ethtool_op_set_tso,&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;&lt;span&gt;&lt;/span&gt;#endif&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;}&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;&lt;span style="font-family: 宋体;"&gt;命令行检验：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;&lt;span style="font-family: 宋体;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt;"&gt;&lt;span style="font-family: 宋体;"&gt;查看是否支持tso gso等：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;ethtool -k comnic0&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;设置tso gso打开和关闭&lt;/p&gt;&#xD;
&lt;p&gt;ethtool -K comnic0 tso off&lt;/p&gt;&#xD;
&lt;p&gt;ethtool -K comnic0 gso off&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;-----------------------------------驱动对tso gso的支持完成-----------------------------------------------&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt;"&gt;ps：1.支持tso需要同时声明支持scattle / gather, 因为skb的分片数据不是存储在一个连续的地址上。当然：网卡硬件可以不支持scattle/gather这种DMA方式。&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt;"&gt;2. 需要同时支持硬件校验和。&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt;"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt; text-indent: 20.25pt;"&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 18pt; text-indent: 20.25pt;"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yizhinantian/aggbug/2004266.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yizhinantian/archive/2011/04/03/2004266.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yizhinantian/archive/2010/12/13/1904609.html</id><title type="text">查看Linux内核丢包信息</title><summary type="text">#cat /proc/net/softnet_stat0000001f 00000000 00000001 00000000 00000000 00000000 00000000 00000000 0000000000000016 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000000018 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0000000000001143 00000000 00000000 000000</summary><published>2010-12-13T08:10:00Z</published><updated>2010-12-13T08:10:00Z</updated><author><name>YZG</name><uri>http://www.cnblogs.com/yizhinantian/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yizhinantian/archive/2010/12/13/1904609.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yizhinantian/archive/2010/12/13/1904609.html"/><content type="html">&lt;div&gt;#cat /proc/net/softnet_stat&lt;/div&gt;&lt;div&gt;0000001f 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000000&lt;br /&gt;00000016 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000&lt;br /&gt;00000018 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000&lt;br /&gt;00001143 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000&lt;/div&gt;&lt;p&gt;解释：&lt;/p&gt;&lt;p&gt;4行代表有4个cpu。 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;div&gt;第一列为该CPU所接收到的所有数据包, &lt;/div&gt;&lt;p&gt;第二列为该CPU缺省queue满的时候, 所删除的包的个数,&lt;/p&gt;&lt;p&gt;(没有统计对于使用NAPI的adapter, 由于ring 满而导致删除的包，在网卡驱动中统计),&lt;/p&gt;&lt;p&gt;第三列表示time_squeeze, 就是说,一次的软中断的触发还不能处理完目前已经接收的数据,因而要设置下轮软中断,time_squeeze 就表示设置的次数.&lt;/p&gt;&lt;p&gt;最后一列，cpu冲突次数。 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;内核代码：&lt;/p&gt;&lt;p&gt;&lt;div&gt;static int softnet_seq_show(struct seq_file *seq, void *v)&lt;br /&gt; {&lt;br /&gt;         struct netif_rx_stats *s = v;&lt;br /&gt; &lt;br /&gt;         seq_printf(seq, "%08x %08x %08x %08x %08x %08x %08x %08x %08x\n",&lt;br /&gt;                    s-&amp;gt;total, s-&amp;gt;dropped, s-&amp;gt;time_squeeze, 0,&lt;br /&gt;                    0, 0, 0, 0, /* was fastroute */&lt;br /&gt;                    s-&amp;gt;cpu_collision );&lt;br /&gt;         return 0;&lt;br /&gt; }&lt;/div&gt;&lt;p&gt;&lt;div&gt;include/linux/netdevice.h:DECLARE_PER_CPU(struct netif_rx_stats,&lt;br /&gt; netdev_rx_stat);&lt;br /&gt; &lt;br /&gt; struct netif_rx_stats&lt;br /&gt; {&lt;br /&gt;         unsigned total;&lt;br /&gt;         unsigned dropped;&lt;br /&gt;         unsigned time_squeeze;&lt;br /&gt;         unsigned cpu_collision;&lt;br /&gt; };&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;div&gt;int netif_rx(struct sk_buff *skb)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;struct softnet_data *queue;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;unsigned long flags;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/* if netpoll wants it, pretend we never saw it */&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (netpoll_rx(skb))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return NET_RX_DROP;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (!skb-&amp;gt;tstamp.off_sec)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;net_timestamp(skb);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;/*&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * The code is rearranged so that the path is the most&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; * short when CPU is congested, but is still operating.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; */&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;local_irq_save(flags);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;queue = &amp;amp;__get_cpu_var(softnet_data);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;strong&gt;&lt;span style="color: red;"&gt;__get_cpu_var(netdev_rx_stat).total++;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (queue-&amp;gt;input_pkt_queue.qlen &amp;lt;= netdev_max_backlog) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (queue-&amp;gt;input_pkt_queue.qlen) {&lt;br /&gt;enqueue:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;dev_hold(skb-&amp;gt;dev);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;__skb_queue_tail(&amp;amp;queue-&amp;gt;input_pkt_queue, skb);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;local_irq_restore(flags);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return NET_RX_SUCCESS;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;netif_rx_schedule(&amp;amp;queue-&amp;gt;backlog_dev);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;goto enqueue;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;strong&gt;&lt;span style="color: red;"&gt;__get_cpu_var(netdev_rx_stat).dropped++;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;local_irq_restore(flags);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;kfree_skb(skb);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;return NET_RX_DROP;&lt;br /&gt;}&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;/p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yizhinantian/aggbug/1904609.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yizhinantian/archive/2010/12/13/1904609.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yizhinantian/archive/2010/11/17/1879891.html</id><title type="text">Linux 内核性能工具</title><summary type="text">Oprofile：http://oprofile.sourceforge.net/docs/opcontrol --list-events</summary><published>2010-11-17T07:24:00Z</published><updated>2010-11-17T07:24:00Z</updated><author><name>YZG</name><uri>http://www.cnblogs.com/yizhinantian/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yizhinantian/archive/2010/11/17/1879891.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yizhinantian/archive/2010/11/17/1879891.html"/><content type="html">&lt;p&gt;Oprofile：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://oprofile.sourceforge.net/docs/"&gt;http://oprofile.sourceforge.net/docs/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;opcontrol --list-events&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yizhinantian/aggbug/1879891.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yizhinantian/archive/2010/11/17/1879891.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yizhinantian/archive/2010/11/11/skb.html</id><title type="text">struct sk_buff</title><summary type="text">info:</summary><published>2010-11-11T05:36:00Z</published><updated>2010-11-11T05:36:00Z</updated><author><name>YZG</name><uri>http://www.cnblogs.com/yizhinantian/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yizhinantian/archive/2010/11/11/skb.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yizhinantian/archive/2010/11/11/skb.html"/><content type="html">&lt;p&gt;info:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="file:///C:/DOCUME%7E1/y/LOCALS%7E1/Temp/moz-screenshot.jpg" alt="" /&gt;&amp;nbsp;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/yizhinantian/skb.jpg" border="0" height="369" width="559" /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="file:///C:/DOCUME%7E1/y/LOCALS%7E1/Temp/moz-screenshot-3.jpg" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yizhinantian/aggbug/1874812.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yizhinantian/archive/2010/11/11/skb.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yizhinantian/archive/2010/10/09/google_hack.html</id><title type="text">转载 google hack</title><summary type="text">转载自月光博客 [ http://www.williamlong.info/ ] intext:这个就是把网页中的正文内容中的某个字符做为搜索条件.例如在google里输入:intext:动网.将返回所有在网页正文部分包含"动网"的网页.allintext:使用方法和intext类似.intitle:和上面那个intext差不多,搜索网页标题中是否有我们所要找的字符.例如搜索:intitle:安全...</summary><published>2010-10-09T01:26:00Z</published><updated>2010-10-09T01:26:00Z</updated><author><name>YZG</name><uri>http://www.cnblogs.com/yizhinantian/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yizhinantian/archive/2010/10/09/google_hack.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yizhinantian/archive/2010/10/09/google_hack.html"/><content type="html">&lt;p&gt;转载自&lt;a href="http://www.williamlong.info/"&gt;月光博客&lt;/a&gt; [ &lt;a href="http://www.williamlong.info/"&gt;http://www.williamlong.info/&lt;/a&gt; ] &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;intext:这个就是把网页中的正文内容中的某个字符做为搜索条件.例如在google里输入:intext:动网.将返回所有在网页正文部分包含"动网"的网页.allintext:使用方法和intext类似.&lt;/p&gt;&lt;p&gt;intitle:&lt;br /&gt;和上面那个intext差不多,搜索网页标题中是否有我们所要找的字符.例如搜索:intitle:安全天使.将返回所有网页标题中包含"安全天使"的网页.同理allintitle:也同intitle类似.&lt;/p&gt;&lt;p&gt;cache:&lt;br /&gt;搜索google里关于某些内容的缓存,有时候也许能找到一些好东西哦.&lt;/p&gt;&lt;p&gt;define:&lt;br /&gt;搜索某个词语的定义,搜索:define:hacker,将返回关于hacker的定义.&lt;/p&gt;&lt;p&gt;filetype:&lt;br /&gt;这 个我要重点推荐一下,无论是撒网式攻击还是我们后面要说的对特定目标进行信息收集都需要用到这个.搜索指定类型的文件.例如输入:filetype: doc.将返回所有以doc结尾的文件URL.当然如果你找.bak、.mdb或.inc也是可以的,获得的信息也许会更丰富:)&lt;/p&gt;&lt;p&gt;info:&lt;br /&gt;查找指定站点的一些基本信息.&lt;/p&gt;&lt;p&gt;inurl:&lt;br /&gt;搜索我们指定的字符是否存在于URL中.例如输入:inurl:admin,将返回N个类似于这样的连接:http://www.xxx.com/xxx/admin,用来找管理员登陆的URL不错.allinurl也同inurl类似,可指定多个字符.&lt;/p&gt;&lt;p&gt;link:&lt;br /&gt;例如搜索:inurl:www.4ngel.net可以返回所有和www.4ngel.net做了链接的URL.&lt;/p&gt;&lt;p&gt;site:&lt;br /&gt;这个也很有用,例如:site:www.4ngel.net.将返回所有和4ngel.net这个站有关的URL.&lt;/p&gt;&lt;p&gt;对了还有一些操作符也是很有用的:&lt;/p&gt;&lt;p&gt;+ 把google可能忽略的字列如查询范围&lt;br /&gt;- 把某个字忽略&lt;br /&gt;~ 同意词&lt;br /&gt;. 单一的通配符&lt;br /&gt;* 通配符，可代表多个字母&lt;br /&gt;""&amp;nbsp;&amp;nbsp;&amp;nbsp; 精确查询&lt;/p&gt;&lt;p&gt;下面开始说说实际应用(我个人还是比较习惯用google.com,以下内容均在google上搜索),对于一个居心叵测的攻击者来说,可能他最感兴趣的 就是密码文件了.而google正因为其强大的搜索能力往往会把一些敏感信息透露给他们.用google搜索以下内容:&lt;/p&gt;&lt;p&gt;intitle:"index of" etc&lt;br /&gt;intitle:"Index of" .sh_history&lt;br /&gt;intitle:"Index of" .bash_history&lt;br /&gt;intitle:"index of" passwd&lt;br /&gt;intitle:"index of" people.lst&lt;br /&gt;intitle:"index of" pwd.db&lt;br /&gt;intitle:"index of" etc/shadow&lt;br /&gt;intitle:"index of" spwd&lt;br /&gt;intitle:"index of" master.passwd&lt;br /&gt;intitle:"index of" htpasswd&lt;br /&gt;"# -FrontPage-" inurl:service.pwd&lt;/p&gt;&lt;p&gt;有时候因为各种各样的原因一些重要的密码文件被毫无保护的暴露在网络上,如果被别有用心的人获得,那么危害是很大的.下面是我找到的一个FreeBSD系统的passwd文件(我已做过处理):&lt;/p&gt;&lt;p&gt;同样可以用google来搜索一些具有漏洞的程序,例如ZeroBoard前段时间发现个文件代码泄露漏洞,我们可以用google来找网上使用这套程序的站点:&lt;br /&gt;intext:ZeroBoard filetype:php&lt;br /&gt;或者使用:&lt;br /&gt;inurl:outlogin.php?_zb_path= site:.jp&lt;br /&gt;来寻找我们所需要的页面.phpmyadmin是一套功能强大的数据库操作软件,一些站点由于配置失误,导致我们可以不使用密码直接对phpmyadmin进行操作.我们可以用google搜索存在这样漏洞的程序URL:&lt;br /&gt;intitle:phpmyadmin intext:Create new database&lt;/p&gt;&lt;p&gt;还记得&lt;a href="http://www.xxx.com/_vti_bin/..%5C..%5C..%5C..%5C..%5C../winnt/system32/cmd.exe?dir"&gt;http://www.xxx.com/_vti_bin/..%5C..%5C..%5C..%5C..%5C../winnt/system32/cmd.exe?dir&lt;/a&gt;吗?用google找找，你也许还可以找到很多古董级的机器。同样我们可以用这个找找有其他cgi漏洞的页面。&lt;br /&gt;allinurl：winnt system32&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 前面我们已经简单的说过可以用google来搜索数据库文件,用上一些语法来精确查找能够获得更多东西(access的数据库,mssql、mysql的连接文件等等).举个例子示例一下:&lt;br /&gt;allinurl:bbs data&lt;br /&gt;filetype:mdb inurl:database&lt;br /&gt;filetype:inc conn&lt;br /&gt;inurl:data filetype:mdb&lt;br /&gt;intitle:"index of" data&amp;nbsp; //在一些配置不正确的apache+win32的服务器上经常出现这种情况&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 和上面的原理一样,我们还可以用google来找后台,方法就略了,举一反三即可,毕竟我写这篇文章的目的是让大家了解google hacking,而不是让你用google去破坏.安全是把双刃剑,关键在于你如何去运用.&lt;/p&gt;&lt;p&gt;利用google完全是可以对一个站点进行信息收集和渗透的，下面我们用google对特定站点进行一次测试。www.xxxx.com是全国著名大学之一，一次偶然的机会我决定对其站点进行一次测试(文中所涉及该学校的信息均已经过处理，请勿对号入座:).&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 首先用google先看这个站点的一些基本情况(一些细节部分就略去了):&lt;br /&gt;site:xxxx.com&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 从返回的信息中，找到几个该校的几个系院的域名：&lt;br /&gt;http://a1.xxxx.com&lt;br /&gt;http://a2.xxxx.com&lt;br /&gt;http://a3.xxxx.com&lt;br /&gt;http://a4.xxxx.com&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 顺便ping了一下，应该是在不同的服务器.(想想我们学校就那一台可怜的web服务器，大学就是有钱，汗一个)。学校一般都会有不少好的资料，先看看有什么好东西没:&lt;br /&gt;site:xxxx.com filetype:doc&lt;br /&gt;得到N个不错的doc。先找找网站的管理后台地址：&lt;br /&gt;site:xxxx.com intext:管理&lt;br /&gt;site:xxxx.com inurl:login&lt;br /&gt;site:xxxx.com intitle:管理&lt;br /&gt;超过获得2个管理后台地址：&lt;br /&gt;http://a2.xxxx.com/sys/admin_login.asp&lt;br /&gt;http://a3.xxxx.com:88/_admin/login_in.asp&lt;br /&gt;还算不错，看看服务器上跑的是什么程序：&lt;br /&gt;site:a2.xxxx.com filetype:asp&lt;br /&gt;site:a2.xxxx.com filetype:php&lt;br /&gt;site:a2.xxxx.com filetype:aspx&lt;br /&gt;site:a3.xxxx.com filetype:asp&lt;br /&gt;site:.......&lt;br /&gt;......&lt;br /&gt;a2服务器用的应该是IIS，上面用的是asp的整站程序，还有一个php的论坛&lt;br /&gt;a3服务器也是IIS，aspx+asp。web程序都应该是自己开发的。有论坛那就看看能不能遇见什么公共的FTP帐号什么的：&lt;br /&gt;site:a2.xxxx.com intext:ftp://*:*&lt;br /&gt;没找到什么有价值的东西。再看看有没有上传一类的漏洞：&lt;br /&gt;site:a2.xxxx.com inurl:file&lt;br /&gt;site:a3.xxxx.com inurl:load&lt;br /&gt;在a2上发现一个上传文件的页面：&lt;br /&gt;http://a2.xxxx.com/sys/uploadfile.asp&lt;br /&gt;用IE看了一下，没权限访问。试试注射，&lt;br /&gt;site:a2.xxxx.com filetype:asp&lt;br /&gt;得 到N个asp页面的地址，体力活就让软件做吧，这套程序明显没有对注射做什么防范，dbowner权限，虽然不高但已足矣，back a shell我不太喜欢，而且看起来数据库的个头就不小，直接把web管理员的密码暴出来再说，MD5加密过。一般学校的站点的密码都比较有规律，通常都是 域名+电话一类的变形，用google搞定吧。&lt;br /&gt;site:xxxx.com&amp;nbsp;&amp;nbsp;&amp;nbsp; //得到N个二级域名&lt;br /&gt;site:xxxx.com intext:*@xxxx.com&amp;nbsp; //得到N个邮件地址，还有邮箱的主人的名字什么的&lt;br /&gt;site:xxxx.com intext:电话&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //N个电话&lt;br /&gt;把什么的信息做个字典吧，挂上慢慢跑。过了一段时间就跑出4个帐号，2个是学生会的，1个管理员，还有一个可能是老师的帐号。登陆上去：&lt;br /&gt;name：网站管理员&lt;br /&gt;pass：a2xxxx7619&amp;nbsp;&amp;nbsp;&amp;nbsp; //说了吧，就是域名+4个数字&lt;br /&gt;要再怎么提权那就不属于本文讨论访问了，呵呵，到此为止。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;关于google hacking的防范：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 以前我们站的晓风&amp;#183;残月写过一篇躲避google的文章，原理就是通过在站点根目录下建立一个robots.txt以避免网络机器人获得一些敏感的信息，具体大家看原文章：http://www.4ngel.net/article/26.htm。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 不过这种方法我个人不推荐，有点此地无银三百两的味道。简单一点的方法就是上google把自己站点的一些信息删除掉，访问这个URL：&lt;br /&gt;http://www.google.com/remove.html&lt;br /&gt;前几天看见又有人讨论用程序来欺骗robot的方法，我觉得可以试试：&lt;br /&gt;代码如下：&lt;br /&gt;&amp;lt;?php&lt;/p&gt;&lt;p&gt;if (strstr($_SERVER['HTTP_USER_AGENT'], "Googlebot"))&lt;br /&gt;{&lt;br /&gt;header("HTTP/1.1 301");&lt;br /&gt;header("Location: http://www.google.com");&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;?&amp;gt;&lt;/p&gt;&lt;p&gt;asp的：&lt;br /&gt;&amp;lt;%&lt;br /&gt;if instr(Request.Servervariables("HTTP_USER_AGENT"),"Googlebot") then&lt;br /&gt;&amp;nbsp; response.redirect("http://www.google.com")&lt;br /&gt;end if&lt;/p&gt;&lt;p&gt;%&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;后记&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这段时间在国外的一些google hack的研究站点看了看，其实也都差不多是一些基本语法的灵活运用，或者配合某个脚本漏洞，主要还是靠个人的灵活思维。国外对于google hack方面的防范也并不是很多，所以大家还是点到为止，不要去搞破坏拉，呵呵。对于一些在win上跑&lt;br /&gt;apache的网管们应该多注意一下这方面，一个intitle:index of就差不多都出来了:)&lt;/p&gt;&lt;p&gt;webcam: &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;#8220;inurl:"ViewerFrame?Mode="&amp;#8221;，&lt;br /&gt;&amp;#8220;inurl: "MultiCameraFrame?Mode="&amp;#8221;，&lt;br /&gt;&amp;#8220;intitlE:"Live View / - AXIS"&amp;#8221;，&lt;br /&gt;&amp;#8220;inurl:"axis-cgi/mjpg"&amp;#8221;，&lt;br /&gt;&amp;#8220;intext:"MOBOTIX M1" &lt;br /&gt;intext:"Open Menu"&amp;#8221;或者&lt;br /&gt;&amp;#8220;inurl:"view/index.shtml" &amp;#8221;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;作者：sniper　出处：&lt;a href="http://www.4ngel.net/article/51.htm"&gt;http://www.4ngel.net/article/51.htm&lt;/a&gt;&lt;/p&gt;  &lt;div&gt; &lt;/div&gt;      &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.cnblogs.com/yizhinantian/aggbug/1846311.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yizhinantian/archive/2010/10/09/google_hack.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yizhinantian/archive/2010/08/23/libnids.html</id><title type="text">libnids 相关</title><summary type="text">libnids 分析</summary><published>2010-08-23T03:52:00Z</published><updated>2010-08-23T03:52:00Z</updated><author><name>YZG</name><uri>http://www.cnblogs.com/yizhinantian/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yizhinantian/archive/2010/08/23/libnids.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yizhinantian/archive/2010/08/23/libnids.html"/><content type="html">&lt;p&gt;最近听过应用层的朋友用的是libnids库，因此大致看了一下。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1.libnids库完全是应用层的函数库，基本上没有内核相关的操作。&lt;/p&gt;&#xD;
&lt;p&gt;2.libnids底层收包用的是libpcap函数，几个主要的libpcap函数接口是：&lt;/p&gt;&#xD;
&lt;p&gt;pcap_open_live(pcap_open_offline)&amp;nbsp; --&amp;gt; nids_init&lt;/p&gt;&#xD;
&lt;p&gt;pcap_loop&amp;nbsp; --&amp;gt; nids_run&lt;/p&gt;&#xD;
&lt;p&gt;pcap_next&amp;nbsp; --&amp;gt; nids_next&lt;/p&gt;&#xD;
&lt;p&gt;pcap_dispatch --&amp;gt; nids_dispatch&lt;/p&gt;&#xD;
&lt;p&gt;3.报文处理回调函数封装为：&lt;/p&gt;&#xD;
&lt;p&gt;nids_pcap_handler&lt;/p&gt;&#xD;
&lt;p&gt;4.libnids处理ip分片，tcp会话重组。libnids号称的稳定性据说是因为&amp;#8220;代码拷贝自Linux内核，因此与内核协议栈有一样的稳定性&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p&gt;TCP会话重组部分似乎比内核中的代码简单，可能是因为buffer处理部分比较简单。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;//==================&lt;/p&gt;&#xD;
&lt;p&gt;5. 用户注册回调函数：&lt;/p&gt;&#xD;
&lt;p&gt;nids_register_ip_frag&amp;nbsp; （接收 未进行ip分片重组的原始报文）&lt;/p&gt;&#xD;
&lt;p&gt;nids_register_ip&lt;/p&gt;&#xD;
&lt;p&gt;nids_register_tcp&lt;/p&gt;&#xD;
&lt;p&gt;nids_register_udp&lt;/p&gt;&#xD;
&lt;p&gt;分别存储在：ip_frag_procs，ip_procs，tcp_procs，udp_procs的item指针中。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;6.在ndis_init的时候，首先调用init_procs，&lt;/p&gt;&#xD;
&lt;p&gt;a.在ip_frag_procs中注册默认处理函数：gen_ip_frag_proc，调用ip_defrag_stub --&amp;gt;ip_defrag 进行ip分片重组。&lt;/p&gt;&#xD;
&lt;p&gt;b.在ip_procs中注册默认的处理函数：gen_ip_proc， gen_ip_proc函数根据报文类型处理tcp，dup，icmp包。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;7.tcp会话重组，待续。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yizhinantian/aggbug/1806308.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yizhinantian/archive/2010/08/23/libnids.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yizhinantian/archive/2010/07/20/1781642.html</id><title type="text">C转义字符问题</title><summary type="text">今天遇到了一个C语言的问题，以前没注意到：http://wordaligned.org/articles/octal-literalsVery large Hex value in a String LiteralHere, the "DEF" characters are valid hexadecimal and therefore become part of the number we&amp;#...</summary><published>2010-07-20T12:02:00Z</published><updated>2010-07-20T12:02:00Z</updated><author><name>YZG</name><uri>http://www.cnblogs.com/yizhinantian/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yizhinantian/archive/2010/07/20/1781642.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yizhinantian/archive/2010/07/20/1781642.html"/><content type="html">&lt;p&gt;今天遇到了一个C语言的问题，以前没注意到：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://wordaligned.org/articles/octal-literals"&gt;http://wordaligned.org/articles/octal-literals&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Very large Hex value in a String Literal&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;std&lt;/span&gt;&lt;span &gt;::&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span &gt; s &lt;/span&gt;&lt;span &gt;=&lt;/span&gt;&lt;span &gt; &lt;/span&gt;&lt;span &gt;"ABC\x7FDEF"&lt;/span&gt;&lt;span &gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;Here, the &lt;code&gt;"DEF"&lt;/code&gt; characters are valid hexadecimal and therefore become part of the number we&amp;#8217;re embedding; so we&amp;#8217;ve tried to put the hex number &lt;code&gt;7FDEF&lt;/code&gt; into a byte. If we&amp;#8217;re lucky our &lt;a href="http://gcc.gnu.org/"&gt;compiler&lt;/a&gt; will warn us: &lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;&lt;span &gt;warning&lt;/span&gt;&lt;span &gt;:&lt;/span&gt;&lt;span &gt; hex escape sequence &lt;/span&gt;&lt;span &gt;out&lt;/span&gt;&lt;span &gt; of range&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;If we&amp;#8217;re unlucky or if we don&amp;#8217;t act on the warning, the result is implementation defined. In any case, it&amp;#8217;s certainly not what we wanted. Of course, embedded octal escape sequences suffer from the exact same problem if succeeded by one of the letters &lt;code&gt;"0" - "7"&lt;/code&gt;. &lt;/p&gt;&#xD;
&lt;p&gt;The workaround is simple: &lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;Hex 7F in a String Literal&lt;/div&gt;&lt;pre &gt;&lt;span &gt;std&lt;/span&gt;&lt;span &gt;::&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span &gt; s &lt;/span&gt;&lt;span &gt;=&lt;/span&gt;&lt;span &gt; &lt;/span&gt;&lt;span &gt;"ABC\x7F"&lt;/span&gt;&lt;span &gt; &lt;/span&gt;&lt;span &gt;"DEF"&lt;/span&gt;&lt;span &gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;or even: &lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;Hex 7F in a String Literal&lt;/div&gt;&lt;pre &gt;&lt;span &gt;std&lt;/span&gt;&lt;span &gt;::&lt;/span&gt;&lt;span &gt;string&lt;/span&gt;&lt;span &gt; s &lt;/span&gt;&lt;span &gt;=&lt;/span&gt;&lt;span &gt; &lt;/span&gt;&lt;span &gt;"ABC"&lt;/span&gt;&lt;span &gt; &lt;/span&gt;&lt;span &gt;"\x7F"&lt;/span&gt;&lt;span &gt; &lt;/span&gt;&lt;span &gt;"DEF"&lt;/span&gt;&lt;span &gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;In other words, even this use of octal values is of limited practical use.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;以后要用正确的方式使用8，16进制转义。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yizhinantian/aggbug/1781642.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yizhinantian/archive/2010/07/20/1781642.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
