netstat -alnp监听状态以及Recv-Q和Send-Q详解

回复 收藏
Recv-QSend-Q详解
1.        Recv-Q表示网络接收队列
a)        此列的值通常应该为0,也可以短暂的不为0,如果这个数值过大,说明接收队列有数据堆积。如果常时间不为0有可能遭受到了denial-of-service(拒绝服务)攻击,也就是我们常说的DoS攻击。简单的讲就是把你带宽或者资源消耗完,无法正常为真正需要服务的用户提供服务直到崩溃。
b)        既然有这个危险存在,那么我们应该如何防范。首先们们应该谨慎的维护我们的OS,确保无安全隐患和漏洞,安装硬件防火墙设备(推荐),定期查看安全设备的日志
2.        Send-Q表示网络发送队列
a)        此列的值也通常应该为0,也可以短暂的不为0,如果这个数值过大,发明发送队列有数据堆积。如果常时间不为0有可能是向外发送数据过快,或者对方接收太慢,导致发出去的数据还停留在本地缓冲区
监听状态与TCP/IP详解
1.        监听状态的分类(可能并不宛全)
a)        LISTEN 表示此端口已经准备好接受服务请求
b)        SYN-SENT 再发送连接请求后等待匹配的连接请求
c)        SYN-RECEIVED 再收到和发送一个连接请求后等待对方连接请求的确认
d)        ESTABLISHED 打开一个连接(正在连接)
e)        FIN-WAIT-1 等待远程TCP连接中断请求
f)         FIN-WAIT-2 从远程TCP等待连接中断请求
g)        CLOSE-WAIT 等待从本地用户发来的连接中断请求
h)        CLOSING 等待远程TCP对连接中断的确认
i)          LAST-ACK 等待原来的发向远程TCP的连接中断请求的确认
j)          TMIE-WAIT 等待足够的时间确保远程TCP接收到连接中断请求的确认
2.        TCP/IP与netstat监听状态的关系,TCP在连接的建立需要3次握手。
a)        首先在服务器上开启相应的服务(我们这里以WEB服务为列说明),这时候用netstat -alnp命令就可以查看到httpd的服务的状态是“LISTEN”说明服务已经开启,现在已经准备好服务了
b)        这时候我们在客户端的浏览器,或者用其它工具输入服务端的IP地址,或者域名的时候,首先就是发送的httpd的连接请求。这时候在服务器上用netstat -alnp命令就可以查看到httpd的服务的状态是“SYN-SENT”。此时我们的httpd服务器已经启动连接定时器,如果在75秒内没有收到应答,则放弃建立连接。(第一次握手)
c)        在服务器上收到从客户端发送的请求后并确认。然后再服务端再向客户端发送SYN同步包,主要作用是表示愿意与客户端同步(也就是建立连接)。同时一起对客户端进行同步请求,这时候用netstat -alnp命令就可以查看到httpd的服务的状态是“SYN- RECEIVED”。这时候服务器又启动连接定时器,如果在75秒内没有收到应答,则放弃连接。(每二次握手)
d)        在客户端上接收到服务器上发过来的同步包后并确认,然后再向服务器发送确认包,此包一发送完毕,这时候就已经建立连接,这时候用netstat -alnp命令就可以查看到httpd的服务的状态是“ESTABLISHED”。(第三次握手)
e)        连接建立完成后就可以开始传输数据,进行通讯了,以上三次握手,我只是简单的描述,尽可能的让大家能理解,里面还有很多专业的知识。大家有兴趣的话自己网上查询。我只是针对性的对“netstat -alnp”这个输出结果中的“stat”这一列作一个解释,希望大家能理解。
3.        TCP连接关闭,TCP连接的关闭需要4次握手
a)        这里要说明的是不管是服务器还是客户机都可以执行关闭请求,先进行关闭的一方将执行主动关闭,而另一方将执行被动关闭(一般我们是客记端来执行close,下面我们以客户端为主动一方来讲解)
b)        当我们上面建立的连接我们不用的时候我们需要关闭,这时候客户端向服务器发送终止信息的FIN包(主要用来关闭客户端到服务器的数据传输请求)这时候客户端进入“FIN-WAIT-1”的状态(第一次挥手)
c)        服务端收到客户端的FIN包手并确认,再发送一个包给客户端(这个包是ACK),告诉客户端我已经收到你的终止请求,等待应用程序来关闭连接。这时候服务端的“netstat”的状态为“CLOSE-WAIT”状态。(第二次挥手)
d)       客户端收到带有确认的ACK数据包后,对此包进行确认,同意关闭TCP连接,这时候客户端的状态为“FIN-WAIT-2”。当状态从“FIN-WAIT-1”转移到“FIN-WAIT-2”的时候会启动一个定时器,设置为10分钟。服务器在应用程序同意终止后,向客户端发送终止的FIN包,这时候服务器的状态为“LAST-ACK”(第三次挥手)
e)        客户端在收到服务器的终止的FIN包后,同意终止连接,然后再向服务端发送确认信息,此时客户端状态为“TMIE-WAIT”,这时候刚客户端设置的10分钟的定时器被激活。服务端在收到客户端的确认后,关闭连接,这时候服务器的状态为“CLOSED”。客户端在刚启动的10分钟定时器超时后,与该服务器连接的数据块将被删除,连接终止,同时客户端的状态也是“CLOSED”(第四次挥手)
4.        为什么TCP建立连接需要3次握手,而分开需要4次挥手(全为个人理解,如果有不对的地方,欢迎一起探讨)
a)        先说为什么建立连接需要3次握手,假设,A客户端向B服务器发送连接请求,这时候B就会收到一个连接请求,并确认,然后再告诉A,你可以连接进来了。这时候我们进行了两次握手了,但是为什么我们还需要一次。设置B已经同意A可以发送数据,但是它收到数据后怎么知道这是A发来的数据,所以这时候就需要A再次确认一下要发送数据了,并在包里加上一个识别码。用于服务器确认这是A发来的数据(如果不这样做,有可能为有其它的机器伪装发送的数据包,与服务器进行通讯),也可以防止B无限的浪费网络资源(因为B确认了可以发送,但A并没有确认要发送,只是向服务器请求了而已)
b)       为什么分手需要4次,我找到一种比较容易简单的理解方式,因为TCP的工作模式是全双工,什么是全双工呢(也就是网络上双向都有数据同时传输),相当我们的高速公路一样,我们的公路一般都在来去两个方向的车道(单行线除外),这时候如果我们要关闭高速公路的话,那是不是有四个口子需要关闭呢,所以需要4次

2015-12-10 10:42 举报
已邀请:
0

echo

赞同来自:

学习学习
0

蓝色风暴

赞同来自:

自己顶个,学习去了
0

lyhabc

赞同来自:

总结得不错
0

讯风

赞同来自:

学习了,感谢

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: