特点
- 面向连接(可靠的连接建立和连接关闭)
- 点对点通信(一对一)
- 可靠的
- 面向字节流(把上层协议的数据当成字节传输)
- 全双工通信
采用的技术
- 排序技术(处理分组重复和乱序)
- 重传技术(处理分组丢失)
- 避免分组重复的技术
- 流量控制(机器间的速度不一致)
- 拥塞控制(网络延迟)
1.排序技术
分组
为每一个分组附加一个序号
接收方保存
- 当前按顺序收到的最后一个分组的序号
- 乱序到达的分组列表
接收方执行
- 如果分组是所期待的下一个分组,递交给上一层协议,并检查乱序分组列表中有没有可以继续递交的分组;
- 如果是乱序到达的分组,添加到乱序分组列表
- 如果是重复分组,丢弃
2.重传技术
发送方发送分组的同时启动一个计时器,如果在计时器超时之前,还未收到来自接收方的ACK确认报文,发送方将发送该分组的副本并再次启动计时器
3.避免分组重复的技术
问题:较早的连接中的分组可能在未来的连接中被接收
解决:用唯一的ID标记每一次会话(连接),并且保证在很长一段时间内(如几小时)都不重复使用相同的ID
4.流量控制
问题:速度快的计算机发送太多数据造成速度慢的计算机过载
解决:滑动窗口。接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度
知乎·TCP协议的滑动窗口具体是怎样控制流量的?
ACK报文包含两个非常重要的信息:
1. 接收方期望接收到的下一字节的序号n。
- 该n代表接收方已经接收到了前n-1字节数据,此时如果接收方收到第n+1字节数据而不是第n字节数据,接收方是不会发送序号为n+2的ACK的。
- 举个例子,假如接收端收到1-1024字节,它会发送一个确认号为1025的ACK,但是接下来收到的是2049-3072,它是不会发送确认号为3072的ACK,而依旧发送1025的ACK。
2. 接收方当前的窗口大小m。
- 如此发送方在接收到ACK包含的这两个数据后就可以计算出还可以发送多少字节的数据给对方。
- 假定当前发送方已发送到第x字节,则可以发送的字节数就是y=m-(x-n)。这就是滑动窗口控制流量的基本原理。
假设发送方和接收方同意滑动窗口的大小为5个分组。
(1)发送方提取数据填充这5个分组,并发送分组的副本;
(2)此时最多可以发送5个分组,发送1个分组后,继续发送剩余4个分组;
(3)只有在收到来自接收方的ACK确认报文之后,发送方才会丢弃该分组。此处收到第一个分组的ACK,可以丢弃第一个分组,窗口中剩下4个分组,还能再发送一个分组。
5.拥塞控制
TCP利用分组延迟的变化来作为对网络拥塞的测量,通过减小重传数据的速率来应对网络拥塞。实际上,TCP不是直接改变传输速率,而是通过减小窗口的大小,来降低速率。
拥塞窗口
接收方通告一个接收窗口大小(接收缓冲区的大小),发送方可以在接收到ACK之前填满接收窗口
*窗口分为滑动窗口和拥塞窗口
拓展链接:TCP的滑动窗口与拥塞窗口
知乎·既然有了滑动窗口,为什么还要有等同于滑动窗口的拥塞窗口?
慢开始
(开始一个新连接)
发送方先发送一个报文,如果一个ACK确认报文到达,TCP就把发送的数据量加倍,即发送两个报文。如果对应的两个ACK也到达了,就发送四个报文,以此类推,直到TCP正在发送的数据量等于接收窗口大小的一半为止。之后数据量改为线性增长,每次加一。
(出现报文丢失时)
如果发送方超过一定时间没有收到ACK确认报文,说明报文丢失,出现网络拥塞,此时将窗口大小设置为1,重新进行慢开始算法。
参考链接:TCP协议概述