三、TCP几个细节知识点
1.连接建立和释放时的sequence number和ack number
TCP是双工通信,一方再给另一方回ack的时候也同时会发信息
连接建立时,双方会初始化一个sequence序号,a clock-based scheme is used
发送的消息对方收到后,回的ack序号是下一个要收的包的序号
2.TCP滑动窗口的几个细节
(1)Nagle’s algorithm
发送方窗口的大小取决于接收方回的窗口号,但如果有的时候接收方一个一个窗口的挤,发送方就不得不连续发小包,但TCP头和IP头加起来起码20+20字节,这时候数据小传输效率低。那么为了避免发小包,就需要这个技术。Nagle’s algorithm就解决了这个问题。
Nagle’s algorithm发第一个包,然后就不发了,那什么时候接着发呢,两种情况,一种是第一个包的ack回来了,另一种是要么buffer里的包达到了窗口的一半,要么是包达到了最大段长度。这里有一个问题,buffer里的包达到了什么窗口的一半,本来不就打算发窗口大小的包,为什么是达到一半的时发?
这个算法有的时候是不适用的,比如玩游戏,这包不能等啊,这高延迟哪能受得了,这时候要么就禁用掉这个算法,要么就让这个包是push包。
(2)Clark’s solution
接收方的buffer如果每次上层只读一个窗口,那么就会空出来一个窗口,然后通知发送方我空出来窗口了,然后发送方就会发送这一个窗口的包,还是造成了低效,Clark’s solution解决了这个问题。
Clark’s solution会等接收方能够空出来一半buffer或能够空出来最大段长度的时候,在向发送方发ack告诉他窗口大小的改变。
Nagle’s algorithm和Clark’s solution配合使用。
(3)Fast Retransmission(快速重传)
TCP通常是等time out后再重传,但是如果接收方连着回了三个同样的ack,那么发送方就会立即重传。
(4)如何确定RTO(重传计时器)的时间——Jacobson算法
传输层的RTO和链路层的有区别,因为链路层通常是固定的,而传输层不是。
Jacobson算法使用指数加权平均来算环回时间,
SRTT = α х SRTT + (1 – α) х (new sample)
这样可以让环回时间平滑,如下图所示
(5)Karn’s algorithm
但还有一个问题,那就是重传的环回时间则么算呢
上面两种算法分别会出现两种问题,Karn’s algorithm是说不算重传的环回时间,如果重传了那就把RTO乘2