Linux上的TIME_WAIT和tcp_fin_timeout
当Linux服务器的TIME_WAIT过多时,
通常会想到去修改参数降低TIME_WAIT时长,
以减少TIME_WAIT数量,但Linux并没有提供这样的接口,
除非重新编译内核。
Linux默认的TIME_WAIT时长一般是60秒(等于2MSL),
定义在内核的include/net/tcp.h文件中:
#define TCP_TIMEWAIT_LEN (60*HZ)
/* how long to wait to destroy TIME-WAIT state,
* about 60 seconds
*/
#define TCP_FIN_TIMEOUTTCP_TIMEWAIT_LEN
/* BSD style FIN_WAIT2 deadlock breaker.
* It used to be 3min, new value is 60sec,
* to combine FIN-WAIT-2 timeout with
* TIME-WAIT timer.
*/
注意tcp_fin_timeout不是TIME_WAIT时间(吴功宜审校的W.Richard Stevens和Kevin R.Fall所著《TCP/IP详解 卷1:协议》中文第二版第13.5.2节称net.ipv4.tcp_fin_timeout为2MSL值):
# cat /proc/sys/net/ipv4/tcp_fin_timeout
60
tcp_fin_timeout实为FIN_WAIT_2状态的时长,
Linux没有提供修改TIME_WAIT时长接口,除非修改宏的定义重新编译内核。
但Windows可以修改注册表中的TcpTimedWaitDelay值来控制TIME_WAIT时长。
RTO:超时重传(Retransmission Timeout)
MSL:包最大存活时长(Maximun Segment Lifetime)
TIME_WAIT是一个常见经常的问题,相关内容(/etc/sysctl.conf或/proc/sys/net/ipv4):
1) net.ipv4.tcp_timestamps
为1表示开启TCP时间戳,用来计算往返时间RTT(Round-Trip Time)和防止序列号回绕
2) net.ipv4.tcp_tw_reuse
为1表示允许将TIME-WAIT的句柄重新用于新的TCP连接
3) net.ipv4.tcp_tw_recycle
为1表示开启TCP连接中TIME-WAIT的快速回收,NAT环境可能导致DROP掉SYN包(回复RST)
4) net.ipv4.tcp_fin_timeout
FIN_WAIT_2状态的超时时长
5) net.ipv4.tcp_syncookies
为1时SYN Cookies,当SYN等待队列溢出时启用cookies来处理,可防范少量SYN攻击
6) net.ipv4.tcp_max_tw_buckets
保持TIME_WAIT套接字的最大个数,超过这个数字TIME_WAIT套接字将立刻被清除并打印警告信息
7) net.ipv4.ip_local_port_range
8) net.ipv4.tcp_max_syn_backlog
端口最大backlog内核限制,防止占用过大内核内存
9) net.ipv4.tcp_syn_retries
对一个新建连接,内核要发送多少个SYN连接请求才决定放弃,不应该大于255
10) net.ipv4.tcp_retries1
放弃回应一个TCP连接请求前﹐需要进行多少次重试,RFC规定最低的数值是3,这也是默认值
11) net.ipv4.tcp_retries2
在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试,默认值为15
12) net.ipv4.tcp_synack_retries
TCP三次握手的SYN/ACK阶段重试次数,缺省5
13) net.ipv4.tcp_max_orphans
不属于任何进程(已经从进程上下文中删除)的sockets最大个数,超过这个值会被立即RESET,并同时显示警告信息
14) net.ipv4.tcp_orphan_retries
孤儿sockets废弃前重试的次数,缺省值是7
15) net.ipv4.tcp_mem
内核分配给TCP连接的内存,单位是page:
第一个数字表示TCP使用的page少于此值时,内核不进行任何处理(干预),
第二个数字表示TCP使用的page超过此值时,内核进入“memory pressure”压力模式,
第三个数字表示TCP使用的page超过些值时,报“Out of socket memory”错误,TCP 连接将被拒绝
16) net.ipv4.tcp_rmem
为每个TCP连接分配的读缓冲区内存大小,单位是byte
17) net.ipv4.tcp_wmem
为每个TCP连接分配的写缓冲区内存大小,单位是byte:
第一个数字表示,为TCP连接分配的最小内存,
第二个数字表示,为TCP连接分配的缺省内存,
第三个数字表示,为TCP连接分配的最大内存(net.core.wmem_max可覆盖该值)
18) net.ipv4.tcp_keepalive_time
当keepalive起用的时候,TCP发送keepalive消息的频度,单位为秒,缺省是7200秒(即2小时)
19) net.ipv4.tcp_keepalive_intvl
keepalive探测包的发送间隔
20) net.ipv4.tcp_keepalive_probes
如果对方不予应答,探测包的发送次数
代码中可通过SO_LINGER来控制。
Linux上的TIME_WAIT和tcp_fin_timeout的更多相关文章
- 不要在linux上启用net.ipv4.tcp_tw_recycle参数
不要在linux上启用net.ipv4.tcp_tw_recycle参数 发布于 2015/07/27 莿鸟栖草堂 本文为翻译英文BLOG<Coping with the TCP TIME-WA ...
- linux 服务器优化 --TIME_WAIT 问题
linux 服务器优化 --TIME_WAIT 问题: 问题现象: 1.外部机器不能正常连接SSH 2.内向外不能够正常的ping通过,域名也不能正常解析. 通过一些命令,查看服务器TIME_WAIT ...
- 如何利用mono把.net windows service程序迁移到linux上
How to migrate a .NET Windows Service application to Linux using mono? 写在最前:之所以用要把windows程序迁移到Linux上 ...
- Linux上运行NET
今天尝试了下Ubuntu上运行NET程序,按照 https://github.com/aspnet/Home 的指引,一步一步来: 1.安装DNVM(原名KVM) Linux控制台下输入 curl - ...
- .NET跨平台之旅:在生产环境中上线第一个运行于Linux上的ASP.NET Core站点
2016年7月10日,我们在生产环境中上线了第一个运行于Linux上的ASP.NET Core站点,这是一个简单的提供后端服务的ASP.NET Core Web API站点. 项目是在Windows上 ...
- 【Oracle 集群】11G RAC 知识图文详细教程之RAC在LINUX上使用NFS安装前准备(六)
RAC在LINUX上使用NFS安装前准备(六) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇 ...
- 【无私分享:ASP.NET CORE 项目实战(第十章)】发布项目到 Linux 上运行 Core 项目
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下 ...
- 不装mono,你的.NET程序照样可以在Linux上运行!
让.NET应用程序在linux上运行,目前通用的做法就是在Linux上安装mono,然后通过”mono your.exe“命令运行这个程序. 这种运行.net程序的办法有两个弱点,一个是需要客户机安装 ...
- ASP.NET Core MVC 在linux上的创建及发布
前言 ASP.NET core转眼都发布半月多了,社区最近也是非常活跃,虽然最近从事python工作,但也一直对.NET念念不忘,看过了园区大神们搭建的Asp.net core项目之后,自己也是跃跃欲 ...
随机推荐
- HTML 转 PDF 之 wkhtmltopdf 工具精讲
术语定义 文档对象 “文档对象”是指PDF文档中的文档对象,共有三种类型的“文档对象”,他们分别是“页面对象”,“封面对象”和“目录对象”. 页面对象 “页面对象”是指以页面的形式在PDF文档中呈现的 ...
- Angular5学习札记
1.使用cnpm安装jQuery和bootstrap后,页面没有加载的问题 -使用cnpm安装的路径和使用npm安装路径不一样,解决如下: 把css路径改成"../node_modules/ ...
- c# 把对象加入队列,对象为全局变量,对象改变队列值也跟着改变
若程序把对象加入队列,对象为全局变量,对象改变队列值也跟着改变,如下: filecontent 为两个字段的属性值. class FileContent { // public string Htt ...
- Linux系统安装过程
一.安装VMware® Workstation 14 Pro,有一些安装时会出现virtual XT的错误,这需要重启电脑进入BIOS,开户虚拟加速开关:有些win8/10会出现虚拟网卡安装失败的情况 ...
- 扩展、委托、Lambda、linq
1.扩展 扩展是一个很有用的功能.如果你有一个类.不能修改,同时你又想给他加一个方法.这个过程就是扩展.扩展就是扩展方法. 例1: 类People public class People { publ ...
- 阿里巴巴Java开发手册及Java代码规约扫描eclipse插件
一.github地址: https://github.com/alibaba/p3c 二..eclipse插件的安装 此处示例采用eclipse,版本为 Neon.1 Release RC3 (4.6 ...
- Luogu 3421 [POI2005]SKO-Knights - Exgcd
Description 给出一个骑士的 $N$种 中行走的方式 $(a_i, b_i)$, 可以使骑士的坐标$(-a,-b)$或$(+a,+b)$. 我们需要找出 第二个骑士的 两种行走方式 $(c_ ...
- java指针与引用(转载)
大家都知道java和C#中没有指针这个概念.但是也导致了编程中常常忽略了对象与引用的区别,难道java真的没有指针吗?句柄是什么?变量地址在哪里?没有地址是不可能的,关键是java中如何避免了指针这个 ...
- Android Studio Tip of the Day
1. Alt + Q 可以查看一个方法的简单参数列表. 2. 查看一个类,如果是eclipse的话,一般直接是F3, 现在的F3好痛苦.只能改为Ctrl + H,将就着用. 3. Ctrl + J 语 ...
- js之function
function* function* 这种声明方式(function关键字后跟一个星号)会定义一个生成器函数 (generator function),它返回一个 Generator 对象. 你 ...