Linux性能学习(4.4):网络_TCP三次握手内核参数优化

文章目录

  • 1 三次握手
  • 2 参数优化
    • 2.1 tcp_syn_retries--->SYN重传次数
    • 2.2 tcp_synack_retries--->ACK重传次数
    • 2.3 tcp_retries2--->发送数据失败重传次数
    • 2.4 TCP keepalive--->保活机制
    • 2.5 tcp_max_syn_backlog/somaxconn--->半/全连接队列长度
    • 2.6 tcp_syncookies--->cookie机制
    • 2.7 tcp_abort_on_overflow--->RST复位
    • 2.8 tcp_fastopen--->绕过三次握手
  • 3 总结

参考资料:
1. 字节一面:服务端挂了,客户端的 TCP 连接还在吗?

在客户端和服务端建立连接时候,会经过3次交互,才能正式建立一个连接。这篇大致介绍下三次握手的交互过程以及如何优化。

1 三次握手

在这里插入图片描述

  • 第一次交互:Client会发送一个SYN包给到Server,SYN包中包含了Client的一个序列号J,此时Client的状态为SYN_SENT(请求连接状态);
  • 第二次交互:Server收到SYN包后,会返回一个ACK包,用于通知Client收到了SYN包,然后也会给Client发送一个SYN包,用于通知Client自己的序列号为K,此时Server的状态为SYN_RCVD(表示Server已经收到Client的SYN报文);
  • 第三次交互:Client收到Server的ACK+SYN之后,会给Server再次发送一个ACK包,表示已经收到SYN包了,此时Client处于ESTABLISHED状态,Server收到Client的ACK后,也会处于ESTABLISHED状态。

2 参数优化

2.1 tcp_syn_retries—>SYN重传次数

在上面第一次交互时候,Client发送SYN包之后的状态为SYN_SENT,那么此时如果服务器没有收到,即服务端没有返回ACK+SYN报文,会发生什么情况?

如果Client没有收到Server的ACK响应,那么就会多次重传,如果多次重传后,仍然没有收到ACK响应,那么就会返回time out异常。
如下指令查看重传次数:

# cat /proc/sys/net/ipv4/tcp_syn_retries                     
6

重传时的超时时间为,1,2,4,8,16,32,64,逐渐递增,即第一次发送SYN包后,超时1s;进入第1次重传,超时2s;进入第2次重传,超时4s;进入第3次重传,超时8s;进入第4次重传,超时16s;进入第5次重传,超时32s;进入第6次重传,超时64s,上报异常。

因此在某些场景下,如局域网通信,我们可以修改重传次数来减少等待时间,让应用层更快进行处理异常。

2.2 tcp_synack_retries—>ACK重传次数

第二次交互时候,如果Server发送完SYN+ACK,没有收到Client的ACK,又会发生什么情况?
如果没有收到Client的ACK,Server端也会进行重传,重传次数由tcp_synack_retries参数决定。

 # cat /proc/sys/net/ipv4/tcp_synack_retries                  
5

重传时的超时时间为,1,2,4,8,16,32,逐渐递增。

因此在某些场景下,如网络繁忙不稳定,我们可以增大重传次数,减少链路干扰导致的异常。

2.3 tcp_retries2—>发送数据失败重传次数

第三次交互,Client发送完ACK包之后,就处于ESTABLISHED状态,此时如果Server没有收到ACK,就会重传,根据上面的tcp_synack_retries参数,重传5次后,Server断开连接,此时Client端仍然处于ESTABLISHED状态,如果此时Client发送数据,又会发生什么情况?

这种情况下,Server已经没有连接了,肯定是收不到数据的,但是Client不知道,仍然会发送,然后超时,继续发送,超时,重传次数由tcp_retries2 决定。

# cat /proc/sys/net/ipv4/tcp_retries2                        
15

超时时间受内核中TCP_RTO_MAX、TCP_RTO_MIN相关参数限制,15次大约是15分钟,参考链接1:
在这里插入图片描述

2.4 TCP keepalive—>保活机制

