目录
面向连接的运输:TCP
TCP 连接
1.面向连接的(connection-oriented)
2.是一条逻辑连接,只在端系统中运行;中间路由器只能看到数据,对 TCP 连接视而不见。
3.全双工服务(full-duplex service):连接双方可以相互发送数据。
4.点对点(point to point):一个发送方只能对应一个接收方。
5.建立连接时,前两次握手的报文段不承载"有效载荷"(不包含应用层数据);第三次握手的报文段可以承载"有效载荷"。
6.TCP连接组成:①两台主机上的缓存 ②变量 ③套接字
7.最大报文长度(Maximum Segment Size,MSS):报文段中应用层数据最大长度,用来限制 TCP 可从缓存读取并放入报文段的数据数量;基于路径 MTU(从源到目的地所有链路上发送的最大链路层帧(最大传输单元,Maximum Transmission Unit) 设置 MSS。
TCP 报文段结构
1.源端口号和目的端口号
2.检验和字段(cheksum field)
3.序号字段(sequence number field) 32 bit:报文段中数据首个字节的编号 Seq。
5.确认号字段(acknowledgment number field,Ack) 32 bit:期待接收的下一个序号(+1),当标志字段 ACK 为 1 时,有效。
6.接收窗口字段(receive window size) 16 bit:用于流量控制。
7.首部长度字段(header length field): 以 32 bit 的字为单位的 TCP 首部长度;由于选项字段长度可变,TCP 首部长度可变;通常 20 字节。
8.选项字段(options field)选项字段:可选可变长;用于发送方与接收方协商 MSS,或用作窗口调节因子时使用。
9.标志字段(flag field) 6 bit:
- ① ACK:代表确认号有效,报文段包括一个对已接受报文段的确认
- ② SYN:用于建立一个连接
- ③ FIN:用于释放一个连接
- ④ RST:用于重置连接,目的端口没有被进程监听时,回送一个 RST 报文(宕机重启、发送方用于表示异常释放连接,他还会将待发送数据丢弃,接收方不需要回复并通知应用层连接重置)
- ⑤ CWR 与 ECE 用于明确拥塞通告
- ⑥ PSH 被置位时,就指示接收方应立即将数据交给上层;
- ⑦ URG 指示报文段里被发送方上层置为"紧急"的数据,紧急指针有效。
10.紧急数据指针:指向紧急数据的最后一个字节,当设置了 URG 与紧急数据指针则必须通知接收端上层(PSH、URG、紧急数据指针实践中并未使用)
序号和确认号
1.TCP 把数据看成一个无结构、有顺序的字节流。
2.序号:报文段数据首字节的编号。
3.确认号:期望收到的下一个字节的序号。
可靠数据传输
现象
超时间隔加倍
1.超时很有可能是由网络拥塞引起的,假如持续重传分组,只会使拥塞更严重;所以每超时一次,就把时间间隔翻倍。
2.收到上层应用数据和收到 ACK,会重新计算超时间隔。
快速重传
1.收到 3 个冗余 ACK 立即快速重传(fast retransmit)
2.原因:到达顺序错误,比如分组 2 先于分组 1 到达,如果立即快速重传,重传的是分组1,而这其实没有必要。
GBN + SR
- 1.发送方维持已发送但未被确认的字节最小序号 SendBase(GNB)
- 2.接收方缓存失序分组(SR)
选择确认(selective acknowledgment),有选择的确认失序分组。
- 接收方只返回最小未确认序号,不像 SR 对每个分组都有对应的 ACK,不像 GNB 返回最近确认的序号
- 发送方只重传最小未确认序号对应分组,不像 GNB 重传往后所有分组
流量控制(速率不匹配)
原因
1.TCP 连接,两侧主机都会为该连接分配接收缓存(RcvBuffer);假设对方发送速率超出了进程读取速率,则可能出现缓存溢出情况。
2.TCP 为进程提供流量控制服务(flow-control service),让发送方发送速率与进程读取速率相匹配。
接收方
1.维护两个变量:
- LastByteRead —— 进程从缓存读取的数据流的最后一个字节的编号
- LastByteRcvd —— 从网络中到达并已放入接收缓存中的数据流的最后一个字节编号
2.满足式子:
- LastByteRcvd - LastByteRead <= RcvBuffer,
- rwnd = RcvBuffer - (LastByteRcvd - LastByteRead)
发送方
1.维护一个接收窗口(receive window)的变量(确认报文中) —— 接收方还有多少可用缓存空间。
2.维护两个变量(发送窗口、拥塞窗口):
- LastByteSent —— 已发送数据最后一个字节的编号,
- LastByteAcked —— 已确认接收数据最后一个字节的编号。
3.满足式子:LastByteSent - LastByteAcked <= rwnd(剩余未确认数据流 <= 窗口大小)
4.*rwnd = 0 时:
- 启动一个定时器,持续发送只有一个字节数据的报文段(试探报文);
- 缓存开始清空时,确认报文将包含一个非 0 的 rwnd 值;
- 发送方仅当 rwnd 非 0 时,才继续发送报文;
- 发送多次:防止只发送一次,确认报文丢失,导致发送方一直阻塞。
拥塞控制
拥塞原因
根本原因:用户提供给网络的负载大于网络资源容量和处理能力。
直接原因:
- 路由器的存储空间不足
- 带宽容量不足
- 路由器的处理能力弱或速度慢
拥塞代价
1.分组到达速率接近链路容量时,分组经历巨大的排队时延。
2.发送方必须重传因为缓存溢出而丢弃(丢失)的分组。
3.发送方遇到大时延,进行不必要的重传引起路由器利用链路带宽转发不必要的的分组副本(超时,重传已经确认的分组)。
4.一个分组沿一条路径(多个路由器)被丢弃,每个上游路由器用于转发该分组到丢弃该分组使用的传输容量最终被浪费掉(路由器最好优先考虑,已经经历过一定数量路由器的分组);还可能导致拥塞崩溃(吞吐量为 0)。
与流量控制区别
流量控制
- 流量控制是针对点对点,双方速率匹配
- 流量控制是为了预防拥塞
- 丢包发生在接收端
拥塞控制
- 拥塞控制是针对全局,涉及所有主机和降低网络性能的因素
- 防止过多数据注入到网络中,使路由器或链路不至于过载
- 确保网络健壮性的关键因素
- 丢包发生在路由器
拥塞控制方法
1.端到端控制:
- ①TCP 报文段丢失(超时或三次冗余 ACK)。
- ②增加的往返时延值。
2.网络辅助的拥塞控制:
- ①网络路由器将反馈信息直接返回给发送方。
- ②标记或更新分组中某个字段来指示拥塞的产生,至少经过一个完整的往返时间。
3.TCP 拥塞控制:
- 维护一个变量:cwnd(congestion window) 拥塞窗口
- 满足:LastByteSent - LastByteAcked <= min {cwnd,rwnd}
TCP控制感知拥塞
1.丢失的报文段(超时事件或者四次确认)意味着拥塞,应减小发送方速率(拥塞窗口长度)。
2.先前未被确认的报文段,确认到达;意味着不拥塞,增加发送方速率(拥塞窗口长度)。
3.带宽探测,探测拥塞开始出现的速率;发送方增加速率,从该速率开始后退,再次开始探测(丢包或确认),判断拥塞开始速率是否改变。
拥塞控制算法
算法介绍
加法增加,乘法减少
1.慢启动:每经过一个 RTT,窗口大小翻一倍
- 初始:设置 cwnd = 1MSS。
- 每接收一个新 ACK:cwnd += 1MSS(每次发送 cwnd 个分组),则 1RRT 翻一倍。
- 超时:ssthresh(阈值) = cwnd / 2,cwnd = 1MSS,重传分组。
- 达到阈值:进入拥塞避免。
- 收到三个冗余 ACK:ssthresh = cwnd / 2,cwnd = ssthresh + 3MSS,重传分组(快速重传,即使还未超时);进入快速恢复。
2.拥塞避免:每经过一个 RTT,窗口大小 + 1
- 每接收一个新 ACK:cwnd += MSS * (MSS / cwnd),则 1RTT + 1MSS。
- 超时:ssthresh = cwnd / 2,cwnd = 1MSS,重传分组;进入慢启动。
- 收到三个冗余 ACK:ssthresh = cwnd / 2,cwnd = ssthresh + 3MSS,重传分组(快速重传,即使还未超时);进入快速恢复。
3.快速恢复:每经过一个 RTT,窗口大小 + 1
- 每接收一个冗余 ACK:cwnd += 1MSS,则 1RTT + 1MSS。
- 超时:ssthresh = cwnd / 2,cwnd = 1MSS,重传分组;进入慢启动。
- 收到一个丢失报文段的 ACK:cwnd = ssthresh;进入拥塞避免。
总结
慢启动
- 首先进入慢启动,每经过一个 RTT 拥塞窗口大小就翻一倍。
拥塞避免
- 到达初始阈值后,进入拥塞避免状态,每经过一个 RTT 拥塞窗口大小就 + 1。
快速恢复
- 当收到 3 个冗余 ACK(慢启动或者拥塞避免),快速重传所需分组并进入快速恢复状态;
- 阈值 = 当前窗口大小 / 2,窗口大小减半 + 3(收到了 3 个 ACK);
- 每经过一个 RTT 拥塞窗口大小就 + 1,收到之前丢失分组的确认 ACK 之后,拥塞窗口大小 = 当前阈值,进入拥塞避免状态
补充
- 发生超时事件,阈值减半,拥塞窗口大小 = 1,进入慢启动状态
- Tahoe 版本,只要出现丢包事件(即使是 3 个冗余 ACK)就进入慢启动状态,没有快速恢复状态









2730

被折叠的 条评论
为什么被折叠?



