包的传输
问题: 假设有3000字节数据,通过tcp进行传输,是如何从A机器传输到B机器的?
TCP传输.png假设现在A机器要发送3000个字节的数据给机器B
- 首先数据从A的应用层将3000字节的数据给到传输层
- A传输层接到后,A和B建立三次握手,过程中协商到MSS大小1460, B窗口大小2920
- 更具协商得到的信息, A将3000字节切分为3个包,大小分别为1460,1460, 80
- 由于B的窗口大小是2920,所以一次最大可以传输2个包,第三个包80要单独传送
- A将2个包扔给网络层
- A将数据经过网络层,数据链路层传输给B
- B从网络层读取数据到传输层
- 重复5到7的步骤,直到3个包传输完毕,然后将数据给到应用层
这里2到4体现了,传输层的“控制”机制
滑动窗口 可以参考这篇文章理解
- 为什么要有滑动窗口?解决了什么问题?
- 滑动窗口的运作原理是什么?
- 数据传输出错了怎么处理?如何进行的重传?A的缓存有什么作用?
- A的速度快,B的速度慢,A 向B传输,B出现了0窗口怎么办?会有什么影响吗?
- 窗口为社么会不停的调整大小?
- 什么是集中确认?出现在那个场景下?
- 快速重传是怎么被触发的?
假设现在传输三个包,传输过程中,第二包丢失掉了:- A的第一个包发出去,ack是100
- B回一个ack=1100
- A的第二个包丢失,A的第三个包也到达了B
- 此时B收到A的第三个包后,应该回复给A的ack是多少呢?
- 这种情况,B给A回复的ack是1100,即对第一个包回复的ack的值,原因是B没有收到A的第二个包
- 此时,A在传输第5个包,第6个包,收到的ack依然是1100
- 这时A连续收到3个确认的ack都是1100, A直到自己的第二个包丢失了,于是触发了快速重传机制。
- A对第二个包进行了重传之后,B应该回复给A的ack是多少?(是第五个包的seq+len),为什么?
流控机制
- 窗口因子
拥塞控制机制
-
拥塞窗口和滑动窗口的区别
-
为什么要有拥塞窗口
- 假设b的拥塞窗口是3000,a向b发送数据。
1) a先向b发送了一个1000的数据包
2) 这时候a收到b的窗口是3000
3) 然后,如果a立即发送3000的数据包给b,那么可能会出现,b还没有处理完上一次的
1000的数据包,这样3000+1000大于了b的处理能力,3000中可能有1000会被丢弃。
4)因为有这样的问题,所以a有一个拥塞控制的窗口
5) 拥塞控制窗口,a不会立即发送满的数据给b,而是试探式的发送,比如先发一个包,得到对方的ack后,将拥塞窗口大小加1,每确认一次加1,以此类推,逐渐的加大拥塞窗口。
6) 当拥塞窗口大于滑动窗口,接收端丢包,出现超时重传,超时重传是需要重新建立tcp
连接的。
- 为了减少超时重传带来的消耗,于是有了慢启动阀值的概念。
8) 慢启动阀值,是为了避免拥塞窗口大于滑动窗口。算法是:2倍的mss/拥塞窗口。当在
阀值以下的时候,每次增加1mss, 阀值以上每次增加 2mss/拥塞窗口字节,因此超过阀
值越大,拥塞窗口增长速度越慢。
慢启动阀值,并不是开始就有,而是在出现过一次超时重传后才有,这时的阀值是超时
时的阀值/2.
- 假设b的拥塞窗口是3000,a向b发送数据。
-
超时重传: 需要重新建立tcp连接!---->比如拥塞窗口大于滑动窗口的情况
-
快速重传: 不需要重新建立tcp连接!--->比如丢包重传的情况
提高网络利用率的算法
- nagle算法
- 延迟确认应答
- 稍待应答
网友评论