vlambda博客
学习文章列表

TCP协议可靠性保证知识点总结

1、校验和。将整个数据分成多个数据包发送,各段相加取反得到的和,放在报文首部,接收方收到信息后相同操作,比较校验和,相同则代表接收到了完整的信息。


2、序列号。每个数据包都有顺序的序列号。


3、确认应答(ACK)。接收方收到一个数据包,序列号=x,返回ACK=x+1,发送方可以知道x数据包已经发送成功。


4、超时重传。数据包发送一段时间后没有收到ACK,就重传。一段正常的数据包从发送到接到ACK这段时间叫RTT,而超时重传的时间RTO>RTT。以500ms为单位,1*500、2*500、4*500的间隔重发。超过一定次数仍不成功,视为网络或接收方出现问题,关闭连接。


5、连接管理。三次握手、四次挥手。


6、流量控制。ACK会带上接收方缓冲区的大小,发送方据此调整发送的数据量。如果接收方缓冲区满,则停止发送,但会定期发送窗口探测数据包,以便获取接收方新的缓冲区大小。


7、拥塞控制。

慢启动。初始化拥塞窗口cwnd=1,初期发送数据时,取cwnd与接收方返回的缓冲窗口大小中最小的来发送数据包。每接到一个ACK则cwnd+1。由此可推:

1、cwnd=1,发送数据包1,接到ACK,cwnd=1+1=2。

2、cwnd=2,发送数据包2,接到ACK,cwnd=2+2=4。

3、cwnd=4,发送数据包4,接到ACK,cwnd=4+4=8。

可以看到cwnd是指数级增长。


拥塞避免。当cwnd增长到慢启动阈值(ssthress)后,不再指数级增长,变成线性增长。

cwnd=cwnd+1/cwnd。

一旦发生网络拥堵,比如数据包超时重传了,ssthress=cwnd/2,cwnd=1,重新慢启动。


快重传&快恢复。在现实情况中,因为网络抖动、接收端主机等问题,导致某个数据包丢失,或者ACK丢失的情况,相对于整个网络拥塞还是比较常见的。如果因为一个数据包的丢失,重启慢启动,对性能影响太大,所以有了快重传&快恢复。


快重传启动时机。发送方的数据包肯定是顺序发送,但走IP协议传输时是乱序的,并且因为网络、路由等原因,接收方收到的数据包必定是乱序的。比如没收到数据包3,先收到了数据包4,此时接收方会返回一个冗余ACK告知发送方没有收到3。一般认为如果发送方收到3个相同的冗余AKC,则代表此数据包极大可能丢了,此时启动快重传,重发数据包3。


相应的这种情况肯定不是网络拥塞,没必要重启慢启动,执行快恢复即可,即ssthresh=cwnd,cwnd=cwnd/2,不再从1开始。


再简单说一下滑动窗口

发送方将发送的数据包按序排成队列,分成四种类型。

1、已发送&已确认。

2、已发送&未确认。

3、待发送。

4、不发送。

前面我们说了,发送多少数据包是由cwnd和接收方缓冲区窗口中最小值决定的。所以2&3的多少是由cwnd决定的,假设cwnd现在是固定的,那么当2中一个包接到ACK了,则4中一个数据包就可以变为3,这么看来,就好像cwnd这个窗口向后“滑动”了。