TCP Thin-Stream连接

2023-12-19 09:48
文章标签 连接 tcp stream thin

本文主要是介绍TCP Thin-Stream连接,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Thin-stream属性,意味着应用程序以很低的速率发送数据,致使TCP等传输协议的重传机制不能有效的运行。一些场景(类似于在线游戏,控制系统,股票交易等)中,用户体验取决于数据的发送时延,报文丢失对于服务质量来说是灾难性的。极大的时延是由于TCP依赖于应用程序新的报文的发送,进而通过快速重传来启动丢失报文的重传,而不用等待较长时间的RTO超时。

以上提到的时间敏感的交互应用,通常是会产生thin-stream,并且在生命期内一直保持此流量模型。这将导致TCP的高延时。

为了降低报文丢失时的应用层延时,提出了一系列的应对机制。简单来说,如果内核检测到thin-stream,将按如下方式修改重传机制:

1) 在接收到第一个dupACK时,启动快速重传;
2) 不执行指数级退避。

注意,只有在检测到此连接为thin-stream时,才能应用以上的措施。如果inflight报文少于4个,而传统的快速重传需要3个重复ACK,此情况下将不能触发快速重传,此连接可能经历大的重传延时。通过定义InfightSize阈值4,来确定Thin-stream连接。

既然这些机制是针对时间敏感的应用程序,就需要在应用程序中使用IOCTL选项 TCP_THIN_LINEAR_TIMEOUTS 和 TCP_THIN_DUPACK明确的开启,或者通过sysctl选项tcp_thin_linear_timeouts 和 tcp_thin_dupack开启。前两个是针对连接的开关,而后两个是对整个网络命名空间的开关,默认情况下都是关闭状态。

$ cat /proc/sys/net/ipv4/tcp_thin_linear_timeouts
0
$ cat /proc/sys/net/ipv4/tcp_thin_dupack
0

Thin-Stream配置

如下函数do_tcp_setsockopt,选项TCP_THIN_LINEAR_TIMEOUTS设置套接口成员变量thin_lto,取值为0或者1。选项TCP_THIN_DUPACK目前没有使用。

static int do_tcp_setsockopt(struct sock *sk, int level,int optname, char __user *optval, unsigned int optlen)
{switch (optname) { case TCP_THIN_LINEAR_TIMEOUTS:if (val < 0 || val > 1)err = -EINVAL;elsetp->thin_lto = val;break;case TCP_THIN_DUPACK:if (val < 0 || val > 1)err = -EINVAL;break;

Thin-stream判断

如下函数tcp_stream_is_thin,如果inflight报文数量小于阈值4,并且不是位于初始的slowstart阶段,判定此连接为thin-stream。

/* Determines whether this is a thin stream (which may suffer from* increased latency). Used to trigger latency-reducing mechanisms.*/
static inline bool tcp_stream_is_thin(struct tcp_sock *tp)
{return tp->packets_out < 4 && !tcp_in_initial_slowstart(tp);
}
static inline bool tcp_in_initial_slowstart(const struct tcp_sock *tp)
{return tp->snd_ssthresh >= TCP_INFINITE_SSTHRESH;
}

Thin-stream超时处理

如下函数tcp_retransmit_timer,如果应用层通过setsockopt开启了thin_lto,或者在此网络命名空间全局开启了线性超时(tcp_thin_linear_timeouts),并且内核确认了此连接为Thin-stream,将不进行退避处理,由函数__tcp_set_rto根据当前的SRTT设置RTO值。并且将icsk_backoff计数清零,这样在此连接上进行窗口探测等操作时,也不执行退避操作。

void tcp_retransmit_timer(struct sock *sk)
{icsk->icsk_backoff++;icsk->icsk_retransmits++;out_reset_timer:/* If stream is thin, use linear timeouts. Since 'icsk_backoff' is* used to reset timer, set to 0. Recalculate 'icsk_rto' as this* might be increased if the stream oscillates between thin and thick,* thus the old value might already be too high compared to the value* set by 'tcp_set_rto' in tcp_input.c which resets the rto without* backoff. Limit to TCP_THIN_LINEAR_RETRIES before initiating* exponential backoff behaviour to avoid continue hammering* linear-timeout retransmissions into a black hole*/if (sk->sk_state == TCP_ESTABLISHED &&(tp->thin_lto || net->ipv4.sysctl_tcp_thin_linear_timeouts) &&tcp_stream_is_thin(tp) &&icsk->icsk_retransmits <= TCP_THIN_LINEAR_RETRIES) {icsk->icsk_backoff = 0;icsk->icsk_rto = min(__tcp_set_rto(tp), TCP_RTO_MAX);} else {/* Use normal (exponential) backoff */icsk->icsk_rto = min(icsk->icsk_rto << 1, TCP_RTO_MAX);}     inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,tcp_clamp_rto_to_user_timeout(sk), TCP_RTO_MAX);

但是,如果在Thin-stream连接上线性重传了6次之后,内核将启用指数级别的退避处理,变量icsk_rto表示的时长每次增大一倍。

/* TCP thin-stream limits */
#define TCP_THIN_LINEAR_RETRIES 6       /* After 6 linear retries, do exp. backoff */

内核版本 5.0

这篇关于TCP Thin-Stream连接的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/511743

相关文章

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

java如何通过Kerberos认证方式连接hive

《java如何通过Kerberos认证方式连接hive》该文主要介绍了如何在数据源管理功能中适配不同数据源(如MySQL、PostgreSQL和Hive),特别是如何在SpringBoot3框架下通过... 目录Java实现Kerberos认证主要方法依赖示例续期连接hive遇到的问题分析解决方式扩展思考总

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

oracle如何连接登陆SYS账号

《oracle如何连接登陆SYS账号》在Navicat12中连接Oracle11g的SYS用户时,如果设置了新密码但连接失败,可能是因为需要以SYSDBA或SYSOPER角色连接,解决方法是确保在连接... 目录oracle连接登陆NmOtMSYS账号工具问题解决SYS用户总结oracle连接登陆SYS账号

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

java Stream操作转换方法

《javaStream操作转换方法》文章总结了Java8中流(Stream)API的多种常用方法,包括创建流、过滤、遍历、分组、排序、去重、查找、匹配、转换、归约、打印日志、最大最小值、统计、连接、... 目录流创建1、list 转 map2、filter()过滤3、foreach遍历4、groupingB

Xshell远程连接失败以及解决方案

《Xshell远程连接失败以及解决方案》本文介绍了在Windows11家庭版和CentOS系统中解决Xshell无法连接远程服务器问题的步骤,在Windows11家庭版中,需要通过设置添加SSH功能并... 目录一.问题描述二.原因分析及解决办法2.1添加ssh功能2.2 在Windows中开启ssh服务2