TCP的三次握手(建立连接)和四次挥手(关闭连接)
在平常运维服务器的时候,需要查看各种连接状态,所以必须要对TCP连接状态非常熟悉才知道每个状态的意义;只有知道了这些参数的意义才可以相对应的优化。
查看状态命令:
[root@tomcat10 logs]# netstat -na | awk '/^tcp/{s[$6]++}END{for(key in s) print key,s[key]}' TIME_WAIT 1443 CLOSE_WAIT 1122 SYN_SENT 3 FIN_WAIT1 2074 FIN_WAIT2 195 ESTABLISHED 89782 SYN_RECV 7314 LISTEN 9 CLOSING 9 LAST_ACK 2372
各个状态的意义如下 :
LISTEN:表示监听的TCP端口已经打开;
SYN_SENT:客户端在发送建立连接(SYN)请求后的状态;
SYN_RECV:服务端在收到SYN请求建立连接后,发送SYN+ACK后的状态;
ESTABLISHED:客户端在发送完ACK后的状态、服务端在收到ACK后的状态,此时连接正式建立;
FIN_WAIT1:客户端发送完FIN后的状态;
CLOSE_WAIT:服务端收到客户端的FIN请求后,发送对FIN的ACK后的状态;
FIN_WAIT2:收到服务端发送的对之前FIN的ACK后的状态;
LAST_ACK:服务端处理完最后的数据,发送FIN后的状态;
TIME_WAIT:收到服务端发送的FIN后的状态,表示处于空闲等待阶段;
CLOSED:TIME_WAIT时间到达后,发送对FIN的确认ACK后的状态,发送完ACK表示连接已关闭 ;
CLOSING:连接双方同时发送关闭请求和确认时的状态;
三次握手四次断开流程示意:
更直观的流程示意:
关于四次断开:
a.先由客户端向服务器端发送一个FIN,请求关闭数据传输。
b.当服务器接收到客户端的FIN时,向客户端发送一个ACK,其中ack的值等于FIN+SEQ
c.然后服务器向客户端发送一个FIN,告诉客户端应用程序关闭。
d.当客户端收到服务器端的FIN是,回复一个ACK给服务器端。其中ack的值等于FIN+SEQ
为什么要4次才能断开?
a.确保数据能够完成传输。
b.但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;
c.但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后
d.再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
下面看下大家一般比较关心的三种TCP状态:
SYN_RECV:
服务端收到建立连接的SYN没有收到ACK包的时候处在SYN_RECV状态。有两个相关系统配置:
1. net.ipv4.tcp_synack_retries --> 默认值是5
对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。通常我们不对这个值进行修改,因为我们希望TCP连接不要因为偶尔的丢包而无法建立。
2. net.ipv4.tcp_syncookies --> 默认值是1
一般服务器都会设置net.ipv4.tcp_syncookies=1来防止SYN Flood***。假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟)。
这些处在SYNC_RECV的TCP连接称为半连接,并存储在内核的半连接队列中,在内核收到对端发送的ack包时会查找半连接队列,并将符合的requst_sock信息存储到完成三次握手的连接的队列中,然后删除此半连接。大量SYNC_RECV的TCP连接会导致半连接队列溢出,这样后续的连接建立请求会被内核直接丢弃,这就是SYN Flood***。
能够有效防范SYN Flood***的手段之一,就是SYN Cookie。SYN Cookie原理由D. J. Bernstain和 Eric Schenk发明。SYN Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN Flood***的一种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。
观测服务上SYN_RECV连接个数为:7314,对于一个高并发的服务器,这个数字比较正常。
CLOSE_WAIT
发起TCP连接关闭的一方称为client,被动关闭的一方称为server。被动关闭的server收到FIN后,但未发出ACK的TCP状态是CLOSE_WAIT。出现这种状况一般都是由于server端代码的问题,如果你的服务器上出现大量CLOSE_WAIT,应该要考虑检查代码。
TIME_WAIT
根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态。TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒。TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务。
为什么需要TIME_WAIT?TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证。
和TIME_WAIT状态有关的系统参数有一般由3个,本厂设置如下:
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_fin_timeout,默认60s,减少这个数值以便加快系统关闭处于 FIN_WAIT2 状态的 TCP 连接,建议值为30。
net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
使用puppet实现自动化运维
使用puppet实现自动化运维 服务概述: 1、什么是puppet puppet是一个为实现数据中心自动化管理而设计的配置管理软件。是一种Linux、Unix平台的集中配置管理系统,使用ruby语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。 2、Puppet的工作模式 Puppet是一个C/S架构的配置管理工具,在中央服务器上安装puppet-server软件包(被称作Puppetmaster)。在需要管理的目标主机上安装puppet客户端软件(被称作PuppetClient)。当客户端连接上Puppetmaster后,定义在Puppetmaster上的配置文件会被编译,然后在客户端上运行。每个客户端默认每半个小时和服务器进行一次通信,确认配置信息的更新情况。如果有新的配置信息或者配置信息已经改变,配置将会被重新编译并发布到各客户端执行。也可以在服务器上主动触发一个配置信息的更新,强制各客户端进行配置。如果客户端的配置信息被改变了,它可以从服务器获得原始配置...
- 下一篇
我们恢复HP DL380服务器RAID丢失信息的案例
【数据恢复故障描述】 客户服务器属于HP品牌DL380系列,存储是由6块73GB SAS硬盘组成的RAID5,操作系统是WINDOWS 2003 SERVER,主要作为企业部门内部的文件服务器来应用,主机(无UPS)故障前经历过几次意外断电,重启后RAID报错,提示无法找到存储设备,进入RAID管理模块后操作死机,重启后问题依旧,用户联系到我们公司并且把设备带到我公司。 【数据恢复故障分析】 主机意外断电导致RAID模块损坏(包括RAID管理信息丢失和RAID模块硬件损坏)的情况并不少见,一般来说,RAID创建完成后,其管理模块的信息就不会再发生改变,但这部分信息毕竟属于可修改信息,意外断电很容易造成这部分信息被篡改甚至丢失,多次断电甚至有可能导致RAID卡上的元器件损坏,从而使主机失去对多块物理硬盘进行RAID管理的中间层模块。该案例中对RAID模块的操作死机现象极有可能是由RAID卡硬件损坏引起的(后经HP售后技术人员验证得到证实),此时通过正常途径已无法将获取6块硬盘中的数据,只能依靠第三方提供数据恢复服务来解决。 【数据恢复过程】 1.首先针对用户提供的6块SAS硬盘进...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- 设置Eclipse缩进为4个空格,增强代码规范