好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

TCP连接状态详解以及故障排查.docx

9页
  • 卖家[上传人]:拖***
  • 文档编号:291097562
  • 上传时间:2022-05-11
  • 文档格式:DOCX
  • 文档大小:19.75KB
  • / 9 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 本文格式为Word版,下载可任意编辑TCP连接状态详解以及故障排查 我们通过了解TCP各个状态,可以摈弃和定位网络或系统故障时大有扶助总结网络上的内容) 1、TCP状态 linux查看tcp的状态命令: 1)、netstat -nat 查看TCP各个状态的数量 2)、lsof -i:port 可以检测到开启套接字的状况 3)、 sar -n SOCK 查看tcp创造的连接数 4)、tcpdump -iany tcp port 9000 对tcp端口为9000的举行抓包 LISTENING:侦听来自远方的TCP端口的连接苦求. 首先服务端需要开启一个socket举行监听,状态为LISTEN 有供给某种服务才会处于LISTENING状态,TCP状态变化就是某个端口的状态变化,供给一个服务就开启一个端口,例如:供给服务默认开的是80端口,供给ftp服务默认的端口为21,当供给的服务没有被连接时就处于LISTENING状态FTP服务启动后首先处于侦听(LISTENING)状态处于侦听LISTENING状态时,该端口是开放的,等待连接,但还没有被连接。

      就像你房子的门已经打开的,但还没有人进来 看LISTENING状态最主要的是看本机开了哪些端口,这些端口都是哪个程序开的,关闭不必要的端口是保证安好的一个分外重要的方面,服务端口都对应一个服务(应用程序),中断该服务就关闭了该端口,例如要关闭21端口只要中断IIS服务中的FTP服务即可关于这方面的学识请参阅其它文章 假设你不幸中了服务端口的木马,木马也开个端口处于LISTENING状态 SYN-SENT:客户端SYN_SENT状态: 再发送连接苦求后等待匹配的连接苦求:客户端通过应用程序调用connect举行 active open.于是客户端tcp发送一个SYN以苦求建立一个连接.之后状态置为SYN_SENT. /*The socket is actively attempting to establish a connection. 在发送连接苦求后等待匹配的连接苦求 */ 当苦求连接时客户端首先要发送同步信号给要访问的机器,此时状态为SYN_SENT,假设连接告成了就变为ESTABLISHED,正常处境下SYN_SENT状态分外短暂。

      例如要访问网站http://. 假设察觉有好多SYN_SENT展现,那一般有这么几种处境,一是你要访问的网站不存在或线路不好,二是用扫描软件扫描一个网段的机器,也会出展现好多SYN_SENT,另外就是可能中了病毒了,例如中了\冲击波\,病毒发作时会扫描其它机器,这样会有好多SYN_SENT展现 SYN-RECEIVED:服务器端状态SYN_RCVD 再收到和发送一个连接苦求后等待对方对连接苦求确实认 当服务器收到客户端发送的同步信号时,将标志位ACK和SYN置1发送给客户端,此时服务器端处于SYN_RCVD状态,假设连接告成了就变为ESTABLISHED,正常处境下SYN_RCVD状态分外短暂 假设察觉有好多SYN_RCVD状态,那你的机器有可能被SYN Flood的DoS(拒绝服务攻击)攻击了 SYN Flood的攻击原理是: 在举行三次握手时,攻击软件向被攻击的服务器发送SYN连接苦求(握手的第一步),但是这个地址是伪造的,如攻击软件随机伪造了51.133.163.104、65.158.99.152等等地址。

      服务器在收到连接苦求时将标志位ACK和SYN置1发送给客户端(握手的其次步),但是这些客户端的IP地址都是伪造的,服务器根本找不到客户机,也就是说握手的第三步不成能完成 这种处境下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);一个用户展现奇怪导致服务器的一个线程等待1分钟并不是什么很大的问题,但假设有一个恶意的攻击者大量模拟这种处境,服务器端将为了维护一个分外大的半连接列表而消耗分外多的资源----数以万计的半连接,即使是简朴的保存并遍历也会消耗分外多的CPU时间和内存,何况还要不断对这个列表中的IP举行SYN+ACK的重试此时从正常客户的角度看来,服务器失去响应,这种处境我们称做:服务器端受到了SYN Flood攻击(SYN洪水攻击) ESTABLISHED:代表一个开启的连接 ESTABLISHED状态是表示两台机器正在传输数据,查看这个状态最主要的就是看哪个程序正在处于ESTABLISHED状态 服务器展现好多ESTABLISHED 状态: netstat -nat |grep 9502或者使 用lsof -i:9502可以检测到。

      当客户端未主动close的时候就断开连接:即客户端发送的FIN损失或未发送 这时候若客户端断开的时候发送了FIN包,那么服务端将会处于CLOSE_WAIT状态; 这时候若客户端断开的时候未发送FIN包,那么服务端处还是显示ESTABLISHED状态; 结果客户端重新连接服务器 而新连接上来的客户端(也就是方才断掉的重新连上来了)在服务端断定是ESTABLISHED; 假设客户端重复的上演这种处境,那么服务端将会展现大量的假的ESTABLISHED连接和CLOSE_WAIT连接 最终结果就是新的其他客户端无法连接上来,但是利用netstat还是能看到一条连接已经建立,并显示ESTABLISHED,但始终无法进入程序代码 FIN-WAIT-1:等待远程TCP连接中断苦求,或从前的连接中断苦求确实认 主动关闭(active close)端应用程序调用close,于是其TCP发出FIN苦求主动关闭连接,之后进入FIN_WAIT1状态./* The socket is closed, and the connection is shutting down. 等待远程TCP的连接中断苦求,或从前的连接中断苦求确实认 */ 假设服务器展现shutdown再重启,使用netstat -nat查看,就会看到好多 FIN-WAIT-1的状态。

      就是由于服务器当前有好多客户端连接,直接关闭服务器后,无法接收到客户端的ACK FIN-WAIT-2:从远程TCP等待连接中断苦求 主动关闭端接到ACK后,就进入了FIN-WAIT-2 ./* Connection is closed, and the socket is waiting for a shutdown from the remote end. 从远程TCP等待连接中断苦求 */ 这就是出名的半关闭的状态了,这是在关闭连接时,客户端和服务器两次握手之后的状态在这个状态下,应用程序还有采纳数据的才能,但是已经无法发送数据,但是也有一种可能是,客户端一向处于FIN_WAIT_2状态,而服务器那么一向处于WAIT_CLOSE状态,而直到应用层来抉择关闭这个状态 CLOSE-WAIT:等待从本地用户发来的连接中断苦求 被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN苦求(它的接收也作为文件终止符传递给上层应用程序),并进入CLOSE_WAIT. /* The remote end has shut down, waiting for the socket to close. 等待从本地用户发来的连接中断苦求 */ CLOSING:等待远程TCP对连接中断确实认 对比少见./* Both sockets are shut down but we still don't have all our data sent. 等待远程TCP对连接中断确实认 */ LAST-ACK:等待原来的发向远程TCP的连接中断苦求确实认 被动关闭端一段时间后,接收到文件终止符的应用程序将调用CLOSE关闭连接。

      这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK . /* The remote end has shut down, and the socket is closed. Waiting for acknowledgement. 等待原来发向远程TCP的连接中断苦求确实认 */ 使用并发压力测试的时候,突然断开压力测试客户端,服务器会看到好多LAST-ACK TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断苦求确实认 在主动关闭端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态/* The socket is waiting after close to handle packets still in the network.等待足够的时间以确保远程TCP接收到连接中断苦求确实认 */ TIME_WAIT等待状态,这个状态又叫做2MSL状态,说的是在TIME_WAIT2发送了结果一个ACK数据报以后,要进入TIME_WAIT状态,这个状态是防止结果一次握手的数据报没有传送到对方那里而打定的(留神这不是四次握手,这是第四次握手的保险状态)。

      这个状态在很大程度上保证了双方都可以正常终止,但是,问题也来了 由于插口的2MSL状态(插口是IP和端口对的意思,socket),使得应用程序在2MSL时间内是无法再次使用同一个插口的,对于客户程序还好一些,但是对于服务程序,例如httpd,它总是要使用同一个端口来举行服务,而在2MSL时间内,启动httpd就会展现错误(插口被使用)为了制止这个错误,服务器给出了一个宁静时间的概念,这是说在2MSL时间内,虽然可以重新启动服务器,但是这个服务器还是要宁静的等待2MSL时间的过去才能举行下一次连接 CLOSED:没有任何连接状态 被动关闭端在采纳到ACK包后,就进入了closed的状态连接终止./* The socket is not being used. 没有任何连接状态 2、TCP状态迁移路线图 client/server两条路线陈述TCP状态迁移路线图: 这是一个看起来对比繁杂的状态迁移图,由于它包含了两个片面---服务器的状态迁移和客户端的状态迁移,假设从某一个角度启程来看这个图,就会明显大量,这里面的服务器和客户端都不是十足的,发送数据的就是客户端,采纳数据的就是服务器。

      客户端应用程序的状态迁移图 客户端的状态可以用如下的流程来表示: 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.