重传定时器
解决的问题:由于ACK和报文有可能会在传输过程中丢失,当定时器到期还没有收到对应报文的ACK时,会重传相应报文。
TCP重传定时器的值应该如何设置?
由于路由可能会变,网络的拥塞程度会发生改变,所以一般情况下,我们希望重传定时器的值是变化的,通过测量往返时间(RTT),根据一定的算法来设置TCP重传定时器(RTO)的值。这些算法还没有研究,还不清楚为什么这么计算,若有人知道,欢迎告诉我,不胜感激。
Karn算法
若产生重传,则接收到的ACK是属于第一次还是第二次的呢?这种情况叫做重传混淆问题,在这种情况下,我们无法计算RTO的值,Karn算法可以解决这个问题。当重传发生时,RTO的值不会发生改变,会作为下一次传输报文时重传计数器的值。
在路由表中,TCP存有许多额外的信息,当TCP连接结束时,如果有足够的数据被发送,得到的数据有价值(有衡量标准),并且该条路由不是默认路由,则慢启动权限、平滑RTT、平滑平均差的初始值会存储在路由表中,当新的TCP连接建立时,若路由表中有相关本次连接的值,则会用对应的值初始化相应的值。
TCP可以产生的ICMP错误包括源抑制报文、主机不可达、网络不可达,
BSD(https://baike.baidu.com/item/BSD)处理这些ICMP错误的方式如下:
1、对于源抑制报文,会导致CWND变为1,但慢启动门限值不会发生改变,相当于重置慢启动。
2、对于主机、网络不可达的错误,一般会不予理会,由于这些错误都是暂时的,可能是中途的某个路由器关闭,TCP不会立刻放弃,会不断尝试发送,虽然最后可能会超时导致放弃本次连接。当重传发生时,TCP可以重新打包报文大小,即重传报文的大小不一定与之前的相同,因为TCP是通过数据部分所占的字节数进行认证的,在认证过后,之前乱序到达的报文将会被丢弃。
关于ICMP源抑制的个人理解
当接收主机或是路由器的缓冲区溢出时会发送该报文,请求发送主机降低发送速率,这里的缓冲区指的应该是TCP的缓冲区,不是指滑动窗口,滑动窗口提供的是流量控制,与缓冲区没有关系。
坚持计数器
问题:由于接收方不会重复发送相同的ACK,若滑动窗口值为0,而通知滑动窗口已经开放的ACK丢失了,则会产生一直无法传送数据的尴尬情况。
解决策略当滑动窗口关闭后,坚持计数器一旦到期,则会发送窗口探测器,此时会返回一个记录有当前窗口大小的报文。
糊涂窗口综合征
现象:使用坚持计数器会有一个问题,当接收方通告的窗口很小时,网络上可能出现许多“小报文”。如果发送端为产生数据很慢的应用程序服务(典型的有telnet应用),例如,一次产生一个字节。这个应用程序一次将一个字节的数据写入发送端的TCP的缓存。如果发送端的TCP没有特定的指令,它就产生只包括一个字节数据的报文段,导致网络上出现许多“小报文”。
解决策略:
1、当接收方的滑动窗口大小增加到可以容纳下一个最大报文(有规定最大报文的大小)或是半个接收缓冲区的大小时,接收方才会通告窗口大小。
2、当下列条件有一个为真时,发送方才会发送报文
a、当窗口的大小可以容纳下一个最大报文时。
b、可以发送大小为接收方最大滑动窗口一半的报文时。
c、没有未确认的报文或是禁用Nagle算法时。
c主要作用是防止发送方发生糊涂窗口综合征。原因如下:
考虑c为真的情况。
1、没有未确认的报文,此时不管有没有禁用Nagle算法,都可以发送报文,但这个条件本身就是Nagle发送报文的条件。
2、有未确认的报文,未禁用Nagle算法。Nagle算法本身在一定程度上可以防止产生“小报文”,但在网络传送很快的情况下,Nagle算法的表现往往不尽人意。
保活计数器
问题:由于TCP建立的是一种逻辑连接,若对方主机忽然断电(此时不会发送reset报文),并且很长一段时间本机都没有发送报文,本机不会知道对方已经断点关机,本机的TCP连接可能一直占用本机资源。
解决策略:若在两个小时(TCP/IP协议详解中规定的时间,此为保活计数器的时间)没有收到相应连接的报文,则会发送探测报文,此时接收主机应该处于下列状态之一:
1、接收主机仍在工作,此时会回复一个报文,发送主机会重置保活计数器的值为两小时。
2、接收主机忽然断电,此时不会收到回复报文,75秒后超时重传探测报文,TCP会尝试10次,若均没收到回复,则放弃连接。
3、接收主机重启完毕,此时发送主机会接受到一个reset报文,从而放弃连接。
4、接收主机重启完毕,但此时无法将探测报文发送给接收主机(可能路由发生改变),则同情况二。
一般情况下,当主机正常关闭时,会将当前的TCP连接通过FIN报文正常释放掉。
保活计数器不是TCP定义的规范,原因如下:
1、保活计数器可能会终止一格完美的连接,若链路上的路由器重启导致探测报文暂时无法到达,但双方主机均正常工作,此时会错误的终止连接
2、探测报文会占用带宽。
3、发送探测报文会占用主机资源。
时间等待计时器
即TIME_WAIT阶段的2MSL。