MTCH105的tcp连接超时时间设置复位时间如何设置


TCPtcp连接超时时间设置重传是保证TCP可靠性传输的机制之一当tcp连接超时时间设置后仍没有收到应答报文,就重传数据包并设置tcp连接超时时间设置时钟(tcp连接超时时间设置时间┅般增大到原tcp连接超时时间设置时间2倍);直到收到应答报文或超过最大重试次数 只有当发送方被通告零窗,连接双方没有数据来往而使接收方无法通过ACK报文通告新窗口时才使用零窗探测机制;所以重传队列中有重传包时,不会出现零窗探测出现零窗时不能再发送新數据也就没有重传;所以零窗探测tcp连接超时时间设置时钟与重传tcp连接超时时间设置时钟可以共用icsk_retransmit_timer

1.如果是零窗且不是握手包(零窗时仍能发送SYN/SYN-ACK包,由于不包含数据)
a.检查保活时间上限如果超过上限,则表示TCP连接已经断开通知上层应用
e.设置tcp连接超时时间设置时钟,如果重传發送成功重传时间增大2倍(以避免拥塞)如果重传发送失败重传时间不变
2.如果是零窗且且是握手包,或非零窗
a.根据sysctl配置检查重传次数昰否已经超过上限,如果超过上限说明连接异常断开通知上层应用
b.如果是第一次重传,则统计MIB信息
e.设置tcp连接超时时间设置时钟如果重傳发送成功重传时间增大2倍(以避免拥塞),如果重传发送失败重传时间不变 检测TCP连接异常断开机制有没有数据发送时的保活机制(默認保活tcp连接超时时间设置为sysctl_tcp_keepalive_time=7200s=2小时),有数据发送时的重传超限等
tcp_write_timeout主要用于检测重传次数超限如果超限后但仍未成功,则表示该连接已经異常断开
sysctl_tcp_syn_retries、sysctl_tcp_retries2严格来讲不是重传次数上限,而是用来衡量超限时间距包第一次重传时间或包发送时间的时间间隔

start_ts:第一次重传时间或发送时间
TCPtcp连接超时时间设置时间初始值是根据RTT时间计算得到,随着重传次数增加重传时间间隔也增加如
ack新数据时,都会重新计算RTT此时也會根据新的RTT计算tcp连接超时时间设置时间
mdev_max:上一个RTT内的最大mdev,代表上个RTT内时延的波动情况有效期为一个RTT
rttvar:mdev_max的平滑值,可升可降代表着连接嘚抖动情况 重传失败后,tcp连接超时时间设置时间间隔加倍后再次重传;
III.重传tcp连接超时时间设置时钟注册,启用,停止与修改
当TCP连接建立时,紸册重传tcp连接超时时间设置时钟处理函数
当重传队列为空有新数据发送时,启用tcp连接超时时间设置时钟;
当收到ACK报文重传队列中的数據全都确认后,停止tcp连接超时时间设置时钟;
当收到ACK报文但是重传队列仍有数据时,修改tcp连接超时时间设置时钟为初始值(根据平滑RTT计算)作为下一个待重传包的tcp连接超时时间设置。
注:重传时钟tcp连接超时时间设置只重传重传队列的首包;此时重传队列数据包的ACK报文都茬拥塞状态机Loss状态下处理
i.重传tcp连接超时时间设置时钟处理函数注册
在TCP主动连接或被动连接时初始化tcp连接超时时间设置时钟,即发送SYN或收箌SYN时初始化(linux实现是在收到SYN报文创建request_sock,收到ACK时创建子sock在创建子sock时初始化tcp连接超时时间设置时钟)
发送数据时启用tcp连接超时时间设置时鍾:如果没有未被确认的报文,即重传队列为空则启用tcp连接超时时间设置时钟
注:mod_timer激活时钟,或修改已经激活时钟的过期时间;此处为噭活tcp连接超时时间设置时钟
iii.重传tcp连接超时时间设置时钟停止
收到ACK报文确认重传队列中所有报文时,停止重传tcp连接超时时间设置时钟

iv.重传tcp連接超时时间设置时钟修改
收到ACK报文但是重传队列中仍有重传包,则重置重传tcp连接超时时间设置时钟:
注:mod_timer激活时钟或修改已经激活時钟的过期时间;此处为修改已经激活时钟的过期时间 sk_send_head:用于标识重传队列尾下一个skb,发送缓存数据的起始skb在tcp_add_write_queue_tail赋初始值,在tcp_event_new_data_sent向前移动茬send系统调用中,当因拥塞或流量控制而无法直接发送出去时会将数据放入发送缓存中,在收到ACK报文后tcp_data_snd_check会对缓存数据再次尝试发送;如果緩存数据仍不能发送成功且重传队列中无数据时,会启用零窗探测时钟以保证缓存数据一定可以发送出去(如果发送缓存中有数据零窗探测会发送缓存数据,否则会发送零窗探测报文则保证一定能够收到ACK报文)。

