<?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>waimv.com &#187; netstat</title>
	<atom:link href="http://www.waimv.com/tag/netstat/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.waimv.com</link>
	<description></description>
	<lastBuildDate>Fri, 09 Nov 2018 10:41:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>统计linux服务器网络连接数</title>
		<link>http://www.waimv.com/linux/28/</link>
		<comments>http://www.waimv.com/linux/28/#comments</comments>
		<pubDate>Sat, 18 Sep 2010 08:12:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[awk]]></category>
		<category><![CDATA[netstat]]></category>
		<category><![CDATA[连接数]]></category>

		<guid isPermaLink="false">http://www.szpian.com/?p=28</guid>
		<description><![CDATA[Shell写起来很简单，效果却很神奇，你可以先尝试执行一下这条命令： netstat -n &#124; awk &#8216;/^tcp/ {++state[$NF]} END {for(key in state) print key,&#8221;\t&#8221;,state[key]}&#8217; 会得到类似下面的结果，具体数字会有所不同： LAST_ACK 1 SYN_RECV 14 ESTABLISHED 79 FIN_WAIT1 28 FIN_WAIT2 3 CLOSING 5 TIME_WAIT 1669 也就是说，这条命令可以把当前系统的网络连接状态分类汇总。 下面解释一下为啥要这样写： 一个简单的管道符连接了netstat和awk命令。 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; 先来看看netstat： netstat -n Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 123.123.123.123:80 234.234.234.234:12345 TIME_WAIT 你实际执行这条命令的时候，可能会得到成千上万条类似上面的记录，不过我们就拿其中的一条就足够了。 [...]]]></description>
			<content:encoded><![CDATA[<p>Shell写起来很简单，效果却很神奇，你可以先尝试执行一下这条命令：</p>
<p>netstat -n | awk &#8216;/^tcp/ {++state[$NF]} END {for(key in state) print key,&#8221;\t&#8221;,state[key]}&#8217;</p>
<p>会得到类似下面的结果，具体数字会有所不同：</p>
<p>LAST_ACK         1<br />
SYN_RECV         14<br />
ESTABLISHED      79<br />
FIN_WAIT1        28<br />
FIN_WAIT2        3<br />
CLOSING          5<br />
TIME_WAIT        1669</p>
<p>也就是说，这条命令可以把当前系统的网络连接状态分类汇总。</p>
<p>下面解释一下为啥要这样写：</p>
<p>一个简单的管道符连接了netstat和awk命令。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>先来看看netstat：</p>
<p>netstat -n</p>
<p>Active Internet connections (w/o servers)<br />
Proto Recv-Q Send-Q Local Address           Foreign Address         State<br />
tcp        0      0 123.123.123.123:80      234.234.234.234:12345   TIME_WAIT</p>
<p>你实际执行这条命令的时候，可能会得到成千上万条类似上面的记录，不过我们就拿其中的一条就足够了。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>再来看看awk：</p>
<p>/^tcp/<br />
滤出tcp开头的记录，屏蔽udp, socket等无关记录。</p>
<p>state[]<br />
相当于定义了一个名叫state的数组</p>
<p>NF<br />
表示记录的字段数，如上所示的记录，NF等于6</p>
<p>$NF<br />
表示某个字段的值，如上所示的记录，$NF也就是$6，表示第6个字段的值，也就是TIME_WAIT</p>
<p>state[$NF]<br />
表示数组元素的值，如上所示的记录，就是state[TIME_WAIT]状态的连接数</p>
<p>++state[$NF]<br />
表示把某个数加一，如上所示的记录，就是把state[TIME_WAIT]状态的连接数加一</p>
<p>END<br />
表示在最后阶段要执行的命令</p>
<p>for(key in state)<br />
遍历数组</p>
<p>print key,&#8221;\t&#8221;,state[key]<br />
打印数组的键和值，中间用\t制表符分割，美化一下。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>解释完了，如果这样你还看不明白命令，那我也无能为力了。</p>
<p>状态：描述<br />
CLOSED：无连接是活动的或正在进行<br />
LISTEN：服务器在等待进入呼叫<br />
SYN_RECV：一个连接请求已经到达，等待确认<br />
SYN_SENT：应用已经开始，打开一个连接<br />
ESTABLISHED：正常数据传输状态<br />
FIN_WAIT1：应用说它已经完成<br />
FIN_WAIT2：另一边已同意释放<br />
ITMED_WAIT：等待所有分组死掉<br />
CLOSING：两边同时尝试关闭<br />
TIME_WAIT：另一边已初始化一个释放<br />
LAST_ACK：等待所有分组死掉</p>
<p>也就是说，这条命令可以把当前系统的网络连接状态分类汇总。</p>
<p>下面解释一下为啥要这样写：</p>
<p>一个简单的管道符连接了netstat和awk命令。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>先来看看netstat：</p>
<p>netstat -n</p>
<p>Active Internet connections (w/o servers)<br />
Proto Recv-Q Send-Q Local Address Foreign Address State<br />
tcp 0 0 123.123.123.123:80 234.234.234.234:12345 TIME_WAIT</p>
<p>你实际执行这条命令的时候，可能会得到成千上万条类似上面的记录，不过我们就拿其中的一条就足够了。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>再来看看awk：</p>
<p>/^tcp/<br />
滤出tcp开头的记录，屏蔽udp, socket等无关记录。</p>
<p>state[]<br />
相当于定义了一个名叫state的数组</p>
<p>NF<br />
表示记录的字段数，如上所示的记录，NF等于6</p>
<p>$NF<br />
表示某个字段的值，如上所示的记录，$NF也就是$6，表示第6个字段的值，也就是TIME_WAIT</p>
<p>state[$NF]<br />
表示数组元素的值，如上所示的记录，就是state[TIME_WAIT]状态的连接数</p>
<p>++state[$NF]<br />
表示把某个数加一，如上所示的记录，就是把state[TIME_WAIT]状态的连接数加一</p>
<p>END<br />
表示在最后阶段要执行的命令</p>
<p>for(key in state)<br />
遍历数组</p>
<p>print key,&#8221;\t&#8221;,state[key]<br />
打印数组的键和值，中间用\t制表符分割，美化一下。</p>
<p>如发现系统存在大量TIME_WAIT状态的连接，通过调整内核参数解决，<br />
vim /etc/sysctl.conf<br />
编辑文件，加入以下内容：</p>
<p>view sourceprint?<br />
1.net.ipv4.tcp_syncookies = 1<br />
2.net.ipv4.tcp_tw_reuse = 1<br />
3.net.ipv4.tcp_tw_recycle = 1<br />
4.net.ipv4.tcp_fin_timeout = 30<br />
然后执行 /sbin/sysctl -p 让参数生效。</p>
<p>net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时，启用cookies来处理，可防范少量SYN攻击，默认为0，表示关闭；<br />
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接，默认为0，表示关闭；<br />
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收，默认为0，表示关闭。<br />
net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间</p>
<p>下面附上TIME_WAIT状态的意义：</p>
<p>客户端与服务器端建立TCP/IP连接后关闭SOCKET后，服务器端连接的端口<br />
状态为TIME_WAIT</p>
<p>是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢？<br />
有没有什么情况使主动关闭的socket直接进入CLOSED状态呢？</p>
<p>主动关闭的一方在发送最后一个 ack 后<br />
就会进入 TIME_WAIT 状态 停留2MSL（max segment lifetime）时间<br />
这个是TCP/IP必不可少的，也就是“解决”不了的。</p>
<p>也就是TCP/IP设计者本来是这么设计的<br />
主要有两个原因<br />
1。防止上一次连接中的包，迷路后重新出现，影响新连接<br />
（经过2MSL，上一次连接中所有的重复包都会消失）<br />
2。可靠的关闭TCP连接<br />
在主动关闭方发送的最后一个 ack(fin) ，有可能丢失，这时被动方会重新发<br />
fin, 如果这时主动方处于 CLOSED 状态 ，就会响应 rst 而不是 ack。所以<br />
主动方要处于 TIME_WAIT 状态，而不能是 CLOSED 。</p>
<p>TIME_WAIT 并不会占用很大资源的，除非受到攻击。</p>
<p>还有，如果一方 send 或 recv 超时，就会直接进入 CLOSED 状态。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waimv.com/linux/28/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
