TCP连接三次握手和四次断开分析

该变量控制每个监听端口接收的客户端发送的SYN队列的长度,输入的SYN报文段连接请求需要排队,直到本地服务端接收,如果连接数多于默认值,则新来的 连接请求会被丢弃,在服务端会维护一个未连接队列,该队列为每个客户端发送的SYN包开设一个条目,说明已经收到SYN包,并且向客户端发出 SYN+ACK包,等待客户端的确认SYN包,这时服务端出于SYN_RECV状态,如果tcp_max_syn_backlog过小,一直收不到客户端最后发来的SYN确认包,服务端就会一直出于SYN_RECV状态,查看netstat -an的时候如果SYN_RECV过多有可能就是tcp_max_syn_backlog过小。增大为8192,可以容纳更多的等待连接的网络连接数

2 /proc/sys/net/ipv4/tcp_synack_retries (5)

该变量控制内核向某个输入的SYN/ACK段重新发送响应的次数,降低取值可以更早的检测到客户端连接失败的尝试。

3 /proc/sys/net/ipv4/tcp_retries2 (15)

该变量控制内核向已经建立连接的远程主机重新发送数据的次数,降低取值可以更早的检测到与远程主机的连接失效,从而可以快速释放该链接的资源。

4 /proc/sys/net/ipv4/ip_local_port_range (32768 61000)

该变量控制系统上可用的临时端口的范围。端口是ip协议对各个socket加以区分的地址的逻辑抽象。

5 /proc/sys/net/ipv4/tcp_retries1 (3)

该变量设置放弃回应一个tcp连接请求前,需要进行多少次重试。

6 /proc/sys/net/ipv4/tcp_syncookies (0 关闭 1 打开)

该参数主要用来防止SYN FLOOD攻击。SYN Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。

SYN Flood攻击是一种典型的拒绝服务型(Denial of Service)攻击。所谓拒绝服务型攻击就是通过进行攻击,使受害主机或网络不能够良好的提供服务,从而间接达到攻击的目的。

SYN Flood攻击利用的是IPv4中TCP协议的三次握手(Three-Way Handshake)过程进行的攻击。大家知道协议规定,如果一端想向另一端发起TCP连接,它需要首先发送TCP SYN 包到对方,对方收到后发送一个TCP SYN+ACK包回来,发起方再发送TCP ACK包回去,这样三次握手就结束了。我们把TCP连接的发起方叫作"TCP客户机(TCP Client)",TCP连接的接收方叫作"TCP服务器(TCP Server)"。值得注意的是在TCP服务器收到TCP SYN request包时,在发送TCP SYN+ACK包回TCP客户机前,TCP服务器要先分配好一个数据区专门服务于这个即将形成的TCP连接。一般把收到SYN包而还未收到ACK包时的连 接状态成为半开连接(Half-open Connection)。

在最常见的SYN Flood攻击中,攻击者在短时间内发送大量的TCP SYN包给受害者,这时攻击者是TCP客户机,受害者是TCP服务器。根据上面的描述,受害者会为每个TCP SYN包分配一个特定的数据区,只要这些SYN包具有不同的源地址(这一点对于攻击者来说是很容易伪造的)。这将给TCP服务器系统造成很大的系统负担, 最终导致系统不能正常工作。

TCP三次握手建立连接后,并没有规定必须立即进行数据交换,连接可以永久保持空闲状态,如果客户端发生故障,则将无法被其他主机检测到,而tcp的连接保持机制允许服务端对连接加以监视并在合理的时间内获知这种故障,影响参数有下:

1 /proc/sys/net/ipv4/tcp_keepalive_time (7200)

如果在该参数指定的秒数内连接始终处于空闲状态,则内核向客户端发起对该主机的探测.tcp发送keepalive消息的频度.默认是2小时.就改为10分钟

2 /proc/sys/net/ipv4/tcp_keepalive_intvl (75)

该参数以秒为单位,规定内核向远程主机发送探测指针的时间间隔

3 /proc/sys/net/ipv4/tcp_keepalive_probes (9)

