|
1 | | -# 传输层 |
| 1 | +* [TCP](#TCP(Transmission-Control-Protocol)传输控制协议) |
| 2 | +* [UDP](#UDP(User-Datagram-Protocol)用户数据报协议) |
| 3 | +# TCP(Transmission Control Protocol)传输控制协议 |
2 | 4 |
|
3 | 5 | ## TCP头部结构 |
4 | 6 |  |
@@ -152,16 +154,43 @@ TCP超时重传的基础就是需要根据RTT(Round-Trip Time)分组往返 |
152 | 154 | # 拥塞控制 |
153 | 155 | 拥塞控制和流量控制很像,但是后者是为了控制发送端的发送速率,避免接收端收到的数据溢出,而拥塞控制是为了降低网络中的拥塞程度。 |
154 | 156 |
|
155 | | -发送端维护着一个拥塞窗口(congestion window, cwnd),发送端实际上可发送窗口大小为 W = min(cwnd, awnd), 其中awnd为接收端通告窗口。 |
| 157 | +发送端维护着一个拥塞窗口(congestion window, cwnd),发送端实际上可发送窗口大小为 W = min(cwnd, awnd), 其中awnd为接收端通告窗口。对于这个W,我们是希望它能够接近带宽延迟积(bandwidth-delay product, BDP),W也称作最佳窗口大小。 |
156 | 158 |
|
157 | 159 | TCP拥塞控制主要有以下算法: |
158 | 160 | * 慢启动 |
159 | 161 | * 拥塞避免 |
160 | 162 | * 快重传 |
161 | 163 | * 快恢复 |
162 | | - |
| 164 | + |
163 | 165 | ## 慢启动 |
164 | 166 | * 在一个TCP连接刚建立时,或者重传计时器检测到网络中产生丢包后,会执行慢启动。因为在这两种情况下不知道网络传输能力(cwnd的值),所以需要先得到一个cwnd的初值。而得到cwnd初值的方法就是以越来越快的速度不断发送数据,直到丢包为止。 |
165 | 167 | * 但是考虑到如果一开始就以一个很大的速率发送,肯定会影响到其他连接的传输性能,所以采用慢启动的方式。 |
166 | 168 |
|
167 | 169 | 慢启动的过程: |
| 170 | +刚开始cwnd通常设置为1MSS,每收到一个新的报文段的ACK,cwnd增加一个MSS,所以cwnd随着每个RTT的变化就是1MSS,2MSS,4MSS,8MSS...呈**指数**级增长。但是一直这样下去cwnd过大后,肯定会引起网络拥塞,所以要在一个慢启动阈值(ssthresh)转换为拥塞避免模式。 |
| 171 | +当 cwnd < ssthresh 时,使用慢启动算法。 |
| 172 | +当 cwnd > ssthresh 时,停止使用慢启动而改用拥塞避免算法。 |
| 173 | +当 cwnd = ssthresh 时,既可使用慢慢启动,也可使用拥塞控制避免算法。 |
| 174 | + |
| 175 | +## 拥塞避免 |
| 176 | +在拥塞避免模式下,每收到一个新的报文段的ACK,cwnd会增加 MSS*(MSS/cwnd) 字节的大小,也就是说每经过一个RTT,cwnd只会增加一个MSS的大小,相比于慢启动的指数级增长,现在变成了**线性**增长,速率要缓慢很多 |
| 177 | + |
| 178 | +## 快速恢复 |
| 179 | +不论是在慢启动或者是拥塞避免阶段,只要出现一个由超时指示的丢包事件,那么ssthreth会被设置为cwnd的一半,cwnd被设置为1,进入**慢启动模式**。但是出现一个由三个冗余ACK指示的丢包事件时,ssthreth被设置为cwnd的一半,而cwnd减半并加上三个MSS(一个MSS对应一个冗余ACK),然后进入**快速恢复模式**。 |
| 180 | +上述快速恢复算法是TCP较新版本TCP Reno,以前的老版本TCP Tahoe,不论是因为超时丢包还是冗余ACK丢包,cwnd都会被设置为1MSS。 |
| 181 | + |
| 182 | +# UDP(User Datagram Protocol)用户数据报协议 |
| 183 | + |
| 184 | +## UDP头部 |
| 185 | + |
| 186 | +* 源端口号(2字节) |
| 187 | +* 目的端口号(2字节) |
| 188 | +* 长度(2字节) |
| 189 | +* 校验和(2字节) |
| 190 | + |
| 191 | +UDP由一个二元组标识(目的IP,目的PORT) |
| 192 | + |
| 193 | +# 两者比较 |
| 194 | +* UDP是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。 |
| 195 | + |
| 196 | +* TCP是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。 |
0 commit comments