参考:http://bbs.jointforce.com/topic/18471

最近在分析客户的一个问题时遇到了一种奇怪的情况,客户在服务端开启了某个端口,但是在客户端telnet确一直不通。通过在服务端抓包发现,客户端的syn分节已经到达,但是服务端并没有应答。查看了一下当前连接数,发现连接数也不大,所以排除是连接队列满造成的。后来忽然想起了net.ipv4.tcp_tw_recycle选项可能引起这个问题,于是关闭了这个选项,问题果然得以解决。这里分析一下原因。

有些服务器(当然客户端也可以)为了避免TIME_WAIT状态占用连接,希望能加快TIME_WAIT状态的回收,通常将net.ipv4.tcp_tw_recycle选项开启。当然这个选项的生效要依赖net.ipv4.tcp_timestamps选项的开启。虽然开启这个选项能够加快TIME_WAIT连接的回收,但却引入了另一个问题。我们先看下tcp_tw_recycle选项的工作机制:
当开启了tcp_tw_recycle选项后,当连接进入TIME_WAIT状态后,会记录对应远端主机最后到达分节的时间戳。如果同样的主机有新的分节到达,且时间戳小于之前记录的时间戳,即视为无效,相应的数据包会被丢弃(rfc1323)。
    Linux是否启用这种行为取决于tcp_timestamps和tcp_tw_recycle,因为tcp_timestamps缺省就是开启的,所以当tcp_tw_recycle被开启后,实际上这种行为就被激活了。
    现在很多公司都用LVS做负载均衡,通常是前面一台LVS,后面多台后端服务器,这其实就是NAT,当请求到达LVS后,它修改地址数据后便转发给后端服务器,但不会修改时间戳数据,对于后端服务器来说,请求的源地址就是LVS的地址,加上端口会复用,所以从后端服务器的角度看,原本不同客户端的请求经过LVS的转发,就可能会被认为是同一个连接,加之不同客户端的时间可能不一致,所以就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了,具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK,还可以通过下面命令来确认数据包不断被丢弃的现象:

shell> netstat -s | grep timestamp
... packets rejects in established connections because of timestamp
    如果服务器身处NAT环境,安全起见,通常要禁止tcp_tw_recycle,至于TIME_WAIT连接过多的问题,可以通过激活tcp_tw_reuse来缓解(只对客户端有作用)。


当然关闭tcp_timestamps选项也是可以避免这个问题的:
设置sysctl.conf里面tcp_timestamps=0也可以只用命令sysctl -w net.ipv4.tcp_timestamps=0
    但个人建议关闭tcp_tw_recycle选项,而不是timestamp;因为 在tcp timestamp关闭的条件下,开启tcp_tw_recycle是不起作用的;而tcp timestamp可以独立开启并起作用。此外tcp timestamp还和其他选项起作用有关,如tcp_tw_reuse。

TCP服务端收到syn但是不回复syn ack问题分析相关推荐

  1. java mina tcp_Mina TCP服务端客户端 示例

    服务端代码:package com.xd.nms.example; import java.io.IOException; import java.net.InetSocketAddress; imp ...

  2. 2-3 建立简易TCP服务端、客户端【socket server/client】【socket、bind、listen、accept、send、closesocket】【conect、recv】

    2-3 建立简易TCP服务端.客户端 文章目录 2-3 建立简易TCP服务端.客户端 0-前言 1-服务端简易功能 2-客户端简易功能 3-代码逻辑 4-服务端 4-1 建立socket 4-2 绑定 ...

  3. Go语言实现TCP服务端和客户端

    Go语言实现TCP服务端和客户端 Go语言实现TCP通信 TCP协议 TCP服务端 TCP客户端 本文转载自Go语言实现TCP通信 Go语言实现TCP通信 TCP协议 TCP/IP(Transmiss ...

  4. Qt 的 tcp服务端讲解

    TCP TCP : (Tramsmission Control Protocl)传输控制协议,一种面向连接的,可靠的,基于字节流的传输层通信协议. 本文目标 实现一个简单的服务器,可以接受客户端的信息 ...

  5. TCP服务端程序开发

    TCP服务端程序开发 1. 开发 TCP 服务端程序开发步骤回顾 创建服务端端套接字对象 绑定端口号 设置监听 等待接受客户端的连接请求 接收数据 发送数据 关闭套接字 2. socket 类的介绍 ...

  6. pythontcp服务器如何关闭阻塞_python实现单线程多任务非阻塞TCP服务端

    本文实例为大家分享了python实现单线程多任务非阻塞TCP服务端的具体代码,供大家参考,具体内容如下 # coding:utf-8 from socket import * # 1.创建服务器soc ...

  7. Qt中TCP服务端编程

    文章目录 1 Qt中的TCP服务端编程 1.1 TCP服务端编程介绍 1.2 Qt中的TCP服务端编程 1 Qt中的TCP服务端编程 1.1 TCP服务端编程介绍 网络中的服务端: 服务端是为客户端服 ...

  8. Python基于socket实现的多任务版TCP服务端

    ''' 基于socket实现的多任务版TCP服务端 ''' import socket import threadingdef client_task(client_socket,ip_port):p ...

  9. Python基于socket实现的TCP服务端

    ''' 基于socket实现的TCP服务端 '''import socket # 建立socket对象 server_socket=socket.socket(socket.AF_INET,socke ...

最新文章

  1. 一般关于大宗商品的供需关系相关的数据网址有哪些?
  2. (一)ubuntu下qtcreator +opencv下新建一个项目和调用caffe环境配置
  3. opencv笔记(3):图像镜像
  4. utf-8编码的字符串转成unicode(ucs-4)编码的字符串
  5. Linux中自带正则表达式应用举例
  6. SRC是在本位置显示:source的缩写,源的意思 HREF是点击后连接的目标:HyperlinkReference,超链接引用...
  7. oracle自动分区maxvalue,对Maxvalue上限范围分区进行spilt操作
  8. Spring 的 IOC原理
  9. 运用递归实现快速排序算法(二分排序)
  10. 基于Sklearn实现LDA算法
  11. 如何优化网站的访问速度
  12. 5G网络切片安全隔离机制与应用
  13. 前馈神经网络求解XOR问题
  14. Web大学生网页成品——英雄联盟LOL游戏网站制作与实现(HTML+CSS+JS)
  15. String实现 intern
  16. 计算机辅助翻译实训心得,计算机辅助翻译实训报告格式.doc
  17. 区块链技术在现实生活中的主要应用有哪些?
  18. python+selenium——详解介绍Selenium常用API的使用--python语言(完整版)
  19. Java开发人员必须掌握的两个Linux魔法工具(四)
  20. 高精度除法算法(大数除于小数)

热门文章

  1. 自己做的一个小程序 可采集、导出、模板、配置
  2. pythonexcel汇总_用python汇总excel表格数据-怎样用python遍历表格中的内容
  3. Tungsten Fabric SDN — Netronome Agilio SmartNIC vRouter
  4. 5G 标准 — R18
  5. FD.io/VPP — VPP Agent — 架构设计
  6. Go 语言编程 — panic 和 recover
  7. 用 Flask 来写个轻博客 (34) — 使用 Flask-RESTful 来构建 RESTful API 之三
  8. Process monitor词汇汉化
  9. 程序员的快速开发框架:Github上 10 大优秀的开源后台控制面板
  10. 加密算法 AES MD5 SHA1