创建socket时会创建传输控制块,之后调用初始化函数对控制块进行初始化,其中包括对定时器的初始化,tcp会调用tcp_init_xmit_timers函数来初始化这些定时器,本文将详细分析tcp_init_xmit_timers函数: 下面为这种情况的函数调用关系: /** * inet_create * |-->sk->sk_prot->init * |-->tcp_v4_init_sock * |-->tcp_init_sock * |-->tcp_init_xm…
1. Nagle算法: 是为了减少广域网的小分组数目,从而减小网络拥塞的出现: 该算法要求一个tcp连接上最多只能有一个未被确认的未完成的小分组,在该分组ack到达之前不能发送其他的小分组,tcp需要收集这些少量的分组,并在ack到来时以一个分组的方式发送出去:其中小分组的定义是小于MSS的任何分组: 该算法的优越之处在于它是自适应的,确认到达的越快,数据也就发哦送的越快:而在希望减少微小分组数目的低速广域网上,则会发送更少的分组: 2. 延迟ACK: 如果tcp对每个数据包都发送一个ack确认…
主要内容:保活定时器的实现,TCP_USER_TIMEOUT选项的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 原理 HTTP有Keepalive功能,TCP也有Keepalive功能,虽然都叫Keepalive,但是它们的目的却是不一样的. 为了说明这一点,先来看下长连接和短连接的定义. 连接的"长短"是什么? 短连接:建立一条连接,传输一个请求,马上关闭连接. 长连接:建立一条连接,传输一个请求,过会儿,又传输若干个请求,最后…
http://blog.csdn.net/zhangskd/article/details/44177475 TCP的Keepalive,目的在于看看对方有没有发生异常,如果有异常就及时关闭连接. 当传输双方不主动关闭连接时,就算双方没有交换任何数据,连接也是一直有效的. 如果这个时候对端.中间网络出现异常而导致连接不可用,本端如何得知这一信息呢? 答案就是保活定时器.它每隔一段时间会超时,超时后会检查连接是否空闲太久了,如果空闲的时间超过 了设置时间,就会发送探测报文.然后通过对端是否响应.响…
可能有这样的备用现实TCP连接:流通过. 也就是说.假设TCP连接的两方都没有向对方发送数据.则在两个TCP模块之间不交换不论什么信息,这意味着我们能够启动一个客户与server建立连接,然后长时间不使用,而连接依旧保持.中间的路由器能够崩溃和重新启动,电话线能够被挂断再连接,但仅仅要两端的主机没有被重新启动.则连接依旧保持建立. 然而,很多时候一个server希望知道客户主机是否崩溃并关机或者崩溃又又一次启动.很多实现提供的保活定时器能够提供这样的能力.保活并非TCP规范中的一部分. 保活定时…
一.简介 之前的内容中我们多次提到延迟ACK(Delayed Ack),延迟ACK是在RFC1122协议中定义的,协议指出,一个TCP实现应该实现延迟ACK,但是ACK不能被过度延迟,协议给出延迟ACK的最大时间为0.5s.如果发送端连续发送最大的数据报文,那么没两个数据报文就需要回复一次ACK.延迟ACK主要目的是等待接收者应用层接收到数据处理后有可能会发送一个响应,这样ACK报文就可以和这个响应报文一起发送了,这样减少了网络中的数据包的同时,也降低了主机的负载处理压力. 二.linux实现概…
TCP一共有四个主要的定时器,前面已经讲到了一个--超时定时器--是TCP里面最复杂的一个,另外的三个是: 坚持定时器 保活定时器 2MSL定时器 其中坚持定时器用于防止通告窗口为0以后双方互相等待死锁的情况:而保活定时器则用于处理半开放连接 1.坚持定时器 坚持定时器的原理是简单的,当TCP服务器收到了客户端的0滑动窗口报文的时候,就启动一个定时器来计时,并在定时器溢出的时候向向客户端查询窗口是否已经增大,如果得到非零的窗口就重新开始发送数据,如果得到0窗口就再开一个新的定时器准备下一次查询.…
一.坚持定时器   1.坚持定时器的由来         TCP通过让接收方指明希望从发送方接受的窗口大小来进行流量控制.设置窗口大小为0可以组织发送方传送数据,直至窗口变为非0为止.         如果接收方向发送方通告了一个为0的接口,然后又向发送方通告了窗口更新,恰好这个确认丢失了,那么接收方等待接收数据,发送方等待允许他继续发送数据的窗口更新,就会形成死锁.为了防止这种死锁,发送方使用一个坚持定时器来周期性地向接收方查询,以便发现窗口是否增大.这些从发送方发出的报文段称为窗口探查.  …
从上一篇示例中我们可以看到在TCP中有一个重要的过程就是决定何时进行超时重传,也就是RTO的计算更新.由于网络状况可能会受到路由变化.网络负载等因素的影响,因此RTO也必须跟随网络状况动态更新.如果TCP过早重传,则可能会向网络中注入很多重复报文,如果过晚重传,则在丢包时候则会影响滑窗前行可能会降低网络利用率.因为TCP在接收到数据后会发送累计的ACK number,因此TCP发送某个系列号的报文后,在接收到覆盖此系列号的ACK报文的时候,测量发送和接收之间的时间,这个测量就叫做RTT采样(RT…
本章介绍保活定时器. 在 TCP 的三握四挥 章节中,我们介绍了 处在 TIME_WAIT 的 2MSL定时器:在 TCP的超时与重传 章节中,我们介绍了 重传定时器:在上一章节中,我们介绍了 防止死锁现象的 坚持定时器. 那么在本章节,我们将介绍 争议颇多的 保活定时器. 保活定时器 一个比较让人惊讶的事实是:可以没有任何数据通过一个空闲的TCP连接,如果TCP连接的双方都没有向对方发送数据,那么在两个TCP模块之间不交换任何信息. 两个应用进程 -客户进程 和 服务器进程 都没有使用应用级的…