4.5 TCP优化

TCP 三次握手的性能提升

三次握手的过程在一个 HTTP 请求的平均时间占比 10% 以上,所以要正确使用三次握手的中参数,需要先用netstat命令查看是哪个握手阶段出了问题,主动发起连接的客户端优化相对简单些,而服务端需要监听端口,属于被动连接方,其间保持许多的中间状态,优化方法相对复杂一些。

客户端优化

调整SYN报文重传次数

三次握手建立连接的首要目的是「同步序列号」。只有同步序列号才有可靠传输,SYN 的全称就叫 Synchronize Sequence Numbers(同步序列号)。

客户端作为主动发起连接方,首先发送SYN包,于是客户端连接会处于SYN_SENT状态,客户端没有收到服务端传过来的ACK+SYN就会重传SYN,重发的次数由 tcp_syn_retries 参数控制,默认是 5 次;每次超时时间是上一次的2倍。可以根据网络的稳定性和目标服务器的繁忙程度修改 SYN 的重传次数,调整客户端的三次握手时间上限。

服务端优化

调整SYN 半连接队列长度

要想增大半连接队列,不能只单纯增大 tcp_max_syn_backlog 的值,还需一同增大 somaxconn 和 backlog,也就是增大 accept 队列。否则,只单纯增大 tcp_max_syn_backlog 是无效的。

如果 SYN 半连接队列已满,只能丢弃连接吗?

开启 syncookies 功能就可以在不使用 SYN 半连接队列的情况下成功建立连接。

调整 SYN+ACK 报文重传次数

客户端收到服务端的ACK+SYN后恢复ACK给服务器,同时客户端连接状态由SYN-SENT变为ESTABLELISHED,表示连接建立成功,服务端需要接收到客户端的ACK才会变成ESTABLELISHED,如果没收到客户端的ACK就会重传ACK+SYN同时一直处于 SYN_RCV 状态。

当网络繁忙、不稳定时,报文丢失就会变严重,此时应该调大重发次数。反之则可以调小重发次数。修改重发次数的方法是,调整 tcp_synack_retries 参数。

调整accept队列长度

服务器收到ACK后建立连接成功,此时内核会把连接从半连接队列中移除,然后创建新的完全连接,并将其添加到accept队列,等待进程调用accept函数时把连接取出来。

如果进程不能及时地调用 accept 函数,就会造成 accept 队列(也称全连接队列)溢出,最终导致建立好的 TCP 连接被丢弃。

如何查看accept连接队列已满

netstat -s 可以隔几秒钟执行下,如果这个数字一直在增加的话,说明 accept 连接队列偶尔满了。

如何绕过三次握手

TCP Fast Open 功能需要客户端和服务端同时支持,才有效果,使得 HTTP 请求减少了 1 个 RTT 的时间

TCP三次握手优化总结

TCP 四次挥手的性能提升

主动方优化,关闭连接的方式通常有两种,分别是 RST 报文关闭和 FIN 报文关闭。

close函数和shutdown函数有什么区别?

调用了 close 函数意味着完全断开连接,完全断开不仅指无法传输数据,而且也不能发送数据。 此时,调用了 close 函数的一方的连接叫做「孤儿连接」,如果你用 netstat -p 命令,会发现连接对应的进程名为空。

使用 close 函数关闭连接是不优雅的。于是,就出现了一种优雅关闭连接的 shutdown 函数,它可以控制只关闭一个方向的连接

主动方的优化

调整FIN报文重传次数

第一次挥手 ,调整tcp_orphan_retries参数,降低

调整FIN WAIT2状态的时间

主动方收到ACK后进入FIN—WAIT2状态,表示主动方的发送通道已经关闭,接下来将等待对方发送FIN报文,关闭对方的发送通道。

如果此时连接使用shutdown函数关闭的,连接可以一直处于FIN—WAIT2状态,因为还可以继续发送或接收数据。但是对于close函数关闭的孤儿连接,由于无法再发送和接收数据,所以这个状态不可持续太久,,而 tcp_fin_timeout 控制了这个状态下连接的持续时长,默认值是 60 秒:

调整孤儿连接的上限个数

当进程调用了close函数关闭连接,此时连接就会是孤儿连接,因为无法再发送和接收数据,有个tcp_max_orphans孤儿连接数量参数,大于他就不再走tcp四次挥手直接RST复位报文关闭。

Time wait的作用

①:防止历史连接的数据,被后面相同四元组的连接错误接收:2MSL这个时间足以让两个方向上的历史数据包都被丢弃,使得原来连接的数据包在网路中都自然消失,再出现数据一定都是新建立连接所产生的。