如果Client一直不发送数据,那么什么时候才知道Server已经断开了TCP连接?

如果Client没有开启TCP keepalive 机制,那么这种情况下Client就会一直保持TCP连接;如果开启TCP keepalive 机制,那么Client就会定时发送探测报文,根据Server是否回复来得知Server是否断开TCP连接。
相关参数如下:

# cat /proc/sys/net/ipv4/tcp_keepalive_time                  
7200
# cat /proc/sys/net/ipv4/tcp_keepalive_intvl                 
75
# cat /proc/sys/net/ipv4/tcp_keepalive_probes                
9

tcp_keepalive_time为7200s,也就是如果没有任何数据交互,那么就会在7200s之后启动保活,开始发送探测报文;
tcp_keepalive_intvl为75s,表示每次发送的探测报文间隔为75s;
tcp_keepalive_probes为9,也就是9次发送探测报文都没有收到,认为Server已经断开连接,Client就会中断本次连接。
7200+75*9=7875,也就是7875s之后才能真正确认Server已经断开连接。

2.5 tcp_max_syn_backlog/somaxconn—>半/全连接队列长度

在第二次交互中,Server处于SYN_RCV状态,此时处于一个半连接状态,Server会将这个半连接状态的信息放到半连接队列中,如果这个半连接队列满了,那么Server就无法建立新的连接了。

我们可以通过如下指令,查看是否出现半连接队列满的情况:

# netstat -s | grep "SYNs to LISTEN"
332566 SYNs to LISTEN sockets dropped 

如果间隔几秒执行几次,发现这个累加值一直上升,那么说明出现了半连接队列满的情况。

# cat /proc/sys/net/ipv4/tcp_max_syn_backlog                 
128

可以通过调整tcp_max_syn_backlog 的值来修改半连接队列的长度,修改时还需要同步修改somaxconn 的值以及backlog来配合使用。


# cat /proc/sys/net/core/somaxconn 
128

somaxconn表示的是socket监听队列的最大长度,或者说全连接状态队列的长度。
backlog可使用listen 函数的 backlog 参数进行修改。

如果在某些场景下,比如经常处理新的请求的场景,可以修改半连接队列和全连接队列的长度。

2.6 tcp_syncookies—>cookie机制

如果在半连接队列满的情况下,开启了tcp_syncookies,那么Server不会丢弃这个连接,会根据Client的SYN包计算出一个cookie值,将它放到ACK+SYN报文中发送出去,然后收到Client的ACK后,会进行计算验证,如果合法,那么就认为建立连接成功。

# cat /proc/sys/net/ipv4/tcp_syncookies
1

0 表示关闭该功能;1 表示仅当 SYN 半连接队列放不下时,再启用它;2表示无条件开启功能。

2.7 tcp_abort_on_overflow—>RST复位

在第三次交互中,Client发送ACK之后就处于连接状态,而Server收到ACK后会将连接从半连接队列中删除,然后创建新的连接,将其加到全连接队列中。如果此时全连接队列满了,那么就会根据tcp_abort_on_overflow的值进行判定,如果tcp_abort_on_overflow值为0,则丢弃这个ACK;如果值为1,则会回复一个RST复位报文给Client,告诉Client连接已经建立失败,丢弃连接。

# cat /proc/sys/net/ipv4/tcp_abort_on_overflow             
0

2.8 tcp_fastopen—>绕过三次握手

在三次握手中,第三次交互时候,即Client发送ACK回复的时候,ACK中是可以携带HTTP请求的,因此整个交互,是至少需要一个RTT时间(即Client到Server,然后Server到Client的往返时间)才能发送HTTP请求。

问题来了,能否节省这一个RTT时间,进行HTTP请求?