该参数规定内核为了检测远程主机的存活而发送的探测指针的数量,如果探测指针的数量已经使用完毕仍旧没有得到客户端的响应,即断定客户端不可达,关闭与该客户端的连接,释放相关资源。

以上三个参数 7500+9*75 导致一条失效的连接在经过2小时11分钟后才被丢弃,降低上述数值可以减少失效连接所占资源的时间

TCP断开连接的四次握手,过程如下:

TCP连接三次握手和四次断开分析

初始时客户端和服务端都处于ESTABLISHED状态。

1 客户端先发送一个FIN包,告诉服务端他要断开连接。

2 服务端收到FIN包后,给客户端发送一个确认包ACK,告诉应用程序他要关闭连接了。

3 当应用程序准备好断开后,服务端给客户端发送FIN包。

4 客户端收到服务端发来的FIN包后,给服务端发送ACK确认包。服务端收到之后就关闭连接。

四次握手断开连接状态分析:

1 当服务端收到客户端发来的FIN包后,给客户端发送一个ACK确认包,然后通知应用程序准备关闭,因为应用程序可能还有些数据需要发送给客户端,所以这时服务端是CLOSE_WAIT状态,而不是CLOSED状态。

2 客户端发送FIN包要求断开连接后就进入了FIN-WAIT-1状态,当收到服务端发送的ACK包后就进入到FIN-WAIT-2状态,而在实际情况下FIN-WAIT-1比较难见,因为客户端发送FIN包后服务端会立刻发送ACK包。

3 客户端进入FIN-WAIT-2状态时,表示是半连接,即一方要求关闭连接后,另一方回复说我还有点数据要传输,稍后再关闭,这就是服务端发送ACK之后不立即进入CLOSED状态,而是通知应用程序准备关闭。

4 服务端应用程序准备好之后,内核发送FIN给客户端,等待客户端的ACK包,服务端进入LAST_ACK状态,这时候客户端收到FIN后,发送ACK报 文给服务端,客户端进入TIME-WAIT状态,TIME-WAIT等待2MSL后进入CLOSED状态,服务端收到客户端发送的ACK包之后进入 CLOSED状态。

2MSL时间,当客户端最后给服务端发送ACK后,不立即进入CLOSED状态,这2MSL时间是为了防止客户端发送的ACK包丢失而让服务端一直处于LAST_ACK状态,让服务端处于LAST_ACK超时重发FIN。

影响断开连接的参数:

1 /proc/sys/net/ipv4/tcp_max_tw_buckets (18000)

该参数设置系统的TIME_WAIT的数量,如果超过默认值则会被立即清除。

2 /proc/sys/net/ipv4/tcp_tw_reuse (0 关闭 1 打开)

该参数设置TIME_WAIT重用,可以让处于TIME_WAIT的连接用于新的tcp连接

3 /proc/sys/net/ipv4/tcp_tw_recycle ( 0 关闭 1 打开)

该参数设置tcp连接中TIME_WAIT的快速回收。

4 /proc/sys/net/ipv4/tcp_fin_timeout (60)

设置FIN-WAIT-2进入CLOSED的等待时间。