②:保证被动关闭连接的一方,能被正确关闭 :等待足够长的时间使得ACK能让被动关闭方接收,从而帮助其正确关闭。

调整time wait 状态的上限个数

 tcp_max_tw_buckets 参数,当 TIME_WAIT 的连接数量超过该参数时,新关闭的连接就不再经历 TIME_WAIT 而直接关闭,并发增多,可以适当增大这个数量,也不是越大越好,资源有限。

复用time_wait状态的连接

tcp_tw_reuse 和 tcp_timestamps 设置为1,只作用在 connect 函数,也就是客户端,将TIME_WAIT状态的端口复用作为客户端的新连接,只适用于客户端。

被动方的优化

close_wait状态的数量

被动方收到FIN就开始进入close_wait状态,等待进程调用close函数关闭连接。因此,出现大量CLOSE_WAIT状态的连接。

减少FIN报文重传次数、

TCP四次挥手的性能提升总结

 

TCP 数据传输的性能提升

扩大窗口大小

TCP提供一种可以让发送方数据根据接收方的实际接收能力控制发送的数据量-滑动窗口

内核接收到报文,必须使用缓冲区存放他们,这样剩余缓冲区空间变小,接收窗口也变小;

进程调用read函数,报文被读入内存空间,内核缓存被清空,主机可以接收更多的报文,窗口大。

接收方把报文大小放到TCP报文头部的窗口字段中

默认的滑动窗口最大值只有 64 KB,不满足当今的高速网络的要求,要想提升发送速度必须提升滑动窗口的上限,在 Linux 下是通过设置 tcp_window_scaling 为 1 做到的,此时最大值可高达 1GB。

调整发送缓冲区范围

发送缓冲区是自行调节的,当发送方发送的数据被确认后,并且没有新的数据要发送,就会把发送缓冲区的内存释放掉。

调整接收缓冲区范围

接收缓冲区可以根据系统空闲内存的大小来调节接收窗口:

发送缓冲区的调节功能是自动开启的,而接收缓冲区则需要配置 tcp_moderate_rcvbuf 为 1 来开启调节功能

接收缓冲区动态调节

,我们应该把缓冲区的上限设置为带宽时延积。发送缓冲区的调节功能是自动打开的,而接收缓冲区需要把 tcp_moderate_rcvbuf 设置为 1 来开启。其中,调节的依据是 TCP 内存范围 tcp_mem。

调整内存范围

通过 tcp_mem 配置完成一般情况下这些值是在系统启动时根据系统内存数量计算得到的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/59325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Omni Recover for Mac(专业的iPhone数据恢复软件)

Omni Recover for Mac是一款专业的Mac数据恢复软件,能够帮助用户快速找回被误删除、格式化、病毒攻击等原因造成的文件和数据,包括图片、视频、音频、文档、邮件、应用程序等。同时,Omni Recover for Mac还具有数据备份和清理功能&#xff0c…

如何写一个外设驱动?

我的圈子: 高级工程师聚集地 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强企业! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! …

【单片机】UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB、SD卡、1-WIRE、Ethernet等常见通信方式

