|
|
|
@ -11,6 +11,7 @@ TCP 口水话 |
|
|
|
|
5. 重传机制 |
|
|
|
|
6. 流量控制之滑动窗口 |
|
|
|
|
7. 拥塞控制 |
|
|
|
|
8. 场景面试题汇总 |
|
|
|
|
|
|
|
|
|
#### 概述 |
|
|
|
|
|
|
|
|
@ -86,4 +87,41 @@ TCP 会把要发送的数据放入发送缓冲区,接收到的数据放入接 |
|
|
|
|
|
|
|
|
|
#### 拥塞控制 |
|
|
|
|
|
|
|
|
|
前面介绍了 TCP 利用滑动窗口来做流量控制,流量控制这种机制确实可以防止发送端向接收端过多的发送数据,但是它只关注了发送端和接收端自身的状况,而没有考虑整个网络的通信状况。 |
|
|
|
|
前面介绍了 TCP 利用滑动窗口来做流量控制,流量控制这种机制确实可以防止发送端向接收端过多的发送数据,但是它只关注了发送端和接收端自身的状况,而没有考虑整个网络的通信状况。 |
|
|
|
|
|
|
|
|
|
拥塞处理主要涉及三个算法,慢启动、拥塞避免、快速重传。 |
|
|
|
|
|
|
|
|
|
为了实现上面的算法,TCP 的每个连接都有两个核心状态值,拥塞窗口(cwnd)和慢启动阈值。 |
|
|
|
|
|
|
|
|
|
拥塞窗口指的是在收到对端 ACK 之前自己还能传输的最大 MSS 段数。接收窗口(rwnd)是接收端的限制,是接收端还能接受的数据量大小;拥塞窗口(cwnd)是发送端的限制,是发送端在还未收到对端 ACK 之前还能发送的数据量大小。 |
|
|
|
|
|
|
|
|
|
拥塞控制算法本质是控制拥塞窗口的变化。 |
|
|
|
|
|
|
|
|
|
在连接建立之初,应该发多少数据才是合适的呢?其实很难,因为不知道对端的处理能力以及途径的网络状况,所以在最初时,发送的数据量很小,但随着时间的推移,拥塞窗口会慢慢的递增,这种机制被称为慢启动。cwnd 每经过一个 RTT,就会变为之前的两倍。 |
|
|
|
|
|
|
|
|
|
但是也不可能无止境的指数级增长下去,否则就失控了,当 cwnd 超过慢启动阈值时,就启动拥塞避免算法,拥塞窗口按线性增长。即没经过一个 RTT,cwnd 增加 1. |
|
|
|
|
|
|
|
|
|
快速重传的含义是:当接收端收到一个不按序到达的数据段时,TCP 立刻发送一个 1 个重复 ACK,当发送端收到 3 个或以上重复 ACK 时,就意识到之前发的包可能丢了,于是马上进行重传,不用傻等到重传定时器超时在重传。 |
|
|
|
|
|
|
|
|
|
#### 常见笔试面试题汇总 |
|
|
|
|
|
|
|
|
|
1.收到 IP 数据包解析以后,它怎么知道这个分组应该投递到上层的哪一个协议呢? |
|
|
|
|
|
|
|
|
|
解析:IP 头里有一个 protocol 字段,指出在上层使用的协议,比如值为 6 表示数据交给 TCP,值为 17 表示数据交给 UDP。 |
|
|
|
|
|
|
|
|
|
2.TCP 提供了一种字节流服务,而收发双方都不保持记录的边界,应用程序应该如何提供他们自己的记录标识呢? |
|
|
|
|
|
|
|
|
|
解析:应用程序使用自己约定的规则来表示消息的边界,比如有一些使用回车+换行(""\r\n")。 |
|
|
|
|
|
|
|
|
|
3.TCP/IP 协议中,MSS 和 MTU 分别工作在哪一层? |
|
|
|
|
|
|
|
|
|
解析:MSS -> 传输层,MTU -> 链路层。 |
|
|
|
|
|
|
|
|
|
4.在 MTU = 1500 字节的以太网中,TCP 报文的最大载荷为多少字节? |
|
|
|
|
|
|
|
|
|
解析:1500(MTU)- 20(IP 头)- 20(TCP 头)= 1460 |
|
|
|
|
|
|
|
|
|
5.假设 MSL 是 60s,请问系统能够初始化一个新连接然后主动关闭的最大速率是多少?(忽略 1~1024 区间的端口) |
|
|
|
|
|
|
|
|
|
解析:(65535-1024)/ 120 |
|
|
|
|
|
|
|
|
|