Skip to content

Commit

Permalink
feat(tcp max speed): add new question tcp max speed for Computer Netw…
Browse files Browse the repository at this point in the history
…ork.md
  • Loading branch information
Asterisci committed Mar 16, 2021
1 parent 8d9b76d commit 9f13270
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 3 deletions.
31 changes: 28 additions & 3 deletions Computer Network.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
* [什么是四次挥手?](#什么是四次挥手)
* [TCP如何实现流量控制?](#TCP如何实现流量控制)
* [TCP的拥塞控制是怎么实现的?](#TCP的拥塞控制是怎么实现的)
* [TCP如何最大利用带宽?](#TCP如何最大利用带宽?)
* [TCP与UDP的区别](#TCP与UDP的区别)
* [TCP如何保证传输的可靠性](#TCP如何保证传输的可靠性)
* [~~什么是TCP粘包?~~](#什么是TCP粘包)
Expand Down Expand Up @@ -127,6 +128,8 @@ MSL(Maximum Segment Lifetime),指一个片段在网络中最大的存活时间

发送窗口的上限为接受窗口和拥塞窗口中的较小值。接受窗口表明了接收方的接收能力,拥塞窗口表明了网络的传送能力。

![滑动窗口](_v_images/1615897397.gif)

##### 什么是零窗口(接收窗口为0时会怎样)?

<details>
Expand Down Expand Up @@ -155,6 +158,30 @@ MSL(Maximum Segment Lifetime),指一个片段在网络中最大的存活时间
4. 快恢复:当发送方连续收到三个重复确认时,就把慢开始门限减半,然后执行拥塞避免算法。不执行慢开始算法的原因:因为如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方认为现在网络可能没有出现拥塞。
也有的快重传是把开始时的拥塞窗口cwnd值再增大一点,即等于 ssthresh + 3*MSS 。这样做的理由是:既然发送方收到三个重复的确认,就表明有三个分组已经离开了网络。这三个分组不再消耗网络的资源而是停留在接收方的缓存中。可见现在网络中减少了三个分组。因此可以适当把拥塞窗口扩大些。

### TCP如何最大利用带宽?

TCP速率受到三个因素影响

- 窗口:即滑动窗口大小,见[TCP如何实现流量控制?](#TCP如何实现流量控制)
- 带宽:这里带宽是指单位时间内从发送端到接收端所能通过的“最高数据率”,是一种硬件限制。TCP发送端和接收端的数据传输数不可能超过两点间的带宽限制。发送端和接收端之间带宽取所通过线路的带宽最小值(如通过互联网连接)。
- RTT:即Round Trip Time,表示从发送端到接收端的一去一回需要的时间,TCP在数据传输过程中会对RTT进行采样(即对发送的数据包及其ACK的时间差进行测量,并根据测量值更新RTT值),TCP根据得到的RTT值更新RTO值,即Retransmission TimeOut,就是重传间隔,发送端对每个发出的数据包进行计时,如果在RTO时间内没有收到所发出的数据包的对应ACK,则任务数据包丢失,将重传数据。一般RTO值都比采样得到的RTT值要大。

<details>
<summary>带宽时延乘积</summary>

带宽时延乘积=带宽*RTT,实际上等于发送端到接收端单向通道的数据容积的两倍,这里单向通道的数据容积可以这样来理解,单向通道看成是一条单行道马路,带宽就是马路的车道数,路上跑的汽车就是数据(不过这里所有汽车的速率都是一样的,且不会有人想超车,大家齐头并进),那么单向通道的数据容积就是这条单行道上摆满车,一共可以摆多少辆。带宽就是马路的车道数,带宽数乘以单向通道的数据容积就是路面上所能容纳的全部数据量。当路面上已经摆满的时候,就不能再往里面放了。
</details>

设滑动窗口大小为$W$, 发送端和接收端的带宽为$B$, RTT为$T_r$。

前面已经说过了,TCP发送数据时受滑动窗口的限制,当TCP将滑动窗口中的数据都发出后,在收到第一个ACK之前,滑动窗口大小是0,不能再发送数据了,必须等待ACK包使滑动窗口移动。那么在理想情况下,ACK包应该在什么时候到达呢?显然,就是在数据发出后的RTT时间后,ACK包到达。这也就是说,现在在不考虑丢包和拥塞情况下,TCP在一个RTT时间内能发出的最大数据量为 $W$ ,所以不考虑带宽限制下,TCP能一个时刻能达到的最大速度是 $V = \frac{W}{T_r}$。

现在再考虑带宽限制,前面说过当马路上摆满车的时候,就无法再往里放车了,同理,TCP发送端在 $\frac{T_r}{2}$ 时间内,能往通道上放的最大数据量为 $\frac{V*T_r}{2}$ ,通过带宽时延乘积得到的容积限制为 $\frac{B*T_r}{2}$。当 $\frac{B*T_r}{2} \geq \frac{V*T_r}{2}$ 时,单向通道容积不构成瓶颈,速率的限制主要来源于窗口大小限制。而当 $\frac{V*T_r}{2} \geq \frac{B*T_r}{2}$ 时,则就受到容积限制,即此时速率限制来源于带宽限制。

因此,TCP的最大速率为 $V = \min{(\frac{W}{T_r}, B)}$

在我们平时生活中使用的宽带网络,ADSL等环境下,因为带宽都比较小,从而$B*T_r$也比较小,再加上网络情况比较复杂,拥塞情况比较常见,所以这些网络环境下,TCP速率的主要限制因素在于带宽,丢包率等。长肥管道一般不太常见,多见于一些单位使用的专线网络,在这些网络中速率的主要限制因素就是窗口大小了,这也是传统TCP在这些网络环境中不能充分利用带宽的原因所在(因为传统TCP的窗口大小是用2字节表示的,所以最大只有65535(不考虑窗口扩大选项)),除了专线网络外,随着网络硬件技术的发展,万兆交换机的出现,局域网中也可能会出现带宽时延乘积较大的情况。

### TCP与UDP的区别

1. TCP是面向连接的,UDP是无连接的;
Expand Down Expand Up @@ -369,6 +396,4 @@ Cookie保存在客户端本地,客户端请求服务器时会将Cookie一起
### 参考
- [面试/笔试第一弹 —— 计算机网络面试问题集锦](https://blog.csdn.net/justloveyou_/article/details/78303617)
- [什么时候选TCP、UDP?](https://blog.csdn.net/yjxsdzx/article/details/71937886)

### 待完成
- [ ] 发送窗口的大小,如何最大利用带宽,假设延迟100ms,发送端10Mb/s,接收端100Mb/s. [reference](https://blog.csdn.net/bad_sheep/article/details/6158676)
- [TCP速率与窗口,带宽,RTT之间的关系](https://blog.csdn.net/bad_sheep/article/details/6158676)
Binary file added _v_images/1615897397.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 9f13270

Please sign in to comment.