在单片机开发中,UART、I2C、RS485等普遍在用,这里做一个简单的介绍 UART通用异步收发器 UART口指的是一种物理接口形式(硬件)。 UART是异步(指不使用时钟同步,依靠帧长进行判断),全双工(收发…

【面试专题】Spring篇①

📃个人主页:个人主页 🔥系列专栏:Java面试专题 目录 1.你知道 Spring 框架中有哪些重要的模块吗? 2. 谈谈你对 IOC 的认识。 3. 谈谈你对 AOP 的认识。 4.在实际写代码时,有没有用到过 AOP?用…

iOS开发Swift-1-Xcode创建项目

1.创建项目 双击Xcode App,选择Create a new Xcode project。 选择创建一个iOS普通的App项目。选择Single View App,点击Next。 填写项目名,组织名称等,点击next。 选择好文件的存储路径,点击create。 2.为前端添加组件…

学习笔记|认识数码管|控制原理|数码管实现0-9的显示|段码跟位码|STC32G单片机视频开发教程(冲哥)|第九集:数码管静态显示

文章目录 1.认识数码管2.控制原理十进制转换为任意进制其它进制转十进制 3.数码管实现0-9的显示1.用数组定义0-9的内码段码跟位码的区别2.尝试用延时实现0-9的循环显示3.用按键控制数字的加或者减。 总结课后练习: 1.认识数码管 数码管按段数可分为七段数码管和八段…

leetcode189. 轮转数组

题目: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例: 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2…

PowerDesigner学习笔记

备注:文章主要对概念数据模型进行深入分析 1.对各种模型图初步认识 1.1.概念数据模型 (CDM) (Conceptual Data Model) 对数据和信息进行建模,利用实体-关系图(E-R图)的形式组织数据,检验数据设计的有效性和合理性。 …

【数据结构-链表-01】反转链表

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

多个开源姿态检测模型项目,上手即用,实测可行!

编辑:OAK中国 项目来源:oakchina.cn 喜欢的话,请多多👍⭐️✍ ▌前言 Hello,大家好,这里是OAK中国,我是助手君。 我发现今年有不少朋友都想做姿态检测,正好我们也有不少客户做过这…

结构体(个人学习笔记黑马学习)

1、结构体的定义和使用 #include <iostream> using namespace std; #include <string>struct Student {string name;int age;int score; }s3;int main() {//1、struct Student s1;s1.name "张三";s1.age 18;s1.score 100;cout << "姓名&a…

Python中小数据池知识最详细教程

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 话不多说&#xff0c;直接开搞&#xff0c;如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 一、id&#xff0c;is&#xff0c; 在Python中&#xff0c;id是什么&#xff1f; id是内存地址&#xff0c;比如你利用i…

【Unity小技巧】手戳一个简单易用的游戏UI框架(附源码)

文章目录 前言整套框架分为三大部分素材效果框架代码调用源码参考完结 前言 开发一款游戏美术成本是极其高昂的&#xff0c;以我们常见的宣传片CG为例&#xff0c;动辄就要成百上千万的价格&#xff0c;因此这种美术物料一般只会放在核心剧情节点&#xff0c;引爆舆论&#xf…

生产环境部署与协同开发 Git

目录 一、前言——Git概述 1.1 Git是什么 1.2 为什么要使用Git 什么是版本控制系统 1.3 Git和SVN对比 SVN集中式 Git分布式 1.4 Git工作流程 四个工作区域 工作流程 1.5 Git下载安装 1.6 环境配置 设置用户信息 查看配置信息 二、git基础 2.1 本地初始化仓库 ​编辑…

Java 中数据结构LinkedList的用法

LinkList 链表&#xff08;Linked list&#xff09;是一种常见的基础数据结构&#xff0c;是一种线性表&#xff0c;但是并不会按线性的顺序存储数据&#xff0c;而是在每一个节点里存到下一个节点的地址。 链表可分为单向链表和双向链表。 一个单向链表包含两个值: 当前节点…

创新指南|CEO如何应对生成式AI带来的4大颠覆创新机遇

生成式AI是一种快速发展的颠覆式创新&#xff0c;可以帮助企业创新商业模式、提高效率和解锁商业价值。本研究介绍如何应对生成式AI技术带来的挑战和机遇&#xff0c;以及如何先发利用这种技术来超越竞争和组织创造力和效率。如果您想了解更多关于生成式AI的企业创新战略&#…

【C++深入浅出】初识C++下篇(auto关键字、范围for、nullptr指针)

目录 一. 前言 二. auto关键字 2.1 auto的引入 2.2 auto简介 2.3 auto的使用细则 2.4 auto不能推导的场景 三. 基于范围的for循环(C11) 3.1 范围for的语法 3.2 范围for的原理 3.3 范围for的使用条件 四. 指针空值nullptr(C11) 一. 前言 上期我们介绍了c新增的两个重…

网络基础知识socket编程

目录 网络通信概述网络互连模型&#xff1a;OSI 七层模型TCP/IP 四层/五层模型数据的封装与拆封 IP 地址IP 地址的编址方式IP 地址的分类特殊的IP 地址如何判断2 个IP 地址是否在同一个网段内 TCP/IP 协议TCP 协议TCP 协议的特性TCP 报文格式建立TCP 连接&#xff1a;三次握手关…

服务器端使用django websocket,客户端使用uniapp 请问服务端和客户端群组互发消息的代码怎么写的参考笔记

2023/8/29 19:21:11 服务器端使用django websocket,客户端使用uniapp 请问服务端和客户端群组互发消息的代码怎么写 2023/8/29 19:22:25 在服务器端使用Django WebSocket和客户端使用Uniapp的情况下&#xff0c;以下是代码示例来实现服务器端和客户端之间的群组互发消息。 …

前端加springboot实现Web Socket连接通讯以及测试流程(包括后端实现心跳检测)

【2023】前端加springboot实现Web Socket连接通讯&#xff08;包括后端实现心跳检测&#xff09; 前言一、Web Socket 简绍1 为什么用 websocket&#xff1f; 二、代码实现1、前端&#xff08;html&#xff09;1.1、无前端向后端发送消息1.2、有前端向后端发送消息 2、后端具体…