运输层服务
运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信 (logic communication) 功能。
运输层协议是在端系统中而不是在路由器中实现的 。 在发送端,运输层将从发送应用程序进程接收到的报文转换成运输层分组(运输层报文段,segment)。
实现的方法(可能)是将应用报文划分为较小的块,并为每块 加上一个运输层首部以生成运输层报文段。 然后,在发送端系统中,运输层将这些报文段 传递给网络层,网路层将其封装成网络层分组(即数据报)并向目的地发送。**网络路由器仅作用于该数据报的网络层字段,即它们不检查封装在该数据报的运输层报文段的字段。**在接收端,网络层从数据报中提取运输层报文段,并将该报文段向上交给运输层。运输层则处理接收到的报文段,使该报文段中的数据为接收应用进程使用。
网络应用程序可以使用多种的运输层协议 。例如,因特网有两种协议,即 TCP 和 UDP。每种协议都能为调用的应用程序提供一组不同的运输层服务。
因特网网络层协议有一个名字叫 IP ,即网际协议。IP 为主机之间提供了逻辑通信。 IP 的服务模型是尽力而为交付服务( best-effort delivery service)。这意味着 IP 尽它“最大的努力”在通信的主机之间交付报文段,但它并不做任何确保。特别是:
- 它不确保报文段的交付;
- 不保证报文段的按序交付;
- 不保证报文段中数据的完整性。
由于这些原因,IP 被称为不可靠服务(unreliable service)。在此还要指出的是,每台主机至少有一个网络层地址,即所谓的 IP 地址 。
将主机间交付扩展到进程间交付被称为运输层的多路复用(transport-layer multiplexing)与多路分解(demultiplexing)。
TCP还为应用程序提供了几种附加服务:
- 可靠数据传输(reliable data transfer):通过使用流量控制、序号、确认和定时器, TCP 确保正确地、按序地将数据从发送进程交付给接收进程。
- 拥塞控制(congestion control):TCP 拥塞控制防止任何一条 TCP 连接用过多流量来淹没通信主机之间的链路和交换设备。TCP 力求为每个通过一条拥塞网络链路的连接平等地共享网络链路带宽。这可以通过调节 TCP 连接的发送端发送进网络的流量速率来做到。在另一方面, UDP流量是不可调节的。使用 UDP传输的应用程序可以根据其需要以其愿意的任何速率发送数据。
多路复用与多路分解
多路复用与多路分解,也就是将由网络层提供的主机到主机交付服务延伸到为运行在主机上的应用程序提供进程到进程的交付服务。
一个进程(作为网络应用的一部分)有一个或多个 套接字(socket),它相当于从网络向进程传递数据和从进程向网络传递数据的门户。因此,在接收主机中的运输层实际上并没有直接将数据交付给进程,而是将数据交付给了一个中间的套接字 。由于在任一时刻,在接收主机上可能有不止一个套接字,所以每个套接字都有唯一的标识符。标识符的格式取决于它是 UDP 还是 TCP 套接字。
将运输层报文段中的数据交付到正确的套接字的工 作称为多路分解(demultiplexing)。在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息(这将在以后用于分解)从而生成报文段,然后将报文段传递到网络层,所有这些工作称为多路复用(multiplexing)。
- 套接字有唯一标识符;
- 每个报文段有特殊字段来指示该报文段所要交付到的套接字。字段是源端口号字段(source port number field)和目的端口号字段( destination port number field)
- 无连接的多路复用与多路分解:一个 UDP 套接字是由一个二元组来全面标识的,该二元 组包含一个目的 IP 地址和一个目的端口号。
- 面向连接的多路复用与多路分解:一个TCP套接字是由一个四元组(源 IP 地址,源端口号,目的 IP 地址,目的端口号)来标识的。
无连接运输:UDP
UDP 只是做了运输协议能够做的最少工作。除了复用/分解功能及少量的差错检测外,它几乎没有对 IP 增加别的东西。
有许多应用更适合用 UDP:
- 关于何时、发送什么数据的应用层控制更为精细。
- 无需连接建立。
- 无连接状态。
- 分组首部开销小。每个 TCP 报文段都有 20 字节的首部开销,而 UDP 仅有 8 字节的开销。
UDP报文段结构
源端口号 | 目的端口号 | 长度 | 检验和 | 单位 |
---|---|---|---|---|
8 | 8 | 8 | 8 | 比特 |
UDP检验和
发送方的 UDP 对报文段中的所有 16 比特字的和进行反码运算,求和时遇到的任何溢出都被回卷(加 1 )。得到的结果被放在 UDP 报文段中的检验和字段。
可靠传输原理
实现这种服务抽象是可靠数据传输协议(reliable data transfer protocol)的责任。
经完全可靠信造的可靠数据传输: rdt 1.O
经具有比特差错信道的可靠数据传输: rdt 2.0
这种报文协议使用了肯定确认(positive acknowledg- ment)与否定确认(negativeacknowledgment)。这些控制报文使得接收方可以让发送方知道哪些内容被正确接收,哪些内容接收有误并因此需要重复。在计算机网络环境中,基于这样重传机制的可靠数据传输协议称为自动重传请求(Automatic Repeat reQuest, ARQ)协议。
rdL2.1:考虑到 Ack 或 NAck 丢失或损坏的情况,在数据分组中添加一新字段,让发送方对其数据分组编号,即将发送数据分组的序号(sequencenumber)放在该字段。于是,接收方只需要检查序号即可确定收到的分组是否是一次重传。
对于停等协议这种简单情况,1 比特序号就足够了,因为它可让接收方知道发送方是杏正在重传前一个发送分组(接收到的分组序号与最近收到的分组序号相同),或是一个新分组(序号变化了,用模 2 运算“前向”移动)。
经具有比特差错的丢包信道的可靠数据传输: rdt 3.0
为了实现基于时间的重传机制,需要一个倒计数定时器(countdown timer),在一个给定的时间量过期后,可中断发送方。
流水线可靠数据传输协议
回退 N 步(Go-Back-N,GBN)
在回退 N 步(GBN)协议中,允许发送方发送多个分组(当有多个分组可用时)而不需等待确认,但它也受限于在流水线中未确认的分组数不能超过某个最大允许数 N。
随着协议的运行,该窗口在序号空间向前滑动。因此,N 常被称为窗口长度(window size), GBN 协议也常被称为滑动窗口协议(sliding-window protocol)。
使用累积确认是 GBN 一个自然的选择。
在 GBN 协议中,接收方丢弃所有失序分组。
选择重传(Selective Repeat, SR)
选择重传(SR)协议通过让发送方仅重传那些它怀疑在接收方出错(即丢失或受损)的分组而避免了不必要的重传。
SR 接收方将确认一个正确接收的分组而不管其是否按序。失序的分组将被缓存直到所有丢失分组(即序号更小的分组)皆被收到为止,这时才可以将一批分组按序交付给上层。
面向连接的运输:TCP
- TCP 被称为是面向连接的( connection- oriented )。
- TCP 连接提供的是全双工服务 (full-duplex service )。
- TCP 连接也总是点对点( point-to-point )的。
三次握手初期设置的发送缓存( send buff er ),TCP 可从缓存中取出并放人报文段中的数据数量受限于最大报文段长度( Maximum Segmenl Size, MSS), MSS 通常根据最初确定的由本地发送主机发送的最大链路层帧长度(即所谓的最大传输单元( Maximum Transmission Unit, MTU ))来设置。
TCP 报文段结构
TCP 的首部一般是 20 字节(比 UDP 首部多 12 字节)。
源端口号 | 目的端口号 | 序号 | 确认号 | 首部长度 | 保留未用 | URG | ACK | PSH | RST | SYN | FIN | 接收窗口 | 因特网检验和 | 紧急数据指针 | 选项 | 单位 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
16 | 16 | 32 | 32 | 4 | 6 | 1 | 1 | 1 | 1 | 1 | 1 | 16 | 16 | 16 | ~ | bit |
- 序号和确认号:TCP 把数据看成一个无结构的、有序的字节流,一个报文段的序号( sequence number for a segment )因此是该报文段首字节的字节流编号。
- 4 比特的首部长度字段( header length field ):该字段指示了以 32 比特的字为单位 TCP 首部长度,由于 TCP 选项字段的原因,TCP 首部的长度是可变的。(通常,选项字段为空,所以 TCP 首部的典型长度就是 20 字节。)
- 可选与变长的选项字段( options field ):该字段用于发送方与接收方协商最大报文
段长度( MSS )时,或在高速网络环境下用作窗口调节因子时使用。 - 16 比特的接收窗口字段( receive window field ):该字段用于流量控制 。
往返时间的估计与超时
- 估计往返时间
大多数 TCP 的实现仅在某个时刻做 SampleRTT 测量,而不是为每个发送的报文段测量一个 SampleRTT。
TCP 维持一个 SampleRTT 均值(称为 EstimatedRTT) 一旦获得一个新 SampleRTT 时, TCP 就会根据下列公式来更新 EstimaLedRTT:
EstimatedRTT = (1 - α)· EstimatedRTT + α·SampleRTT(α=0.125)
RTT 偏差 DevRTT,用于估算 SampleRTT一般会偏离 EstimatedRTT 的程度:
DevRTT = (1-β)· DevRTT + β·|SampleRTI - EstimatedRTT|(β=0.25)
- 设置和管理重传超时间隔
TimeoutInterval = EstimatedRTT + 4·DevRTT
推荐的初始 TimeoutInterval 值为 1 秒,当出现超时后,TimeoutInterval 的值将加倍,以免即将被确认的后继报文段过早出现超时。且一旦报文段收到并更新 EstimatedRTT 后,需要使用上述公式重新计算TimeoutInterval。
可靠数据传输
在 TCP 发送方有3个与发送和重传有关的主要事件:从上层应用程序接收数据;定时器超时和收到 ACK。
- 超时间隔加倍
- 快速重传:如果 TCP 发送方接收到对相同数据的 3 个冗余 ACK ,就执行快速重传(fast retransmit)。
- 由于 TCP 只是对已经接收到的最后一个按序字节数据进行重复确认,所以当接收到的报文段失序时可能会产生一个冗余 ACK。
- TCP 的差错恢复机制为 GBN 协议与 SR 协议的混合体。
流量控制
TCP 通过让发送方维护一个称为接收窗口( receive window ,rwnd)的变量来提供流量控制。通俗地说,接收窗口用于给发送方一个指示一一该接收方还有多少可用的缓存空间:
- LastByteRead:主机上的应用进程从缓存读出的数据流的最后一个字节的编号。
- LastByteRcvd:从网络中到达的并且已放入主机 接收缓存中的数据流的最后一个字节的编号。
- LastByteRcvd - LastByteRead ≤ Rev Buffer
- rwnd = RcvBuffer - (LastByteRcvd - LastByteRead)
- 发送方:LastByteSent - LastByteAcked ≤ rwnd
TCP 连接管理
SYN->SYNACK->FIN->ACK
拥塞控制原理
拥塞信息从网络反馈到发送方的两种方式:
- 直接反馈信息可以由网络路由器发给发送方,通常采用了一种阻塞分组( choke packet )的形式。
- 路由器标记或更新从发送方流向接收方的分组中的某个字段来指示拥塞的产生,一旦收到一个标记的分组后,接收方就会向发送方通知该网络拥塞指示。(至少要经过一个RTT。)
TCP拥塞控制
运行在发送方的 TCP 拥塞控制机制跟踪一个额外的变量,即拥塞窗口( congestion window,cwnd )。
LastbyteSent - LastByteAcked ≤ min{cwnd,rwnd}
一个 TCP 发送方的“丢包事件”定义为: 要么出现超时,要么收到来自接收方的 3 个冗余 ACK。
- 慢启动
cwnd 的值以 1 MSS开始并且每当传输的报文段被确认就倍增。
- 超时: TCP 发送方将 cwnd 设置为 1 并重新开始慢启动过程,它还将第二个状态变量的值 ssthresh(“慢启动阔值”的速记)设置为 cwnd/2。
- cwnd超过ssthresh:转移到拥塞避免状态。
- 检测到3个冗余ACK:转移到快速恢复状态。
- 拥塞避免
每当传输的报文段被确认就增加一个MSS。
- 超时:cwnd 的值减半。
- 检测到3个冗余ACK:转移到快速恢复状态。
- 快速恢复
在快速恢复中,对于引起 TCP 进入快速恢复状态的缺失报文段,对收到的每个冗余的ACK, cwnd 的值增加一个 MSS。
- 吞吐量
当拥塞发生时,窗口长度为W字节。
一条连接的平均吞吐量 = 0.75 ✘ W / RTT
L表示丢包率。
一条连接的平均吞吐量 = 1.22 ✘ MSS / RTT ✔L
- 公平性
拥塞控制机制是多个 TCP 连接最终收敛到共享带宽的状态。
影响公平性:
- UDP
- 并行TCP连接