前文中细讲了TCP协议的报文首部格式与连接管理,属于TCP协议的基础建设。TCP的真正强大之处在建立于这两点基础之上提供的高质量服务:可靠传输、流量控制、拥塞避免。
一、TCP可靠传输
可靠传输的话题,在数据链路层就已经得到思考与设计,TCP采用的策略与其十分类似:
1)TCP是面向字节流的传输方式,TCP将需要发送的报文以字节流的方式放进TCP缓存中,并每次向IP中传递不定大小的字节流,称为报文段或段
2)TCP发出一个报文段后,启动一个定时器,若在定时器到时前,没有收到确认,则重发该报文段。
3)TCP通过校验和来检验首部与数据是否发生错误。若是,则丢弃该报文,并不向源套接字发送确认,等待其重传。
4)通过IP协议传递过来的数据报很可能会时序到达。TCP协议根据序号可以将这些数据重新排序,最终以正确的顺序交给应用层。
5)TCP协议还会丢弃IP数据报传过来的重复数据。
二、TCP流量控制
流量控制是指,当服务器端数据发送速率过快时,存在数据淹没的风险,客户端需要做出调整,降低服务器端的数据发送速率。
TCP的流量控制依靠设置TCP报文首部中的窗口字段来完成。
TCP报文窗口字段,决定了客户端接收缓存的大小,通过调整窗口字段,服务器将得知客户端预期接收的字节流大小,并随之调整发送速率。
三、TCP拥塞避免
拥塞避免常易与流量控制混淆,但两者并不相同。
流量控制是解决由发送方数据发送过快而接收方接收不过来问题的方法,作用于两台主机之间的数据传输,是局部性的。
拥塞避免是解决全局网络下,由于传输数据报过多,导致带宽不够、资源不足的问题,用于调控全局网络,是宏观性的。
TCP拥塞避免主要运用以下算法:
1.慢启动
慢启动的思想是:TCP连接,发送方一开始只发送少量报文(如1),先探测网络拥塞程度,再由小到大(每次加倍)地增大拥塞窗口cwnd大小。
为了避免cwnd增长得过大,引起网络拥塞,还需设置一个慢开始门限ssthreash,
当cwnd<ssthread,使用慢启动算法
当cwnd>ssthread,使用拥塞避免算法
当cwnd=ssthread,随机选用慢启动算法与拥塞避免算法
2.拥塞避免
当cwnd>ssthread时,cwnd不能再按加倍增长,而要改成加法增长(如每次加一)
若在慢开始或拥塞避免阶段,发送方判定发生了网络拥塞,就把慢开始门限设置为出现拥塞时cwnd的一半,然后将cwnd设为一,重新开始慢开始算法。
以上是慢开始+拥塞避免是传统方法,后来1990年,科学家又开发出了新的一套拥塞避免算法:快重传+快恢复
3.快重传
快重传要求接收方在收到一个失序的报文段后,就立即发出重复确认,而非等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。
4.快恢复
快恢复有以下两个要点:
-
当发送方连续收到三个重复确认时,执行“乘法减小”算法,把ssthreath门限减小。但是接下去并不执行慢开始算法
-
发送方认为若网络出现拥塞情况,是不可能收到好几个重复的确认,因此判定网络并未拥塞。所以此时不执行慢开始,而是将cwnd设置为ssthreash的大小,然后执行拥塞避免算法
发送方认为若网络出现拥塞情况,是不可能收到好几个重复的确认,因此判定网络并未拥塞。所以此时不执行慢开始,而是将cwnd设置为ssthreash的大小,然后执行拥塞避免算法