Google提出了TCP fast open方案,使Client可以在第一次交互时候Client发送的SYN报文中直接携带请求,这样就可以节省了一个RTT时间。
具体是分为两个步骤进行的:

  • 第一个步骤:正常的三次握手机制,只不过在Client发送SYN报文时候,包含了Fast Open选项,选项中的Cookie为空,然后支持Fast Open的Server收到SYN报文后,会生成一个cookie,放进ACK+SYN报文中,然后ACK收到报文,缓存cookie到本地。
  • 第二个步骤:如果下次再次向Server建立连接,那么在第一次交互时候,Client发送的SYN报文中包含HTTP请求和第一个步骤中缓存的cookie,Server收到SYN报文后,会对cookie进行验证,如果验证成功,则HTTP请求数据有效,送到对应的处理程序中,如果请求无效则丢弃HTTP请求数据。不管是否有效,都会回复ACK+SYN报文,Client也会再次回复ACK。但是,这种如果有效,那么在第一次交互时候,SYN包中已经携带有效数据了,省了一个RTT时间。
# cat /proc/sys/net/ipv4/tcp_fastopen                        
1

0:关闭1:作为客户端使用 Fast Open 功能2:作为服务端使用 Fast Open 功能3:无论作为客户端还是服务器,都可以使用 Fast Open 功能。
TCP Fast Open 功能需要客户端和服务端同时支持,才有效果。

3 总结

在本篇中,引申出以下几个内核参数,除了tcp_retries2和tcp_keepalive_time外,其它内核参数均是和三次握手相关的。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

离散化的两种实现方式【sort或者map】

离散化 定义 把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。 适用范围:数组中元素值域很大,但个数不是很多。 比如将…

PHP8的表达式-PHP8知识详解

表达式是 PHP 最重要的基石。在 PHP8中,几乎所写的任何东西都是一个表达式。简单但却最精确的定义一个表达式的方式就是"任何有值的东西"。 最基本的表达式形式是常量和变量。当键入"$a 5",即将值"5"分配给变量 $a。&quo…

C++初阶——拷贝构造和运算符重载(const成员)

目录 1. 拷贝构造函数 1.2 拷贝构造函数特征: 2. 默认拷贝构造函数 2.1 未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝 3. 运算符重载 3.1…

Flink CEP(三)pattern动态更新

线上运行的CEP中肯定经常遇到规则变更的情况,如果每次变更时都将任务重启、重新发布是非常不优雅的。尤其在营销或者风控这种对实时性要求比较高的场景,如果规则窗口过长(一两个星期),状态过大,就会导致重启…

vue-virtual-scroller的使用,展示巨量数据,长列表优化,虚拟列表

