《TCP-IP详解卷一:协议》第22~24章(读后笔记)

第22章 TCP的坚持定时器

22.1 引言

TCP 连接可能存在,接收方等待修改窗口大小的 ACK,但是此 ACK 丢失产生死锁的情况。因为 TCP 不对空的 ACK 进行确认。

所以需要使用『坚持定时器』周期性向接收方查询,发现窗口是否变大。这些从发送方发出的报文段称为窗口探查。

本章讨论,窗口探查、坚持定时器、糊涂窗口综合症。

22.2 一个例子

在收到一个大小为 0 的窗口通告后,坚持定时器开始启动,定时器到时间就发送『窗口探测』。

间隔时间这个例子中是,5,5,6,12,24,48,60,60,60,单位是秒。

这个坚持定时器直到窗口打开或者连接终止才会停止。

22.3 糊涂窗口综合症

糊涂窗口综合症:发送端应用进程产生数据很慢、或接收端应用进程处理接收缓冲区数据很慢,会使应用进程间传送的报文段很小。

极端情况下,有效载荷可能只有 1 个字节,传输开销有 40 字节。

措施:

  • 接收方不通告小窗口,等到窗口变大(窗口可以增加一个报文段大小或者可以增加接收方缓存空间的一半)在通告
  • 发送方措施,满足以下条件之一才发送
    • 可以发送一个满长度的报文段
    • 可以发送至少是接收方通告窗口大小一半的报文段
    • 第三种没看懂,可以发送任何数据并且不希望接收 ACK(也就是说,没有还未被确认的数据)或者该连接上不能使用 Nagle 算法

22.4 小结

介绍坚持定时器、糊涂窗口综合症避免方法。

第23章 TCP的保活定时器

23.1 引言

保活定时器:某一方希望查看另一方是否仍然还在

保活不是 TCP 规范中的一部分,但许多实现提供了保活定时器

23.2 描述

接下来假设服务器开启保活选项,客户没有。

连接在一段时间(默认值不小于 2 小时)之内没有任何动作,则服务器向客户发送一个探查报文段

客户主机必须处于以下 4 个状态之一

  • 客户主机依然正常运行,并且消息可达。重置保活定时器。
  • 客户主机已经崩溃,并且关闭或者正在重新启动。消息超时没有响应,TCP 多次探查失败则关闭连接。
  • 客户主机崩溃并已经重新启动。返回一个复位响应。
  • 客户主机正常运行,但是消息不可达。和第二种状态相同。

23.3 保活举例

23.3.1 另一端崩溃

23.3.2 另一端崩溃并重新启动

23.3.3 另一端不可达

23.4 小结

讲了个保活定时器,和例子。

第24章 TCP的未来和性能

24.1 引言

路径 MTU 发现机制,可以使 TCP 为非本地的连接使用大于 536 字节的 MTU,从而增加吞吐量

长肥管道:很大的带宽时延乘积的网络

TCP 选项:

  • 窗口扩大选项,增加 TCP 窗口
  • 时间戳选项,进行更加精确的 RTT 测量,还对序号回绕提供保护

24.2 路径MTU发现

24.2.1 一个例子

24.2.2 大分组还是小分组

24.3 长肥管道

长肥管道:很大的带宽时延乘积的网络

长肥管道的问题:

  • 需要更大的窗口增加吞吐量
  • 分组丢失会使吞吐量急剧减少。多分组丢失容易使管道耗尽
  • 需要更好的 RTT 测量机制
  • 延迟的报文,在重新建立的连接中如何避免出现

千兆比网络中,传输时间,时延占据主要,带宽不再成为限制

24.4 窗口扩大选项

定义一个扩大选项,额外增加 16 bit,移位值最大 14,使得窗口大小最大能够到达 2 30 2^{30} 230 bit。

这个选项只能出现在一个 SYN 报文段中,所以连接建立后每个方向的扩大因子是固定的。

主动建立连接的一方在其 SYN 中发送这个选项,被动建立连接的一方只能够在收到带有这个选项的 SYN 之后才可以发送这个选项。每个方向上的扩大因子可以不同。

如果主动连接的一方发送一个非零的扩大因子,但是没有从另一端收到一个窗口扩大选项,它就将发送和接收的移位记数器置为 0,兼容旧版本。

