计算机网络——运输层
概述
计算机网络体系结构中的物理层、数据链路层以及网络层它们共同解决了将主机通过异构网络互联起来所面临的问题,实现了主机到主机的通信。
但实际上在计算机网络中进行通信的真正实体是位于通信两端主机中的进程。
如何为运行在不同主机上的应用进程提供直接的通信服务是运输层的任务,运输层又称为端到端协议。
根据应用需求的不同,因特网的运输层为应用层提供了两种不同的运输协议,即面向连接的 TCP 和无连接的 UDP。
运输层端口号、复用与分用
端口号
因特网上的计算机并不是使用统一的操作系统,不同的操作系统(如 Windows、Linux、Mac OS)使用不同格式的进程标识符 PID。
为了使运行不同操作系统的计算机的应用进程之间能够进行网络通信,就必须使用统一的方法对 TCP/IP 体系的应用进程进行标识。
TCP/IP 体系的运输层使用端口号来区分应用层的不同应用进程。
- 端口号使用 16 比特表示,取值范围为 0~65535;
- 熟知端口号:0~1023,IANA 把这些端口号指派给了 TCP/IP 体系中最重要的一些网络协议,例如:FTP 使用 21/20,HTTP 使用 80,DNS 使用 53。
- 登记端口号:1024~49151,为没有熟知端口号的应用程序使用。使用这类端口号必须在 IANA 按照规定的手续登记,以防止重复。例如,微软 mstsc 端口号 3389。
- 短暂端口号:49152~65535,留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后,这个端口号可供其他客户进程以后使用。
- 端口号只具有本地意义,即端口号只是为了标识本计算机应用层中的各进程,在因特网中,不同计算机中的相同端口号是没有联系的。
发送方的复用和接收方的分用
发送方的某些应用进程所发送的不同应用报文,在运输层使用 UDP 协议进行封装,这称为 UDP 复用;而另一些应用进程所发送的不同应用报文,在运输层使用 TCP 协议进行封装,这称为 TCP 复用。
运输层使用端口号来区分不同的应用进程。不管是使用运输层的 UDP 协议封装成的 UDP 用户数据报,还是使用 TCP 协议封装成的 TCP 报文段,在网络层都需要使用 IP 协议封装成 IP 数据报,这称为 IP 复用。
IP 数据报首部中协议字段的值用来表明 IP 数据报的数据载荷部分封装的是何种协议数据单元。取值为 6,表示封装的是 TCP 报文数据段;取值为 17,表示封装的是 UDP 用户数据报;
接收方的网络层收到 IP 数据报后进行 IP 分用。若 IP 数据报首部中协议字段的值为 17,则把 IP 数据报的数据载荷部分所封装的 UDP 用户数据报上交运输层的 UDP;若协议字段的值为 6,则把 IP 数据报的数据载荷部分所封装的 TCP 报文段上交运输层的 TCP。
运输层对 UDP 用户数据报进行 UDP 分用,对 TCP 报文段进行 TCP 分用。也就是根据端口号,将它们交付给上层相应的应用进程。
UDP 和 TCP 的对比
UDP 和 TCP 是 TCP/IP 体系结构运输层中的两个重要协议。
- 用户数据报协议 UDP(User Datagram Protocol)
- 传输控制协议 TCP(Transmission Control Protocol)
UDP | TCP | |
---|---|---|
是否面向连接 | 无连接 | 面向连接 |
发送目标 | 单播 | 单播、多播、广播 |
对应用报文的处理 | 面向应用报文 | 面向字节流 |
传输可靠性 | 不可靠 | 可靠 |
首部字节 | 8 个字节(源端口、目的端口、长度、校验和) | 20-60 个字节 |
TCP 的流量控制
一般来说,我们总是希望数据传输得更快一些,但如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失。
所谓流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制可以很方便地在 TCP 连接上实现对发送方的流量控制。
- TCP 接收方利用自己的接收窗口大小来限制发送方发送窗口的大小。
- TCP 发送方收到接收方的零窗口通知后,应启动持续计时器。持续计时器超时后,向接收方发送零窗口探测报文。
TCP 的拥塞控制
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏。这种情况就叫做拥塞(congestion)。
在计算机网络中的链路容量(即带宽)、交换节点中的缓存和处理机等,都是网络的资源。
若出现拥塞而不进行控制,整个网络的吞吐量(单位时间内从网络输出的分组数量)将随输入负载(单位时间内输入给网络的分组数量)的增大而下降。
四种拥塞控制算法:
- 慢开始(slow-start)
- 拥塞避免(congestion avoidance)
- 快重传(fast retransmit)
- 快恢复(fast recovery)
假设:发送方向接收方发送 TCP 数据报文段,接收方向发送方发送 TCP 确认报文段。
发送方维护一个叫做拥塞窗口 cwnd 的状态变量,其值取决于网络的拥塞程度,并且动态变化。
- 拥塞窗口 cwnd 的维护原则:只要网络没有出现拥塞,拥塞窗口就再增大一些;但只要网络出现拥塞,拥塞窗口就减少一些。(敌进我退,敌退我进)
- 判断出现网络拥塞的依据:没有按时收到应当到达的确认报文(即发生超时重传)。
发送方将拥塞窗口作为发送窗口 swnd,即 swnd = cwnd。
发送方维护一个慢开始门限 ssthresh 状态变量:
- 当 cwnd < ssthresh 时,使用慢开始算法;
- 当 cwnd < ssthresh 时,停止使用慢开始算法而改用拥塞避免算法;
- 当 cwnd = ssthresh 时,既可以使用慢开始算法,也可使用拥塞避免算法。
TCP 超时重传时间的选择
超时重传时间 RTO 应略大于往返时间 RTT。但是由于 TCP 下层是复杂的互联网环境,主机所发送的报文段可能只经过一个高速率的局域网,也有可能经过多个低速率的网络,并且,每个 IP 数据报的转发路由还可能不同。每次的往返时间 RTT 通常不同。
不能直接使用某次测量得到的 RTT 样本来计算超时重传时间 RTO。应该利用每次测量得到的 RTT 样本,计算加权平均往返时间 RTTs(又称为平滑的往返时间)。
在上式中,\(0 \leq \alpha < 1\):
若 \(\alpha\) 很接近于 \(0\),则新的 \(RTT\) 样本对 \(RTT_s\) 的影响不大;
若 \(\alpha\) 很接近于 \(1\),则新的 \(RTT\) 样本对 \(RTT_s\) 的影响较大;
已成为建议标准的 RFC6298 推荐的 \(\alpha\) 值为 \(1/8\),即 \(0.125\)。
用这种方法得出的加权平均往返时间 \(RTT_s\) 就比测量出的 RTT 值更加平滑。
RFC6298 建议使用下式计算超时重传时间 RTO:
\(RTO = RTT_s + 4 \times RTT_D\)
\(RTT_D\):RTT 偏差的加权平均
(计算公式略)
TCP 可靠传输的实现
TCP 基于以字节为单位的滑动窗口来实现可靠传输
TCP 的通信是全双工通信
TCP 的运输连接管理
TCP 的连接建立
三次握手,略
TCP 的连接释放
四次挥手,略
TCP 报文段的首部格式
固定首部(20 字节)
源端口(16 比特)
写入源端口号,用来标识发送该 TCP 报文段的应用进程。
目的端口(16 比特)
写入目的端口号,用来标识接收该 TCP 报文段的应用进程。
序号 seq(32 比特)
取值范围 \([0, 2^{32}-1]\),序号增加到最后一个后,下一个序号就又回到 0。
指出本 TCP 报文段数据载荷的第一个字节的序号。
确认号 ack(32 比特)与确认标志位 ACK(1 比特)
取值范围 \([0, 2^{32}-1]\),确认号增加到最后一个后,下一个确认号就又回到 0。
指出期望收到对方下一个 TCP 报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。
只有当确认标志位 ACK 取值为 1 时确认号字段才有效。
TCP 规定,在连接建立后所有传送的 TCP 报文段都必须把 ACK 置 1。
数据偏移(4 比特)
以 4 字节为单位。用来指出 TCP 报文段的数据载荷部分的起始处距离 TCP 报文段的起始处有多远。(实际上是指出了 TCP 报文段的首部长度)
保留(6 比特)
置为 0,保留为今后使用。
窗口(16 比特)
以字节为单位。指出发送本报文段的一方的接收窗口。
窗口值作为接收方让发送方设置其发送窗口的一句这是以接收方的接受能力来控制发送方的发送能力,称为流量控制。
校验和(16 比特)
检查范围包括 TCP 报文段的首部和数据载荷两部分。
同步标志位 SYN(1 比特)
在 TCP 连接建立时用来同步序号。
终止标志位 FIN(1 比特)
用来释放 TCP 连接。
复位标志位(1 比特)
用来复位 TCP 连接。
当 RST = 1 时:
- TCP 连接出现了异常,必须释放连接,然后再重新建立连接。
- 拒绝一个非法的报文段或拒绝打开一个 TCP 连接。
推送标志位 PSH(1 比特)
接收方的 TCP 收到该标志位为 1 的报文段会尽快上交应用进程,而不必等到接收缓存都堆满后再向上交付。
紧急指针(16 比特)与紧急标志位 URG(1 比特)
以字节为单位,用来指明紧急数据的长度。将紧急数据插队到发送缓存的最前面。
只有当紧急标志位取值为 1 时,紧急指针字段才有效。
扩展首部(最大 40 字节)
选项(长度可变)
最大报文段长度 MSS 选项:TCP 报文段数据载荷部分的最大长度。
窗口扩大选项:为了扩大窗口(提高吞吐率)。
时间戳选项:
- 用来计算往返时间 RTT
- 用来处理序号超范围的情况,又称为防止序号绕回 PAWS
选择确认选项:用来实现选择确认功能。
填充
由于选项的长度可变,因此使用填充来确保报文段首部能被 4 整除。(因为数据偏移字段以 4 字节为单位)