一、原理 计算显示区域的高度(或宽度) 和显示区域的起始位置(scrollTop或scrollLeft)根据每个元素的尺寸和总数目,计算出整个列表的高度(或宽度)显示区域的高度(或宽度&#xff09…

基于Orangepi 3 lts 的云台相机

利用orangepi 3 lts 和arduino nano 制作了一个云台相机,可用于室内监控。 硬件: orangepi 3 ,arduino nano ,usb相机,180度舵机两个 WeChat_20230806213004 软件: 整体采用mqtt进行消息的中转。 相机采用python 利用opencv…

LeetCode每日一题Day5——21. 合并两个有序链表

✨博主:命运之光 🦄专栏:算法修炼之练气篇(C\C版) 🍓专栏:算法修炼之筑基篇(C\C版) 🐳专栏:算法修炼之练气篇(Python版) …

第三章 图论 No.2单源最短路之虚拟源点,状压最短路与最短路次短路条数

文章目录 1137. 选择最佳线路1131. 拯救大兵瑞恩1134. 最短路计数383. 观光 dp是特殊的最短路&#xff0c;是无环图&#xff08;拓扑图&#xff09;上的最短路问题 1137. 选择最佳线路 1137. 选择最佳线路 - AcWing题库 // 反向建图就行 #include <iostream> #include…

C++ 类型兼容规则

类型兼容规则是指在需要基类对象的任何地方&#xff0c;都可以使用公有派生类的对象来替代。 通过公有继承&#xff0c;派生类得到了基类中除构造函数和析构函数之外的所有成员。这样&#xff0c;公有派生类实际就具备了基类的所有功能&#xff0c;凡是基类能解决的问题&#x…

vcomp100.dll丢失怎样修复?总结三个修复方法

在使用Windows系统的电脑的过程中&#xff0c;我们有时会遇到一些错误提示&#xff0c;其中之一就是关于vcomp100.dll文件缺失或损坏的问题。我第一次看到这个错误提示时&#xff0c;我并不知道vcomp100.dll是什么文件&#xff0c;也不了解它在电脑中的作用。我猜测它可能是一个…

​币安或面临「美司法部」欺诈指控

作者&#xff1a;维特根斯坦他弟 美国媒体semafor独家报道&#xff0c;知情人士透露&#xff0c;美国司法部正计划对币安提出欺诈指控&#xff0c;但又担心消费者会为此付出的巨大代价。 知情人士表示&#xff0c;联邦检察官担心他们起诉币安&#xff0c;可能会引发该交易所发生…

linux服务器之-nethogs命令

文章目录 NetHogs 工具安装安装依赖包安装epel源安装Nethogs 使用 NetHogs 工具 NetHogs是一个小型的net top工具&#xff0c;不像大多数工具那样拖慢每个协议或者是每个子网的速度而是依照进程进行带宽分组。 安装 安装依赖包 yum install libpcap libpcap-devel epel-rel…

企业架构NOSQL数据库之MongoDB

目录 一、背景描述及其方案设计 (一)业务背景描述 &#xff08;二&#xff09;模拟运维设计方案 二、Mongodb介绍 &#xff08;一&#xff09;nosql介绍 &#xff08;二&#xff09;产品特点 1、存储性 2、 效率性 3、结构 三、安装和配置 &#xff08;一&#xff09…

Statefulset 实战 3

上一部分我们说到如何使用 Statefulset 部署有状态的应用&#xff0c;Statefulset 可以做到部署的 每一个 pod 能够独立的拥有一个持久卷声明和持久卷 之前我们 用 Statefulset 和 ReplicaSet 对比&#xff0c;自然他们是有相似之处和不同之处&#xff0c;不同之处前面的文章已…

【嵌入式环境下linux内核及驱动学习笔记-(18)LCD驱动框架1-LCD控制原理】

目录 1、LCD显示系统介绍1.1 LCD显示基本原理1.1.1 颜色的显示原理&#xff1a;1.1.2 图像的构成 1.2 LCD接口介绍1.2.1 驱动接口 - MCU接口1.2.2 驱动接口 - RGB接口1.2.3 驱动接口 - LVDS接口1.2.4 驱动接口 - MIPI接口1.2.5 RGB / MIPI / LVDS三种接口方式的区别&#xff1a…

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

《MySQL高级篇》十五、其他数据库日志

文章目录 1. MySQL支持的日志1.1 日志类型1.2 日志的弊端 2. 慢查询日志(slow query log)3. 通用查询日志3.1 问题场景3.2 查看当前状态3.3 启动日志3.4 查看日志3.5 停止日志3.6 删除\刷新日志 4. 错误日志(error log)4.1 启动日志4.2 查看日志4.3 删除\刷新日志4.4 MySQL8.0新…

el-table 去掉边框(修改颜色)

原始&#xff1a; 去掉表格的border属性&#xff0c;每一行下面还会有一条线&#xff0c;并且不能再拖拽表头 为了满足在隐藏表格边框的情况下还能拖动表头&#xff0c;修改相关css即可&#xff0c;如下代码 <style lang"less"> .table {//避免单元格之间出现白…

计算机网络(3) --- 网络套接字TCP

计算机网络&#xff08;2&#xff09; --- 网络套接字UDP_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131977544?spm1001.2014.3001.5501 目录 1.TCP 1.服务端接口介绍 1.listen状态 2.accept获取链接 2.客户端接口介绍 2.TCP的服务器…

【TypeScript】TS接口interface类型(三)

【TypeScript】TS接口interface类型&#xff08;三&#xff09; 【TypeScript】TS接口interface类型&#xff08;三&#xff09;一、接口类型二、实践使用2.1 常规类型2.2 设置属性只读 readonly2.3 设置索引签名2.4 设置可选属性2.5 函数类型接口 一、接口类型 TypeScript中的…