diff --git a/notes/pics/tcp-cwnd.png b/notes/pics/tcp-cwnd.png
new file mode 100644
index 00000000..90dcb13a
Binary files /dev/null and b/notes/pics/tcp-cwnd.png differ
diff --git a/notes/pics/tcp-fast-retransmit.png b/notes/pics/tcp-fast-retransmit.png
new file mode 100644
index 00000000..0007f464
Binary files /dev/null and b/notes/pics/tcp-fast-retransmit.png differ
diff --git a/notes/pics/tcp-flow-vs-congestion.png b/notes/pics/tcp-flow-vs-congestion.png
new file mode 100644
index 00000000..7d82af7d
Binary files /dev/null and b/notes/pics/tcp-flow-vs-congestion.png differ
diff --git a/notes/pics/tcp-handshake.png b/notes/pics/tcp-handshake.png
new file mode 100644
index 00000000..3a608d65
Binary files /dev/null and b/notes/pics/tcp-handshake.png differ
diff --git a/notes/pics/tcp-header.png b/notes/pics/tcp-header.png
new file mode 100644
index 00000000..82244d03
Binary files /dev/null and b/notes/pics/tcp-header.png differ
diff --git a/notes/pics/tcp-sliding-window.png b/notes/pics/tcp-sliding-window.png
new file mode 100644
index 00000000..10c7c973
Binary files /dev/null and b/notes/pics/tcp-sliding-window.png differ
diff --git a/notes/pics/tcp-teardown.png b/notes/pics/tcp-teardown.png
new file mode 100644
index 00000000..897070b2
Binary files /dev/null and b/notes/pics/tcp-teardown.png differ
diff --git a/notes/pics/udp-header.png b/notes/pics/udp-header.png
new file mode 100644
index 00000000..a8a18882
Binary files /dev/null and b/notes/pics/udp-header.png differ
diff --git a/notes/计算机网络 - 传输层.md b/notes/计算机网络 - 传输层.md
index 935d5c16..21305f18 100644
--- a/notes/计算机网络 - 传输层.md
+++ b/notes/计算机网络 - 传输层.md
@@ -25,13 +25,13 @@
## UDP 首部格式
-
+
首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和。12 字节的伪首部是为了计算检验和临时添加的。
## TCP 首部格式
-
+
- **序号** :用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。
@@ -49,7 +49,7 @@
## TCP 的三次握手
-
+
假设 A 为客户端,B 为服务器端。
@@ -71,7 +71,7 @@
## TCP 的四次挥手
-
+
以下描述不讨论序号和确认号,因为序号和确认号的规则比较简单。并且不讨论 ACK,因为 ACK 在连接建立之后都为 1。
@@ -103,12 +103,18 @@ TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文
一个报文段从发送再到接收到确认所经过的时间称为往返时间 RTT,加权平均往返时间 RTTs 计算如下:
-*(RTTs)+a*RTT)
+```text
+RTTs = (1 - a) × RTTs + a × RTT
+```
+
其中,0 ≤ a < 1,RTTs 随着 a 的增加更容易受到 RTT 的影响。
超时时间 RTO 应该略大于 RTTs,TCP 使用的超时时间计算如下:
-
+```text
+RTO = RTTs + 4 × RTTd
+```
+
其中 RTTd 为偏差的加权平均值。
## TCP 滑动窗口
@@ -117,9 +123,9 @@ TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文
发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。
-接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。
+接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认,确认号为 32。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。
-
+
## TCP 流量控制
@@ -131,18 +137,18 @@ TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文
如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。
-
+
TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
-发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。
+发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口,它取拥塞窗口和接收方通告的窗口中的较小值。
为了便于讨论,做如下假设:
- 接收方有足够大的接收缓存,因此不会发生流量控制;
- 虽然 TCP 的窗口基于字节,但是这里设窗口的大小单位为报文段。
-
+
### 1. 慢开始与拥塞避免
@@ -164,4 +170,4 @@ TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、
慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。
-
+
diff --git a/tools/diagram/src/tcp-cwnd.svg b/tools/diagram/src/tcp-cwnd.svg
new file mode 100644
index 00000000..5efec880
--- /dev/null
+++ b/tools/diagram/src/tcp-cwnd.svg
@@ -0,0 +1,124 @@
+
diff --git a/tools/diagram/src/tcp-fast-retransmit.svg b/tools/diagram/src/tcp-fast-retransmit.svg
new file mode 100644
index 00000000..500c362f
--- /dev/null
+++ b/tools/diagram/src/tcp-fast-retransmit.svg
@@ -0,0 +1,75 @@
+
diff --git a/tools/diagram/src/tcp-flow-vs-congestion.svg b/tools/diagram/src/tcp-flow-vs-congestion.svg
new file mode 100644
index 00000000..52019c99
--- /dev/null
+++ b/tools/diagram/src/tcp-flow-vs-congestion.svg
@@ -0,0 +1,91 @@
+
diff --git a/tools/diagram/src/tcp-handshake.svg b/tools/diagram/src/tcp-handshake.svg
new file mode 100644
index 00000000..04a3ceef
--- /dev/null
+++ b/tools/diagram/src/tcp-handshake.svg
@@ -0,0 +1,62 @@
+
diff --git a/tools/diagram/src/tcp-header.svg b/tools/diagram/src/tcp-header.svg
new file mode 100644
index 00000000..0089a92a
--- /dev/null
+++ b/tools/diagram/src/tcp-header.svg
@@ -0,0 +1,97 @@
+
diff --git a/tools/diagram/src/tcp-sliding-window.svg b/tools/diagram/src/tcp-sliding-window.svg
new file mode 100644
index 00000000..d233bcca
--- /dev/null
+++ b/tools/diagram/src/tcp-sliding-window.svg
@@ -0,0 +1,167 @@
+
diff --git a/tools/diagram/src/tcp-teardown.svg b/tools/diagram/src/tcp-teardown.svg
new file mode 100644
index 00000000..270628fb
--- /dev/null
+++ b/tools/diagram/src/tcp-teardown.svg
@@ -0,0 +1,79 @@
+
diff --git a/tools/diagram/src/udp-header.svg b/tools/diagram/src/udp-header.svg
new file mode 100644
index 00000000..dfd8cc90
--- /dev/null
+++ b/tools/diagram/src/udp-header.svg
@@ -0,0 +1,78 @@
+