TCP性能调优实现原理及过程解析

TCP性能调优实现原理及过程解析,第1张

TCP性能调优实现原理及过程解析

本文详细介绍了TCP特性调整的基本原理和全过程分析。原文根据示例代码非常详细,对大家的学习培训或者工作都有一定的参考价值,朋友们一定要参考。

三次握手链接

客户端SYN数据包的重试频率

sysctl-wnet.IPv4.TCP_syn_retries=6

详细介绍

第一次重试发生在大约1秒后,然后在第2、4、8、16和32秒以双重方式进行六次重试。最后一次重试将等待64秒,如果ACK仍然没有返回,三次握手将被停止。因此,总时间为1248163264=127秒,超过2分钟。

服务器端半连接池大小

sysctl-wnet.IPv4.TCP_max_syn_backlog=16384

服务器半连接池满后,是否打开syncookie系统?

sysctl-wnet.IPv4.TCP_syncookies=1

详细介绍

如果SYN半连接序列已满,默认设置将失去连接。事实并非如此。打开syncookies可以在不应用SYN序列的情况下成功创建连接。

Syncookies是这样做的:网络服务器根据当前状态计算出一个值,放入我们发来的SYNACK消息中,当手机客户端返回ACK消息时,就脱下这个值进行认证。如果合理合法,则认为连接创建成功,如下图所示。

  • 0表示关闭效果;
  • 2显示无理由开通功能;
  • 1表示只有当SYN半连序列不能忘记时,再打开。
  • 注意:由于syncookie仅用于解决SYN洪泛攻击(网络攻击故意向网络服务器发送多种结构的SYN消息,导致SYN半连接序列溢出,无法创建所有正常手机客户端的连接),因此这类方法创建的连接很多TCP特性无法应用。因此,tcp_syncookies应设置为1,并且仅在序列已满时打开。

    服务器SYNACK数据包的重试频率

    net.ipv4.tcp_synack_retries=5

    详细介绍

    tcp_synack_retries的默认设置重试次数为5次,类似于手机客户端重发SYN。重试需要1、2、4、8和16秒。在最后一次重试后,它将等待32秒。如果没有收到ACK,连接将被关闭,因此它必须总共等待63秒。

    服务器端完全连接序列的大小

    在min(backlog,/proc/sys/net/core/somaxconn)中,linux内核2.2版之后,listen函数的backlog的主要参数可以设置接受序列的大小。

    此外,backlog的主要参数还受到Linux系统软件级别的序列长度的限制。自然,这个限制阈值也可以根据核心的主要参数somaxconn的主要参数来改变。默认设置是128。

    sysctl-wnet.core.somaxconn=32768

    四波链接

    接下来,我们把先关闭连接的一方称为主动方,后关闭连接的一方称为被动方。

    挥手四次的步骤:

    其实四波只涉及两种消息:FIN和ACK。完成完成连接的意思。无论谁发出FIN消息,都表示不再发送所有数据信息,关闭该方向的安全传输通道。承认是由承认决定的意义。它用于通知对方您的安全传输通道已经关闭。当主动方关闭连接时,发送FIN消息,主动方的连接状态从ESTABLISHED变为FIN_WAIT1。当被动方收到FIN报文时,核心自动回复内容ACK报文,连接状态从ESTABLISHED变为CLOSE_WAIT。说白了就是等待进程启用关闭功能关闭连接。当主动方收到此ACK消息时,连接状态从FIN_WAIT1变为FIN_WAIT2,主动方的发送安全通道关闭。似乎被动侧的发送安全通道又被关闭了。当被动方进入CLOSE_WAIT状态时,进程的read函数会归零,这样开发者就会有目的的启用CLOSE函数,从而打开核心发送FIN消息。此时,被动方的连接状态变为LAST_ACK。当主动方接收到该FIN消息时,核心将自动回复内容ACK。另外,连接状态会从FIN_WAIT2变为TIME_WAIT,在Linux系统软件下,TIME_WAIT状态的连接会在1分钟左右完全关闭。当被动方收到ACK消息时,连接将被关闭。

    积极促销

    等待ACK和FIN包的重传频率

    主动方发送FIN报文后,连接处于FIN_WAIT1状态,一般应该在几十ms内变化为FIN_WAIT2,只有在延时后无法收到对方返回的ACK时,netstat指令视图才能发现FIN_WAIT1的状态。此时,核心会定期重发FIN报文,其中重发频率由tcp_orphan_retries主参数控制(注意,虽然orphan是孤儿的意思,但这个主参数不仅对孤儿连接合理,实际上对FIN_WAIT1状态的所有连接都合理),初始值为0,表示8次:

    net.ipv4.tcp_orphan_retries=0

    连接的孤儿总数

    net.IPv4.TCP_max_orbonds=16384

    详细介绍

    TCP_max_orbonds定义了大量的孤儿连接。在该过程启用close函数来关闭连接之后,该连接处于FIN_WAIT1状态。这个连接与进程无关,成为孤儿连接。Linux系统软件为了避免孤儿连接过多,导致长期占用服务器资源,显示了TCP_max_orbonds的主要参数。如果孤儿连接的总数超过它,增加的孤儿连接将不会波动四次,而是会立即发送RST校准消息以强制关闭。

    孤儿连接的定义:由进程启用和关闭的连接称为孤儿连接。此外,关闭功能还可以关闭连接。两者都会向对方发送FIN消息(在发送FIN之前,关机的主要参数必须传输到SHUT_WR或SHUT_RDWR)。区别在于启用关闭后,即使半关闭状态下对方发送的数据到达主动方,流程也无法接受。如果使用netstat-p命令,会发现连接匹配的进程被称为空(与进程无关!)。shutdown调用函数后,即使连接进入FIN_WAIT1或FIN_WAIT2状态,也不是孤儿连接,进程仍然可以再次读取数据。

    等待FIN的时间

    net.ipv4.tcp_fin_timeout=60

    详细介绍

    当连接收到ACK并进入FIN_WAIT2状态时,表示主动方的发送安全通道已经关闭,然后会等待对方发送FIN消息,关闭对方的发送安全通道。此时,如果使用shutdown功能关闭连接,则连接可以始终处于FIN_WAIT2状态。但是对于close函数关闭的孤儿连接来说,这种状态并不能持续很久,tcp_fin_timeout *** 纵了连接在这种状态下的持续时间。

    与TIME_WAIT相关的主要参数

    详细介绍

    TIME_WAIT是正方四波的最后一个状态。当接收到被动方发送的FIN消息时,主动方响应ACK,表示可以确定对方的发送安全通道已经关闭,进入TIME_WAIT状态,等待60秒后将关闭连接。

    TIME_WAIT状态大量连接

    当TIME_WAIT中的连接总数超过这个主参数时,新关闭的连接将立即关闭,而不需要TIME_WAIT。

    net.IPv4.TCP_max_tw_buckets=5000

    不是复用TIME_WAIT状态的端口号。

    在TIME_WAIT状态下复用端口号。如果网络服务器会主动连接上下游网络服务器,可以将tcp_tw_reuse的基本参数设置为1,作为手机客户端的新连接。TIME_WAIT状态下的端口号可以在安全标准下应用。

    net.ipv4.tcp_tw_reuse=1

    自然,为了让tcp_tw_reuse工作,时间戳的基本参数要设置为1,这是考虑到安全复用的前提条件(对方也要开启tcp_timestamps):

    net.ipv4.tcp_timestamps=1

    旧版Linux还展示了tcp_tw_recycle的主要参数,没有规定TIME_WAIT状态存在60秒,非常容易造成数据信息混乱。不建议将其设置为1。

    net.ipv4.tcp_tw_recycle=0

    所以在Linux版之后,这个主要参数立刻被取消了。

    其他设备

    允许系统软件打开的端口范围

    sysctl-wnet.IPv4.IP_local_port_range=102465000

    系统允许全局分发大量文件句柄。

    sysctl-wfs.file-max=2097152

    sysctl-wfs.nr_open=2097152

    echo2097152>/proc/sys/fs/nr_open

    当前对话或进程允许的打开文件句柄的数量。

    ulimit-n1048576

    文章里的内容就这些了。期待对大家的学习和培训有所帮助,也期待大家的应用。

    欢迎分享,转载请注明来源:内存溢出

    原文地址: https://outofmemory.cn/zz/774082.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-03
    下一篇 2022-05-03

    发表评论

    登录后才能评论

    评论列表(0条)

    保存