选项用法如下

发送移位记数为 S,而接收移位记数则为 R。

从另一端收到的每一个 16 bit 的通告窗口将被左移 R 位以获得实际的通告窗口大小。

发送一个窗口通告的时候,我们将实际的 32 bit 窗口大小右移 S 位,然后用它来替换 TCP 首部中的 16 bit 的值。

下面举了一个例子

24.5 时间戳选项

时间戳选项:发送方设置时间戳值,接收方在确认中返回这个数值。

更好的计算 RTT

收到多个报文段的时间戳,返回一个 ACK 如何返回?

为了减少任一端所维持的状态数量,对于每个连接只保持一个时间戳的数值。

  • TCP 跟踪下一个 ACK 中将要发送的时间戳的值(tsrecent 变量)以及最后发送的 ACK 中的确认序号(lastack 变量)。这个序号就是接收方期望的序号。

  • 当一个包含有字节号 lastack 的报文段到达时,则该报文段中的时间戳被保存在 tsrecent 中。

  • 无论何时发送一个时间戳选项,tsrecent 就作为时间戳回显应答字段被发送,而序号字段被保存在 lastack 中。

如果 ACK 被时延,则作为回显值的时间戳值应该对应于最早被确认的报文段。因为发送方在进行重传超时时间的计算时, 必须将迟延的 ACK 也考虑在内。如发送两个报文段1,2。返回 ACK 3,应该计算 1 的时间戳。

如果一个收到的报文段虽然在窗口范围内但同时又是失序,这就表明前面的报文段已经丢失。当那个丢失的报文段到达时,它的时间戳(而不是失序的报文段的时间戳)将被回显。

下节介绍避免收到旧的报文段,并认为是现在的数据中的一部分。

24.6 PAWS:防止回绕的序号

PAWS 算法不需要在发送方和接收方之间进行任何形式的时间同步。接收方所需要的就是时间戳的值应该单调递增,并且每个窗口至少增加 1。

通过判断时间戳确认有没有序号回绕。

24.7 T/TCP:为事务用的TCP扩展

TCP 为处理事务而需要进行的两个改动是避免三次握手和缩短 WAIT_TIME 状态。

T/TCP 通过使用加速打开来避免三次握手:

  • 它为打开的连接指定一个 32 bit 的连接计数 CC,无论主动打开还是被动打开。一个主机的 CC 值从一个全局计数器中获得,该计数器每次被使用时加 1。
  • 在两个使用 T/TCP 的主机之间的每一个报文段都包括一个新的 TCP 选项 CC。这个选项的长度为 6 个字节,包含发送方在该连接上的 32 bit 的 CC 值。
  • 一个主机维持一个缓存,该缓存保留每个主机上一次的 CC 值,这些值从来自这个主机的一个可接受的 SYN 报文段中获得。
  • 当在一个开始的 SYN 中收到一个 CC 选项的时候,接收方比较收到的值与缓存的发送方的 CC 值。
    • 如果接收到的 CC 比缓存的大,则该 SYN 是新的,报文段中的任何数据被传递给接收应用进程(服务器)。这个连接被称为半同步。
    • 如果接收的 CC 比缓存的小,或者接收主机上没有对应这个客户的缓存 CC,则执行正常的 TCP 三次握手过程。
  • 为响应一个开始的 SYN,带有 SYN 和 ACK 的报文段在另一个被称为 CCECHO 的选项中回显所接收到的 CC 值。
  • 在一个非 SYN 报文段中的 CC 值检测和拒绝来自同一个连接的前一个替身的任何重复的报文段。

这种『加速打开』避免了使用三次握手的要求,除非客户或者服务器已经崩溃并重新启动。这样做的代价是服务器必须记住从每个客户接收的最近的 CC 值。

uysy 有些地方没看懂,特别是第六点:

在一个非 SYN 报文段中的 CC 值检测和拒绝来自同一个连接的前一个替身的任何重复的报文段。

这个『和』啥玩意连接了什么?

大概就是一次握手,顺便直接发送数据了。

这块内容我选择跳过,到时面经看到再说。

24.8 TCP的性能

24.9 小结

大概知道了,坚持定时器、糊涂窗口综合症、保活定时器、窗口扩大选项、时间戳选项。

其他节不太清楚只是了解一二。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值