摘自:http://maoyidao.iteye.com/blog/1744277

面试时看到应聘者简历中写精通网络,TCP编程,我常问一个问题,TCP建立连接需要几次握手?95%以上的应聘者都能答对是3次。问TCP断开连接需要几次握手,70%的应聘者能答对是4次通讯。再问CLOSE_WAIT,TIME_WAIT是什么状态,怎么产生的,对服务有什么影响,如何消除?有一部分同学就回答不上来。不是我扣细节,而是在通讯为主的前端服务器上,必须有能力处理各种TCP状态。比如统计在本厂的一台前端机上高峰时间TCP连接的情况,统计命令:

Linux shell代码  
  1. netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

结果:

除了ESTABLISHED,可以看到连接数比较多的几个状态是:FIN_WAIT1, TIME_WAIT, CLOSE_WAIT, SYN_RECV和LAST_ACK;下面的文章就这几个状态的产生条件、对系统的影响以及处理方式进行简单描述。

TCP状态

TCP状态如下图所示:

可能有点眼花缭乱?再看看这个时序图

下面看下大家一般比较关心的三种TCP状态

SYN_RECV

服务端收到建立连接的SYN没有收到ACK包的时候处在SYN_RECV状态。有两个相关系统配置:

1,net.ipv4.tcp_synack_retries :INTEGER

默认值是5

对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。通常我们不对这个值进行修改,因为我们希望TCP连接不要因为偶尔的丢包而无法建立。

2,net.ipv4.tcp_syncookies

一般服务器都会设置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_timeout,减少TIME_WAIT连接数量。

net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

下一篇:http://maoyidao.iteye.com/blog/1744309 “通讯系统经验谈【二】解读内核参数 - socket/文件句柄资源限制参数”会向大家介绍本厂网络相关设置中的其他选项,特别是系统资源限制相关的内核配置。

  • 大小: 22.7 KB
  • 大小: 108.9 KB
  • 大小: 217 KB

通讯系统经验谈【一】TCP连接状态分析:SYNC_RECV,CLOSE_WAIT,TIME_WAIT相关推荐

  1. 【Tcp】TCP连接中存在大量TIME_WAIT、CLOSE_WAIT的原因【转】

    TCP连接中存在大量TIME_WAIT.CLOSE_WAIT的原因 TCP通信图 TIME_WAIT CLOSE_WAIT TCP通信图 TIME_WAIT 表示客户端主动关闭socket. 原因: ...

  2. linux命令查看tcp连接,查看linux系统中的TCP连接

    查看Linux的TCP连接 netstat -na    查看哪些IP连接本机 netstat -na Active Internet connections (servers and establi ...

  3. 查看队列深度_不为人知的网络编程(十一):从底层入手,深度分析TCP连接耗时的秘密...

    " 本文作者张彦飞,原题"聊聊TCP连接耗时的那些事儿",本次收录已征得作者同意,转载请联系作者.即时通讯网收录时有少许改动.本文已同步发布于52im社区:http:// ...

  4. TCP 连接断连问题剖析

    在官方的正式文档中,TCP/IP 协议簇也称为国际互联网协议簇.TCP/IP 协议簇是目前使用最为广泛的全球互联网技术,其分层结构如图 1 所示: 图 1. TCP/IP 协议簇分层结构  如图 1 ...

  5. 面试官问:大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?怎么处理?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 几个方面: 问题描述:什么现象?什么影响? 问题分析 解决 ...

  6. 大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | ningg.top/computer-basi ...

  7. 83998 连接服务器出错_服务端 TCP 连接的 TIME_WAIT 问题分析与解决

    民工哥技术之路 写在开头,大概 4 年前,听到运维同学提到 TIME_WAIT 状态的 TCP 连接过多的问题,但是当时没有去细琢磨:最近又听人说起,是一个新手进行压测过程中,遇到的问题,因此,花点时 ...

  8. 基础原理系列:服务端 TCP 连接的 TIME_WAIT 问题

    几个方面: 问题描述:什么现象?什么影响? 问题分析 解决方案 底层原理 1.问题描述 模拟高并发的场景,会出现批量的 TIME_WAIT 的 TCP 连接: 短时间后,所有的 TIME_WAIT 全 ...

  9. close wait 过多原因_干货分享!服务端 TCP 连接的 TIME_WAIT 问题分析与解决

    写在开头,大概 4 年前,听到运维同学提到 TIME_WAIT 状态的 TCP 连接过多的问题,但是当时没有去细琢磨:最近又听人说起,是一个新手进行压测过程中,遇到的问题,因此,花点时间,细深究一下. ...

最新文章

  1. 取没有date的邮件发送时间
  2. C语言0xc0000142错误,第一次用c++编译器出现奇怪的报错
  3. containerd项目正式从CNCF毕业
  4. 机器学习在金融风控实践经验
  5. junit测试线程_一个在自己的线程中运行测试的JUnit规则
  6. 「Python基础知识」Python字符串是什么,如何使用
  7. python os.system(cls)没反应_这真的是全宇宙最简单的Python安装方式了
  8. Jupyter notebook增加新的kernel
  9. 【Codeforces 851D Arpa and a list of numbers】
  10. 【Shiro第一篇】 Shiro权限框架简介
  11. 掷骰子python代码_掷骰子游戏,,游戏规则:玩家投掷两个骰
  12. 有符号与无符号,长整型与短整型
  13. 严重的PHP缺陷可导致QNAP NAS 设备遭RCE攻击
  14. 用Verilog实现数字钟
  15. 新思课堂C语言答案,新思课堂APP最新版下载_新思课堂APP官方版1.6.8下载_QQ下载站...
  16. Halcon批量读取图片 读取指定文件夹下图片
  17. P3369 【模板】普通平衡树 Treap树堆学习笔记
  18. java nio wakeup_Java NIO 的 wakeup 剖析
  19. 保利威视自定义右键菜单设置
  20. Fortify代码扫描问题及修复

热门文章

  1. mysql打印语句_大数据挖掘—(八):scrapy爬取数据保存到MySql数据库
  2. 河北计算机辅助普通话试题,115-河北省计算机辅助普通话水平测试培训.pptx
  3. 实验五 输入输出练习_JAVA
  4. 回文串判定_JAVA
  5. ACM《数据结构》顺序表
  6. 粗浅看 java反射机制
  7. 面试心得与总结—BAT、网易、蘑菇街
  8. Java 基本数据类型 sizeof 功能
  9. Java书籍Top 10
  10. OpenCV之feature2d 模块. 2D特征框架(2)特征描述 使用FLANN进行特征点匹配 使用二维特征点(Features2D)和单映射(Homography)寻找已知物体 平面物体检测