TCP 的三个重要特性
- 可靠传输
- 流量控制
- 拥塞控制
TCP 是一种面向连接的单播协议。提供一种可靠、面向连接、字节流、传输层的服务。
RAQ和重传
一个处理分组丢失或者比特差错的方法是重新发送分组直到它被正确接收。
- 接收方是否收到分组。
- 分组是否和发送时一致。
最基本的方式是发送一个分组消息然后等待一个应答 ACK 。限于现实中不可靠的有损网络传输此过程会变得复杂。
- 发送方对一个 ACK 应答应该等待多长时间?
等待时间过长辉导致网络过多的空闲,也就是吞吐量下降;过短可能会导致更多的重发致使网络更加拥挤。
- 如果 ACK 丢失了怎么办?
重传。接收端用分组中的序号确定是否重复,重复则丢弃。
- 已接收到分组,但是分组丢失了怎么办?
校验和与CRC。
- 网络吞吐量与M/R成正比,M是分组大小,R是往返时间(RTT)。
分组窗口和滑动窗口
已被发送方注入但是还没有完成确认的分组数据的集合。
- 窗口中的分组数量称为
窗口大小
(window size)。
左窗口边界
|
----+----+----+----+----+----+----+
... | 3 | 4 | 5 | 6 | 7 | ...
----+----+----+----+----+----+----+
| |当前窗口大小 3 |
3 已发送并确认
4,5,6 已发送未确认,即窗口范围。
7 未发送
假设数据由左向右,从发送方流到接收方。3 被 ACK 确认后释放副本,接着是 4 被 ACK 确认释放,此时 7 就可以进入发送窗口。此即为滑动窗口(sliding window)
协议。
变量窗口
在接收方比发送方慢时,为了防止造成网络更大的拥堵,需要调慢发送方的速率。
- 基于速率的流量控制(rate-based):发送方按照某一个指定的速率阈值,适合流应用程序,可用于广播和组播发现。
- 基于窗口的流量控制(window-based):由接收方告知接收方调整窗口大小,此称为
窗口通告
。被携带在 ACK 分组中。 - 拥塞控制:为应对低效的中间网络,比如内存很低的路由器时,即使发送方和接收方速率一致了仍然会出现丢包的问题。此时仍然需要收集传输数据以调低发送速率。
可靠传输
- 组包:元数据字节流转换成一组IP可携带的分组。
- 分组序号:代表每个分组的第一个字节在整个数据流中的偏移量。
- 重新组包:组包在传输过程中改变大小,数据被打散成TCP认为最合适大小的块来发送。
- ACK 是累积发送的,一个字节号指示N的ACK意味着已收到所有直至N(不包括N)的字节。这允许 ACK 丢失,因为后面的 ACK 可以确认前面的数据。
- TCP 是双工通信,报文段包含发给对方的 ACK ,ACK 又含又窗口通告。所以当一个TCP报文段到达时窗口可能向前滑动,窗口大小可能改变,同时新数据可能已到达。
TCP 头部和封装
-
端口和IP头部中的 IP 地址唯一标识一个连接。
-
一个 IP 地址和一个端口称为一个端点(endpoint)或者套接字(socket)。一个 TCP 由一对套接字唯一标识。
-
序列号:报文数据第一个字节,32位无符号数,到达 $32^2-1$ 后重置为 0 。
-
确认号:也称 ACK 号或者 ACK 字段。最后被成功接收的数据字节的序号加 1。
-
头部字段:整个 TCP 头部的长度。标准长度时20字节,当出现选项时可能超过 20 字节,但是不超过 60 字节。
-
校验和:由发送方计算和保存,然后由接收方验证。
-
让发送方给接收方提供特殊标志数据的方法。
8位字段
- CWR:拥塞窗口减,发送方降低他的发送速率。
- ECE:ECN 回显,发送方接收到了一个更早的拥塞通告。
- URG:紧急,紧急指针字段有效,很少被使用。
- ACK:确认,确认号字段有效,连接建立以后一般都是启用状态。
- PSH:推送,接收方应尽快给应用程序传送这个数据,几乎没有被用到。被置位(无值)时,也用于表示不再发送任何数据。
- RST:重置连接,连接取消,经常是因为错误。
- SYN:用于初始化一个连接的同步序列号。
- FIN:该报文段的发送方已经结束向对方发送数据。