Linux TCP协议使用的变量
Linux /proc/sys/net/ipv4/* 变量
TCP变量:
somaxconn - INTEGER
listen()的backlog参数的上限,在用户态为SOMAXCONN。默认是128。也可参考TCP socket调优的tcp_max_syn_backlog参数。
tcp_abort_on_overflow - BOOLEAN
如果监听服务太慢以致于不能接受新的连接了,就重置他们。默认值是FALSE。这意味着如果是因为一个burst而发生的溢出,连接可以恢复。只有在你非常确定的监听服务端接受连接不能调整得更快的情况下,可以使能这个选项。使能这个选项可能会危害你服务器上的客户端。
tcp_adv_win_scale - INTEGER
以bytes/2^tcp_adv_win_scale统计缓冲区开销。
(if tcp_adv_win_scale > 0) 或者 bytes-bytes/2^(-tcp_adv_win_scale),
如果它小于0。
取值范围在[-31,31],默认为1。
tcp_allowed_congestion_control - STRING
显示/设置非特权进程的拥塞控制选项的可用性。这属于tcp_available_congestion_control的一个子集。
默认是reno和默认设置tcp_congestion_control。
tcp_app_win - INTEGER
预留应用程序缓冲区窗口,为max(window/2^tcp_app_win, mss)的大小。
0 是特殊含义,表示不预留任何空间。
默认值是31。
tcp_autocorking - BOOLEAN
使能TCP自动抑制:
当应用程序连续不断的调用小字节数write()/sendmsg()的系统调用,TCP会尝试仅可能的合并这些小的写操作,来降低发包的数量。这是在流里面至少有一个优先级报文在端口队列或者设备传输队列排队的情况下完成的。应用程序在知道如何或何时需要取消socket抑制的情况下,可以使用TCP_CORK选项来优化。
默认值是1。
tcp_available_congestion_control - STRING
显示可用的已注册的拥塞控制选项。更多拥塞控制算法模块可以用,但是没有加载。
tcp_base_mss - INTEGER
search_low的初始值,在封包层的路径mtu探测时使用。如果使能了MTU探测,就这个值就是这个连接上的MSS。
tcp_congestion_control - STRING
设置新连接的拥塞控制算法。算法"reno"通常可以用,但是基于内核的配置也会附加额外可用的选项。默认是设置内核配置的那部分。
对于passive连接,是继承了监听者的拥塞控制选项。
可参考 setsockopt(listenfd, SOL_TCP, TCP_CONGESTION, "name" ...)
tcp_dsack - BOOLEAN
运行TCP发送"duplicate" SACKs。
tcp_early_retrans - INTEGER
使能ER(早期重传),按照RFC5827。 当等待发送的数据的数量很小和没有之前未发送的数据要被发送时(比如使用了传输限制),ER会降低触发快速重传的阀值(门槛),同样,控制TLP(Tail loss probe,尾部丢弃检测)的使用,可以将由于尾部丢弃引起的RTOs事件转化为快速恢复(draft-dukkipati-tcpm-tcp-loss-probe-01)。
可能的取值:
0 禁止ER
1 使能ER
2 使能ER但是依照1/4的RTT值来延迟快速恢复和快速重传。
3 使能延迟的ER和TLP
默认值是3。
tcp_ecn - INTEGER
如果内核检测到ECN(显式拥塞通告)连接作弊,就会回退到 non-ECN。当前实现的是RFC3168, section 6.1.1.1描述的回退,但是也为将来做了保留,实现额外的检测机制。如果tcp_ecn或者每条路由的ECN设置未使能,这个值是无效的。
默认是1.(fallback enabled)
tcp_fack - BOOLEAN
使能FACK拥塞避免和快速重传。
如果tcp_sack没有使能,这个值也是无效的。
tcp_fin_timeout - INTEGER
一个孤立连接(没有任何应用程序使用的连接)在FIN_WAIT_2状态到连接终止的停留时间。当一个非孤立连接有一个完全有效的"receive only"状态时,一个处于FIN_WAIT_2状态的孤立连接不会永远等待远端来关闭它的连接。
默认是60秒。
tcp_frto - INTEGER
使能RFC5682定义的转发RTO-Recovery (F-RTO)(恢复时间?)。
F-RTO是TCP重传超时里一个强制恢复算法。它在那种RTT波动很大的网络(无线网络)非常有用。F-RTO是只修改发送端。它对对端没有任何要求。
默认是使用一个非0值表示使能,0表示禁止。
tcp_invalid_ratelimit - INTEGER
限制已有连接为了响应收到的无效TCP报文发送重复ack的速率,无效的原因如下:
(a)大于窗口的序列号
(b)大于窗口的ACK序列号
(c)PAWS(检查重叠序列号)检查失败
这个能减轻简单的"ack loop"的DoS攻击,那些怀有恶意的中间网络设备能通过重写TCP头部字段引起每个终端都认为其他人在发送无效的TCP分段,从而引发每一端(收发)都在发送因为无效分段造成的重复ACK。
0 表示取消对无效分段发送重复ACK的速率限制;其他值表示发送重复ACK的间隔,单位是毫秒。
默认值是 500 (milliseconds)。
tcp_keepalive_time - INTEGER
当心跳使能的时候,TCP发送心跳消息的频率。
默认值是2小时。
tcp_keepalive_probes - INTEGER
TCP判断一个连接已经断开的心跳探测包数。
默认是9。
tcp_keepalive_intvl - INTEGER
心跳探测包的发送频率。在探测开始后,通过乘以tcp_keepalive_probes得到杀死不响应连接的时间。
默认值是75秒。
连接会在约11分钟的重试之后终止。
tcp_l3mdev_accept - BOOLEAN
使能子socket继承L3主设备索引。使能这个选项允许一个'global'监听的socket可以穿越L3 master 域(比如VRFs)连接到继承绑定到原始报文的L3域的监听socket的socket。只有当内核编译配置了CONFIG_NET_L3_MASTER_DEV选项才有效。
tcp_low_latency - BOOLEAN
如何设置这个变量,相对于高吞吐量而言,TCP协议栈会更喜欢低延迟。默认的是,这个选项是没有设置的,这意味着更高的吞吐量是受欢迎的。但是,举个栗子,在计算机集群应用里,更需要的是低延迟。
默认是0。
tcp_max_orphans - INTEGER
系统中那些没有隶属于任何用户文件句柄的TCP socket的最大数目。如果这个数目被超过,孤立socket连接就会立即被重置并且打印出警告。这个限制的存在仅仅是为了防止简单DoS攻击,你不能依赖这个或者人为的降低这个限制,相反,你甚至需要增加这个限制(这个得在你增加了内存的情况下)。
如果网络条件允许大于这个默认值,调整网络服务为linger,并且杀死这样的状态的连接。
让我们重复一遍:每一个孤立连接要吃掉约64K的内存。这个内存是不能swap的。
tcp_max_syn_backlog - INTEGER
推荐的连接请求的最大数目,这些连接是没有接收到客户端的ack的连接。
对于内存小的机器,最小值是128,并且它可以随着内存的比例增加。
如果服务器遭受超负荷之苦,尝试提高这个值。
tcp_max_tw_buckets - INTEGER
系统同时保持的处于timewait的socket的最大数目。如果超过了这个数目,那么这些time-wait socket会马上被释放并打印警告信息。这个限制的存在仅仅是为了防止简单DoS攻击,你不能人为的降低这个限制,相反,你甚至需要增加这个限制(这个得在你增加了内存的情况下),如果网络条件要求大于这个值的话。
tcp_mem - vector of 3 INTEGERs: min, pressure, max
min:低于这个数目的页的话,TCP不会有吃内存的烦恼。
pressure:如果通过TCP分配的内存数量超过了这个值,TCP会减轻它的内存消耗和进入内存pressure模式,直到内存消耗降低到min。
max:所有TCP sockets队列允许的页数目。
默认是在boot阶段的可用内存计算的
tcp_min_rtt_wlen - INTEGER
跟踪最低RTT的窗口化最小过滤器的长度。
一个更小的窗口使得一个流能更快的获得新的(更高的)最低RTT当它移动到一个更长的路径上(比如因为流量工程)。一个更长的窗口使得过滤器对RTT膨胀(比如短暂的拥塞)是更加具有抵抗力的。单位是秒。
默认是300秒
tcp_moderate_rcvbuf - BOOLEAN
如果设置这个变量,TCP会执行接收缓冲区的自动调节,尝试自动的匹配这个要求能容纳全部吞吐量的缓冲区大小,这个不能比tcp_rmem[2]更大。
默认是使能的。
tcp_mtu_probing - INTEGER
控制TCP封包层路径MTU发现。有3个值:
0 - 禁止
1 - 默认禁止,当ICMP黑洞检测是会启用
2 - 总是启用,使用tcp_base_mss作为初始MSS。
tcp_probe_interval - INTEGER
控制TCP封包层路径MTU发现重探测的频率。按照RFC4821,默认是每10分钟重新探测一次。
tcp_probe_threshold - INTEGER
控制TCP封包层路径MTU发现探测停止条件,是按照搜索范围宽度的字节数来决定的、
默认是8字节。
tcp_no_metrics_save - BOOLEAN
默认的是,当连接关闭时,TCP在路由缓存里保存各种连接的度量,这样将来建立的连接可以是这些作为初始条件。通常,这能提升整体性能。如果设置了这个变量,TCP就不会缓存这些待关闭连接的度量了。
tcp_orphan_retries - INTEGER
这个值影响一个本地关闭的TCP连接的超时时间,当RTO重传仍没收到ACK时。
更多详情参考 tcp_retries2
默认值是8。
如果你的机器运行了一个web服务器,你应该考虑降低这个值,因为socket消耗了大量的资源。
tcp_recovery - INTEGER
这个值是一个启用各种各样的实验性的丢包恢复特征的位图。
RACK:0x1 表示对于丢包重传和尾丢弃的快速检测启用RACK丢包检测。
默认是 0x1.
tcp_reordering - INTEGER
TCP流的报文初始再排序级别。
TCP协议栈能在初始值和tcp_max_reordering之间动态调整流重排序级别。
默认是3.
tcp_max_reordering - INTEGER
TCP流的报文初始再排序的最大级别。
300是一个相对公平的值。如果使用负载均衡(像网卡bonding rr模式)的话,你可以增加这个值。
默认是300
tcp_retrans_collapse - BOOLEAN
在某些TCP协议栈重传尝试发送更大的报文。
tcp_retries1 - INTEGER
这个值影响由于某些错误引起的没有ACK的RTO重传和上报这些错误给网路层的时间。
RFC 1122推荐至少3次重传,这是个默认值。
tcp_retries2 - INTEGER
这个值影响当RTO重传仍没收到ACK的TCP连接的超时时间。
给定一个值N,假定一个TCP连接带有TCP_RTO_MIN的初始RTO的指数值会重传N次,在第(N+1)个RTO时杀死这个连接。
默认值是15,生成一个假想的超时时间是924.6秒,和一个有效超时的下限。
当超过这个假设的超时时间,TCP会在第一个RTO就会超时。
RFC1122推荐至少超时时间有100秒,相当于这个值等于8.
tcp_rfc1337 - BOOLEAN
如果设置了这个变量,TCP协议栈按照RFC1337运行。如果没有设置,就不保证按RFC运行了,但是阻止TCP TIME_WAIT。
默认是0.
tcp_rmem - vector of 3 INTEGERs: min, default, max
min: TCP sockets使用的接收缓冲区的最小大小。这个大小是对每个TCP socket都有保障的,即使在内存调节减压的时候。
默认是1个页。
default:TCP sockets使用的接收缓冲区的初始大小。这个值在其他协议使用之前会重写net.core.rmem_default这个字段。
默认是87380字节。这个值tcp_adv_win_scale的窗口默认大小为65535和tcp_app_win:0,并小于默认的tcp_app_win。
max:TCP sockets使用的接收缓冲区,允许自动选择接收者的最大大小。这个值不会重写net.core.rmem_max的内容。调用setsockopt()并使用SO_RCVBUF可以禁止自动调节socket的接收缓冲区大小,这种情况下这个值会被忽略。
默认是在87380B 和 6MB之间,依赖RAM的大小。
tcp_sack - BOOLEAN
启用选择性的ACK,SACK. 需要注意的是只有收到失序的分组时才会可能会发送SACK,TCP的ACK还是建立在累积确认的基础上的。
tcp_slow_start_after_idle - BOOLEAN
如果设置了该变量,TCP支持RFC2861和会使得拥塞窗口在一个空闲期会超时。空闲期的定义是基于当前RTO。如果没有设置,拥塞窗口就不会在空闲之后超时。
默认值是1.
tcp_stdurg - BOOLEAN
利用主机要求解释TCP紧急指针字段。大多数主机使用比较老的BSD声明,因此如果打开这个开关,在linux上你可能不能正确的跟他们通信。
默认是:false
tcp_synack_retries - INTEGER
对于一个被动的TCP连接试图被重传的SYNACK的次数。这个值不应该大于255。默认值是5,这对应于31秒直到重传伴随着1秒的当前初始RTO。对于一个被动的TCP连接的最后的超时将会在63秒之后发生。
tcp_syncookies - BOOLEAN
只有在内核编译的时候开启了CONFIG_SYN_COOKIES选项才有效。当一个socket的syn backlog 队列溢出的时候会发出syncookies。这个主要是针对防范'SYN flood attack'。
默认是1.
注意,syncookies是一个退化的设备。
它不能在那些基于正常连接建立速率造成高负载的服务器上使用。如果你在日志里发现SYN flood警告,但通过调查研究是由于负载过多的正常连接造成的,你应该去调整其他参数直到警告消失。
syncookies严重违反了TCP协议,不允许使用TCP扩展,能导致一些服务严重退化(如SMTP relaying),不是那么明显看的出来的,但是你的客户端和中继会告诉你。如果你在日志看到了SYN flooding告警,但不是真的泛洪了,那就是你的服务器严重配置错了。
如果你想测试syncookies的影响,你可设置这个值为2.
tcp_fastopen - INTEGER
启用TCP Fast Open(RFC7413)在opening SYN报文发送和接收数据。
客户端上默认值0x1是启用。客户端应该使用设置了MSG_FASTOPEN的sendmsg和sendto,而不是使用connect在SYN里发送数据。
在服务端默认值是0x2不启用。然后不管是用另外一个值0x400来启用所有监听者或者通过TCP_FASTOPEN选项来启用单独的监听者,该选项的是syn-data backlog的长度。
这些值(bitmap)如下:
0x1 : 在客户端,启用客户端在opening SYN时发送数据。
0x2 : 在服务端,启用服务端支持,允许在一个SYN报文里接收数据并在3次握手完成之前传递给应用程序。
0x4 : 在客户端,不管cookie能不能用和没有cookie选项的情况下,都在opening SYN里发送数据。
0x200 : 在服务端,接收任何cookie选项描述的data-in-syn w/o
0x400 : 在服务端,默认启用所有监听者去支持Fast Open,不需要用显式的TCP_FASTOPEN socket选项。
默认是0x1。
注意,其他的客户端和服务端特性只有在基本的支持(0x1和0x2)各自启用了才有作用。
tcp_syn_retries - INTEGER
一个试图重传的活动TCP连接的初始SYNs次数。这个值不应该大于127.默认值是6,相对于上一次具有1秒初始RTO的重传间隔63秒。具有最终超时的活动TCP连接的尝试会在127秒后发生。
tcp_timestamps - INTEGER
启用RFC1323里定义的时间戳。
0 : 禁止
1 : 启用RFC1323里定义的时间戳,并对每个连接使用随机的偏移量而不是使用当前时间。
2 : 和1一样,但是没有随机偏移。
默认是1.
tcp_min_tso_segs - INTEGER
每个TSO帧的分段个数。
自从linux-3.12开始,TCP就自动定义TSO帧的大小,依据于流的速率,取代了之前64Kbytes报文填充的做法。对于一些特定的用法,它不能强制TCP去构建大的TSO帧。注意,如果可用的窗口太小的话,TCP协议栈可能会分割过大的TSO报文。
默认值是2.
tcp_pacing_ss_ratio - INTEGER
TCP协议栈会按照当前速率的比例来设置sk->sk_pacing_rate的值。(current_rate = cwnd * mss / srtt)。如果TCP是慢启动的话,tcp_pacing_ss_ratio用来使TCP探测更大的速率,假定CWND是其他RTT的2倍。
默认值是200.
tcp_pacing_ca_ratio - INTEGER
TCP协议栈会按照当前速率的比例来设置sk->sk_pacing_rate的值。(current_rate = cwnd * mss / srtt)。如果TCP处于拥塞避免时期,tcp_pacing_ca_ratio用来使TCP探测更大的吞吐量。
默认值是120.
tcp_tso_win_divisor - INTEGER
这个控制一个TSO帧消耗的拥塞窗口的比例。这个参数的设置是在突发性和构建更大的TSO帧之间做选择。
默认是3.
tcp_tw_recycle - BOOLEAN
使能快速回收TIME-WAIT的sockets。默认值是0。在没有技术专家的建议或要求下不要改变这个值。
tcp_tw_reuse - BOOLEAN
从协议安全的视角允许新的连接重用TIME-WAIT的sockets。默认值是0.在没有技术专家的建议或要求下不要改变这个值。
tcp_window_scaling - BOOLEAN
启用RFC1323定义的窗口缩放。
tcp_wmem - vector of 3 INTEGERs: min, default, max
min:预留给TCP socket发送缓冲区的内存数量。每个TCP socket在创建后都有权使用。
默认是1page。
default:TCP socket使用的发送缓冲区的初始大小。这个值会重写其他协议使用的字段net.core.wmem_default。它通常会小于net.core.wmem_default。
默认是16K。
max:TCP socket发送缓冲区允许自动调整的内存最大数量。这个值不会重写net.core.wmem_max。调用setsockopt()设置SO_SNDBUF会禁止自动调整socket的发送缓冲区大小,在这种情况下这个值是被忽略的。
默认是64K和4MB之间,依赖RAM的大小。
tcp_notsent_lowat - UNSIGNED INTEGER
由于TCP_NOTSENT_LOWAT socket选项,TCP socket可以控制它的写队列里未发送的字节的数量。 如果未发送的字节数低于一个socket设置的值,并且它的写队列没有满,poll()/select()/epoll()上报POLLOUT事件。即使达到了这个限制,sendmsg()也不会添加新的缓冲区。
这个全局变量控制socket未发包数据的数量并不使用TCP_NOTSENT_LOWAT。对于这些sockets,对全局变量的修改会立即生效。
默认是UINT_MAX(0xFFFFFFFF)
tcp_workaround_signed_windows - BOOLEAN
如果设置了这个变量,假定没有收到窗口伸缩选项,意味着远程TCP已经断开并把窗口设置为负数。如果没设置,即使没有收到窗口伸缩选项,也不会认为远程TCP已经断开。
默认是0.
tcp_thin_linear_timeouts - BOOLEAN
启用对于thin streams的线性超时的动态触发。如果设置了,通过检查超时重传去决定这个流是不是细的(传输中少于4个包)。如果一个流被发现是细的,在指数补偿之前,完成6个线性超时。这个改进了那些非聚合的细流的重传延时,通常发现是基于时间的。
默认是0。
tcp_thin_dupack - BOOLEAN
启用在细流的一个dupACK之后的重传动态触发。如果设置了,会在基于收到一个dupACK的检查来决定一个是不是细流(传输中少于4个包)。如果发现一个流是细的,那么在接收到第一个dupACK就会重传数据。
这个改进了那些非聚合的细流的重传延时,通常发现是基于时间的。
默认是0。
tcp_limit_output_bytes - INTEGER
控制每个tcp socket的TCP小队列限制。
TCP 大块发送者趋向于发送过程中增加报文直到它收到丢失通告。在自动调整SNDBUF的情况下,会在本机的qdisc/device里入队大量的报文,对于典型的pfifo_fast qdiscs,这会损害其他流的时延。
tcp_limit_output_bytes 会限制qdisc/device里的字节数来人为降低RTT/cwnd和降低缓冲区膨胀。
默认是262144.
tcp_challenge_ack_limit - INTEGER
限制每秒发送的挑战ACK的数目,就像RFC5961里推荐的一样,增加tcp的健壮性来封堵 In-Window Attacks。
默认是100.