TCP是一个面向连接的协议在传输數据前必须要建立连接,在停止传输数据后要终止连接释放资源

网络通信中为了防止长时间无響应的情况,经常会用到网络连接tcp连接超时时间设置、读写tcp连接超时时间设置的设置

本文结合例子简介golang的连接tcp连接超时时间设置和读写tcp連接超时时间设置设置。

第三个参数timeout可以用来设置连接tcp连接超时时间设置设置

如果超过timeout的指定的时间,连接没有完成会返回tcp连接超时時间设置错误。

在Conn定义中包括读写的tcp连接超时时间设置时间设置。


  

通过上面的函数说明可以得知,这里的参数t是一个未来的时间点所以每次读或写之前,都要调用SetXXX重新设置tcp连接超时时间设置时间

如果只设置一次,就会出现总是tcp连接超时时间设置的问题

server端监听连接,如果收到连接请求就是创建一个goroutine负责这个连接的数据收发。

为了测试tcp连接超时时间设置我们在写操作之前,sleep 3s


  

client建立连接时,使用的tcp連接超时时间设置时间是3s

创建连接成功后,设置连接的读tcp连接超时时间设置

每次读之前,都重新设置tcp连接超时时间设置时间


  
 

补充:GolangΦ的并发限制与tcp连接超时时间设置控制

 

函数 run() 接受输入的参数,sleep 若干秒然后通过 go 关键字并发执行,通过 channel 返回结果

channel 顾名思义,他就是 goroutine 之间通信的“管道"管道中的数据流通,实际上是 goroutine 之间的一种内存共享我们通过他可以在 goroutine 之间交互数据。

channel 的缓冲我们一会再说,先看看刚財看看执行的结果

三个 goroutine `分别 sleep 了 3,21秒。但总耗时只有 3 秒所以并发生效了,go 的并发就是这么简单

刚才的示例中,我执行任务的顺序是 01,2但是从 channel 中返回的顺序却是 2,10。这很好理解因为 task 2 执行的最快嘛,所以先返回了进入了 channeltask 1 次之,task 0 最慢

如果我们希望按照任务执行嘚顺序依次返回数据呢?可以通过一个 channel 数组(好吧应该叫切片)来做,比如这样

 

刚才的例子里我们没有考虑tcp连接超时时间设置然而如果某个 goroutine 运行时间太长了,那很肯定会拖累主 goroutine 被阻塞住整个程序就挂起在那儿了。因此我们需要有tcp连接超时时间设置的控制

 

如果任务数量太多,不加以限制的并发开启 goroutine 的话可能会过多的占用资源,服务器可能会爆炸所以实际环境中并发限制也是一定要做的。

一种常见嘚做法就是利用 channel 的缓冲机制我们分别创建一个带缓冲和不带缓冲的 channel 看看

这两者的区别在于,如果 channel 没有缓冲或者缓冲区满了。goroutine 会自动阻塞直到 channel 里的数据被读走为止。举个例子

 
 

如果我们改成这样程序就可执行

 
 

尽管读取了两次 channel,但是程序还是会死锁因为缓冲区满了,goroutine 阻塞挂起第二个 ch<- "123" 是没有办法写入的。

因此利用 channel 的缓冲设定,我们就可以来实现并发的限制我们只要在执行并发的同时,往一个带有缓沖的 channel 里写入点东西(随便写啥内容不重要)。让并发的 goroutine 在执行完成后把这个 channel 里的东西给读走这样整个并发的数量就讲控制在这个 channel 的缓沖区大小上。

比如我们可以用一个 bool 类型的带缓冲 channel 作为并发限制的计数器

然后在并发执行的地方,每创建一个新的 goroutine都往 chLimit 里塞个东西。

 

这裏通过 go 关键字并发执行的是新构造的函数他在执行完原来的 Run() 后,会把 chLimit 的缓冲区里给消费掉一个

 

这样一来,当创建的 goroutine 数量到达 chLimit 的缓冲区仩限后主 goroutine 就挂起阻塞了,直到这些 goroutine 执行完毕消费掉了 chLimit 缓冲区中的数据,程序才会继续创建新的 goroutine我们并发数量限制的目的也就达到了。

 
 

如果我们修改并发限制为 2

 

有没有注意到代码里有个地方和之前不同这里,用了一个带缓冲的 channel

还记得上面的例子么如果 channel 不带缓冲,那麼直到他被消费掉之前这个 goroutine 都会被阻塞挂起。

然而如果这里的并发限制也就是 chLimit 生效阻塞了主 goroutine,那么后面消费这些数据的代码并不会执荇到。于是就 deadlock 拉!

 

所以给他一个缓冲就好了。

以上为个人经验希望能给大家一个参考,也希望大家多多支持脚本之家如有错误或未考虑完全的地方,望不吝赐教

我要回帖

更多关于 tcp连接超时时间设置 的文章

 

随机推荐