Skip to content

Commit cf00f9c

Browse files
committed
update
1 parent 5c76670 commit cf00f9c

File tree

3 files changed

+34
-5
lines changed

3 files changed

+34
-5
lines changed
File renamed without changes.

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
* Computer Networking Top-Down Approach, 7th
44
* TCP/IP Illustrated Volume 1, 2nd
55
---
6-
- [x] [Application Layer](Application-Layer.md)
7-
- [ ] [Transport Layer](Transport-Layer.md)
6+
* [Outline&Application Layer](Application-Layer.md)
7+
* [Transport Layer](Transport-Layer.md)

Transport-Layer.md

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
# 传输层
1+
* [TCP](#TCP(Transmission-Control-Protocol)传输控制协议)
2+
* [UDP](#UDP(User-Datagram-Protocol)用户数据报协议)
3+
# TCP(Transmission Control Protocol)传输控制协议
24

35
## TCP头部结构
46
![](./pics/TCPheader.png)
@@ -152,16 +154,43 @@ TCP超时重传的基础就是需要根据RTT(Round-Trip Time)分组往返
152154
# 拥塞控制
153155
拥塞控制和流量控制很像,但是后者是为了控制发送端的发送速率,避免接收端收到的数据溢出,而拥塞控制是为了降低网络中的拥塞程度。
154156

155-
发送端维护着一个拥塞窗口(congestion window, cwnd),发送端实际上可发送窗口大小为 W = min(cwnd, awnd), 其中awnd为接收端通告窗口。
157+
发送端维护着一个拥塞窗口(congestion window, cwnd),发送端实际上可发送窗口大小为 W = min(cwnd, awnd), 其中awnd为接收端通告窗口。对于这个W,我们是希望它能够接近带宽延迟积(bandwidth-delay product, BDP),W也称作最佳窗口大小。
156158

157159
TCP拥塞控制主要有以下算法:
158160
* 慢启动
159161
* 拥塞避免
160162
* 快重传
161163
* 快恢复
162-
164+
![](pics/TCP拥塞控制转换.png)
163165
## 慢启动
164166
* 在一个TCP连接刚建立时,或者重传计时器检测到网络中产生丢包后,会执行慢启动。因为在这两种情况下不知道网络传输能力(cwnd的值),所以需要先得到一个cwnd的初值。而得到cwnd初值的方法就是以越来越快的速度不断发送数据,直到丢包为止。
165167
* 但是考虑到如果一开始就以一个很大的速率发送,肯定会影响到其他连接的传输性能,所以采用慢启动的方式。
166168

167169
慢启动的过程:
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+
![](pics/UDP头部.png)
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

Comments
 (0)