更多相关文章
  • TCP是一个面向连接的协议,面向连接是指任何一方向对方发送数据前必须先建立通道,比如像打电话一样:必须要等到对方的手机响铃,并且对方接听电话时,才能与对方通信.而UDP则不是面向连接的协议,基于UDP协议的通信双方不需要事先与对方协商建立连接,也不管对方的IP地址与端口号是否存在,就发送数据,这个处 ...
  • TCP是一个面向连接的服务,面向连接的服务是电话系统服务模式的抽象,每一次完整的数据传输都必须经过建立连接,数据传输和终止连接三个过程,TCP建立连接的过程称为三次握手,下面说一下三次握手的具体过程: TCP三次握手过程主机A通过向主机B 发送一个含有同步序列号的标志位的数据段给主机B ,向主机B ...
  • TCP三次握手与四次断开
    第一次握手:建立连接时,客户端发送Syn包(syn=j)到服务器,并进入syn_send状态,等待服务器确认第二次握手:服务器收到Syn包,必须确认客户端的syn(ack=j+1),同时自己也发送一个syn包(syn=k),即SYN+Ack包,此时服务器进入syn recv状态:第三次握手:客户端收 ...
  • 简析TCP的三次握手与四次分手
    TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续.它只是一个超级麻烦的协议,而它 又是互联网的基础,也是每个程序员必备的基本功.首先来看看OSI的七层模型: 我们需要知道TCP工作在网络OSI的七层模 ...
  • TCP/IP三次握手、四次挥手原理
    .TCP/IP三次握手示意图SYN:同步序号.ACK:应答回复.RST:复位连接,清除旧有的同步序号.PSH:尽可能的将数据送往接收进程.FIN:发送方完成数据发送.LISTEN:监听是否有连接请求包.FIN:关闭连接请求.ACK:应答回复共收到多少数据.2.为何需要四次挥手TCP成功建立连接时,使 ...
  • 关于tcp/ip三次握手的理解和详细分析
    实例,通过http文件下载来分析tcp/ip三次握手的机制在百度里面搜索QQ,进行下载,然后对数据包流程进行分析抓包数据如下,三次握手过程分析(此处为描述方便,将A=192.168.0.152,B=61.158.251.62)三次握手流程原理1. (A) –> [SYN] –> (B)  ...
  • 十五大原理之零三--TCP/IP的三次握手和四次断开原理
    重要的标志位含义:ACK:表示确认.只有当ACK标志位为1时,TCP报文的确认字段才有效.SYN:表示同步,在连接建立时用来同步序列号.当SYN=1而ACK=0时,表明这是一个连接请求报文.若对方同意建立连接时,则在响应报文中,应使SYN=1,ACK=1.因此,同步比特SYN置为1,就表明这是一个连 ...
  • 置顶文章:<纯CSS打造银色MacBook Air(完整版)> 上一篇:<两个简单的Loading> 下一篇:<JavaScript实现Ajax小结> 置顶文章:<纯CSS打造银色MacBook Air(完整版)>
一周排行
  • EXCEL2010追踪修改记录详解
                  最近有很多人问在excel中是不是也可以像在word中一样显示 ...
  •       近期遇到很多朋友问及想从事Android开发,有些是大四的学生,有些是已经工作了,从事J2EE或者C++.C#等开发工作.对他们为什么要从事Android我不是很深入的了解,不过Android确实是一个近 ...
  • 最近一直在学习C语言,于是就打算把自己学习过程中做的C语言的题记录下来,现在写到个人博客当中,供大家阅读.由于鄙人初学C语言,若本人写的程序有问题,请大家不吝赐教.若喷,请深喷.声明一点,所写的程序全是使用Xcode ...
  • 一般情况下,在修改后my.cnf,需要重启一下mysql才能让这个参数生效.有人说,可以使用 /etc/init.d/mysqld  reload 但笔者reload后,再次查看变量的值依旧没有改变.下面是笔者的操作 ...
  • 1.PL/SQL中如何消除乱码?添加以下环境变量即可:NLS_CHARACTERSET=ZHS16GBKNLS_LANG=AMERICAN_AMERICA.ZHS16GBK2.如何在本地Xshell远程安装服务器软件 ...
  • 一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先到这里下载Stable稳定版,目前最新版本是2.8.17 1.2 ...
  • 有时候我们在做维护的时候,总会遇到类似于IO特别高,但不能判定是IO瓶颈还是软件参数设置不当导致热盘的问题.这时候通常希望能知道磁盘的读写速度,来进行下一步的决策.下面是两种测试方法:(1)使用hdparm命令这是一 ...
  • .NET泛型解析(上)
    [1]:泛型介绍泛型是C#2.0中一个重要的新特性,泛型是CLR和编程语言提供的一种特殊机 ...
  • MDaemon与AD域结合之同步部分账号
    试验环境:windows 2003 server sp2.AD域(hs.com).MD10 ...
  • 1.增加字段 ALTER TABLE tableName ADD COLUMN columnName VARCHAR(20) DEFAULT NULL --增加一个字段,默认为空 ALTER TABLE tableN ...