计算机网络学习笔记:运输层

运输层概述

网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。

传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。

运输层协议

  • 在端系统中实现,仅在端系统中工作

  • 通过划分应用层报文并为每小块加入运输层首部,将应用程序进程的报文转换成运输层分组,即运输层报文段

  • 基本责任

    • 多路复用与多路分解(与在某层的单一协议何时被位于接下来的较高层的多个协议使用有关)

      • 多路分解

        在目标主机将到达的报文段数据定位到对应进程的套接字,将运输层报文段中的数据交付到正确的套接字的工作。

      • 多路复用

        在源主机从不同套接字中收集数据块并为每个数据块封装首部信息生成报文段,然后将报文段发送到网络层。

      • 要求

        1)套接字有唯一标识符;2)每个报文段有特殊字段来指示该报文段所要交付到的套接字(源 / 目的端口号字段)。

    • 完整性检查

    • 差错检查

与网络层的关系

  • 网络层提供主机之间的逻辑通信
  • 运输层位于网络层之上,为运行在不同主机上的进程间提供逻辑通信
  • 运输层所能提供的服务常常受制于网络层协议的服务模型,如时延与带宽保证等

UDP

服务

  • 不可靠,但是可以通过在应用程序自身中建立可靠性机制实现可靠数据传输
  • 无连接,在发送报文之前发送方与接收方的运输层实体之间没有握手
  • 流量不可调节

常用场景

  • DNS

首部格式

计算机网络学习笔记:运输层_第1张图片

首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和。12 字节的伪首部是为了计算检验和临时添加的。

  • UDP 套接字

    由一个包含目的 IP 地址与目的端口号的二元组来全面标识。

    两个 UDP 到达报文若具有不同源 IP 地址和 / 或源端口号,但是具有相同的目的 IP 地址和目的端口号,那么这两个报文段将通过相同的目的套接字被定向到相同的目的进程。

  • 源端口号

    作为“返回地址”的一部分。当目的进程需要回发一个报文段给源进程时,此时新的目的端口号即从原始源端口号中取值。

  • 检验和

    用于接收方检查报文段中是否出现差错(端到端基础上在运输层提供差错检测,端到端原则),仅可检验,无法恢复受损。

优点

  • 关于何时、发送什么数据的应用层控制更为精细
    • TCP 存在拥塞控制延迟传送时间
    • 实时应用要求最终小发送速率、不希望延迟发送、能够容忍部分数据丢失
  • 无需连接建立,速度较快
  • 无连接状态,能够支持更多的活跃客户
  • 分组首部开销小,8 字节。(TCP 20)

缺点

  • 无拥塞控制可能导致路由器中有大量的分组溢出
  • 高丢包率
  • 不公平性,可能挤垮 TCP 会话

TCP

首部格式

计算机网络学习笔记:运输层_第2张图片

  • TCP 套接字

    由四元组(源 IP 地址,源端口号,目的 IP 地址,目的端口号)标识。

    两个 TCP 到达报文若具有不同源 IP 地址或源端口号,但是具有相同的目的 IP 地址和目的端口号,将被定向到不同的套接字,除非 TCP 报文段携带了初始创建连接的请求。

    TCP 套接字可并行,每个套接字与一个进程相联系并由其四元组来标识每个套接字。

    连接套接字与进程之间并非总是一一对应的,高性能 Web 服务器通常仅使用一个进程,但是为每个新的客户连接创建一个具有新连接套接字的新线程(轻量级子进程)。持续 HTTP 情况下,在整条连接持续期间客户与服务器间经由同一个服务器套接字交换 HTTP 报文。

  • 首部:

    包括源端口号与目的端口号,被用于多路复用 / 分解来自或送到上层应用的数据。

  • 序号

    32 比特,用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401(建立在传送的字节流之上,而不是传送的报文段序列之上,报文段的序号即该报文段首字节的字节流编号)。用于可靠数据传输。

  • 确认号

    32 比特,期望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。用于可靠数据传输。

  • 数据偏移 (首部长度):

    指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。4 比特,指示了以 32 比特的字为单位的 TCP 首部长度。由于选项字段的关系,TCP 首部长度可变。

  • 选项:

    用于发送方与接收方协商最大报文段长度(MMS,实质是应用层数据最大长度,不包括 TCP 首部)时,或在高速网络环境下用作窗口调节因子时使用。

  • 确认 ACK

    当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。

  • 同步 SYN

    在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。

  • 终止 FIN

    用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。

  • 紧急 URG 与 PSH:(实践中没有使用)

    URG 指示报文段里存在着被发送端的上层实体置为紧急的数据,紧急数据最后一个字节由 16 比特的紧急数据指针字段指出。当紧急数据存在并给出指向紧急数据尾的指针的时候,TCP 必须通知接收端的上层实体。

    当 PSH 被设置时,指示接收方应立即将数据交付给上层实体。

  • 接收窗口

    16 比特,窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。用于流量控制。

可靠传输

数据可以通过可靠信道进行传输,借助于可靠信道,数据不会收到损坏或丢失,均按序传输、交付。

其下层协议可能不可靠,如:可靠 TCP 下层 IP 不可靠。可直接将较低层视作不可靠的点对点信道。

比特差错

自动重传请求 ARQ 协议

要求发送方重复发送接收有误的内容

  1. 差错检测:需要除待发送数据之外的额外比特

  2. 接收方反馈(ACK NAK 分组本身不需要序号,默认是最近发送的分组反馈):

    1. 肯定确认 ACK 1
    2. 否定确认 NAK 0

    (反馈也可能受损,可通过增加检验和的方式进行检验,并通过增加足够多的检验和或为数据分组添加序号字段并重传当前数据分组的方式进行处理)

  3. 重传数据

停等协议

发送方在没有确定接收方收到正确分组时不会发送新数据。

问题:发送方利用率(发送方实际忙于将发送比特送进信道的时间与发送时间之比)很低。

丢包与超时重传

可能是数据丢包也可能是响应丢包。

TCP 使用超时重传(单一重传定时器)来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认(包含有效 ACK 字段值的报文段),那么就重传这个报文段并重启定时器。

  1. 发送方设定时间阈值,超出该阈值未接收到响应则判定为丢包
  2. 重传数据,可能产生冗余数据分组(重复传送)

时间阈值确定

一个报文段从发送再到接收到确认所经过的时间称为往返时间 RTT,加权平均往返时间 RTTs 计算如下:
在这里插入图片描述

其中,0 ≤ a < 1,RTTs 随着 a 的增加更容易受到 RTT 的影响。

超时时间 RTO 应该略大于 RTTs,TCP 使用的超时时间计算如下:

在这里插入图片描述

其中 RTTd 为偏差的加权平均值。

累积确认

TCP 仅确认传输流中至第一个丢失字节为止的字节,即提供累积确认,正确接收但是失序的报文段不会被接收端逐个确认。发送方仅需维护已发送过但未被确认的字节的最小序号和下一个要发送的字节的序号。

发送端若收到序号为 120 的确认码,则默认接收端已经收到了序号为 119 及之前的所有字节。

流水线可靠传输

特性:

  • 允许发送方发送多个分组而无需等待确认,提高发送方利用率
  • 从发送方向接收方输送的分组可视作是被填充到一条流水线中

影响:

  • 需要增加序号范围
  • 协议的发送方与接收方两端也许必须缓存多个分组
  • 所需序号范围和对缓冲的要求取决于数据传输协议如何处理丢失、损坏及延时过大的分组

差错恢复

滑动窗口 / 回退 N 步

回退 N 步 GBN 协议也被称作滑动窗口协议,其允许发送方发送多个分组而无需等待确认,因为流量控制等原因,受限于在流水线中未确认的分组数不能超过某个最大允许数 N (即窗口长度,必须小于序号空间大小的一半)。

窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。

发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。

接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。

计算机网络学习笔记:运输层_第3张图片

选择重传 SR

选择重传协议能够使发送方仅重传其怀疑在接收方出错(丢失或受损)的分组,该协议要求接收方逐个地确认正确接收的分组。

发送方操作与 GBN 类似:

  • 从上层接收到数据时发送方检查下一个可用于该分组的序号,若序号在窗口内则打包发送;若不在则操作同 GBN,缓存数据或通知上层。
  • 收到 ACK 时,添加判断:
    • 若该分组序号在窗口内,标记为已接收;
    • 若分组序号等于窗口基序号,则基序号向前移动到具有最小序号的未确认分组处;
    • 若窗口移动了并有序号落在窗口内的未发送分组,则发送分组。
  • 超时事件:每个分组必须拥有自身的逻辑定时器,超时后只能发送一个分组。

接收方将确认一个正确接收的分组而不管其是否按序,失序分组将被缓存直到所有丢失分组(序号更小的分组)均被接收到才将一批分组按序交付给上层。

流量控制

流量控制是为了控制发送方发送速率,保证接收方来得及接收,消除发送方使接收方缓存溢出的可能性,是一个速度匹配服务。

TCP 通过使发送方维护接收窗口变量来实现流量控制,为全双工通信,在连接两端的发送方都各自维护一个接收窗口。

接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。但是该方案可能导致阻塞(接收方有了新的缓存空间但是发送方不知道),为了解决这个问题,TCP 规范中要求:当接收方的接收窗口为 0 时,发送方继续发送只有一个字节数据的报文段,这些报文会被接收方确认。最终接收方缓存将开始清空,并确认报文里将含有一个非 0 的窗口字段。

连接管理

三次握手

计算机网络学习笔记:运输层_第4张图片

假设 A 为客户端,B 为服务器端。

  • 首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。
  • A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。
  • B 收到连接请求报文,如果同意建立连接,则为该连接分配 TCP 缓存和变量,并向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。
  • A 收到 B 的连接确认报文后,为该连接分配缓存和变量,还要向 B 发出确认,确认号为 y+1,序号为 x+1,SYN 置为 0。
  • B 收到 A 的确认后,连接建立。

DoS

  • 问题:第三步之前所分配的缓存与变量使得 TCP 易受 SYN 洪泛 DoS 拒绝服务攻击,服务器收到大量 SYN 报文段,不断为这些半开连接分配资源,但是始终没有使用。
  • 解决:SYN cookie。服务器收到 SYN 报文段时不生成半开连接,而是生成一个初始的 TCP 序列号,即 cookie。服务器并不记忆 cookie 或是其他对应于 SYN 的其他状态信息。若客户合法,则返回 ACK 报文段,服务器验证该 ACK 是否与先前的某些 SYN 相对应,若对应,则生成一个具有套接字的全开连接。

原因

第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。

客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。

四次挥手

计算机网络学习笔记:运输层_第5张图片

以下描述不讨论序号和确认号,因为序号和确认号的规则比较简单。并且不讨论 ACK,因为 ACK 在连接建立之后都为 1。

  • A 发送连接释放报文,FIN=1。
  • B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。
  • 当 B 不再需要连接时,发送连接释放报文,FIN=1。
  • A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。
  • B 收到 A 的确认后释放连接。

四次挥手的原因

客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。

TIME_WAIT

客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:

  • 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。
  • 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。

拥塞控制

如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。

TCP 必须使用端到端的拥塞控制而不是使用网络辅助的拥塞控制,因为 IP 层不向端系统提供显式的网络拥塞反馈。TCP 使得每个发送方根据其所感知到的网络拥塞程度来限制其能向连接发送流量的速率。

计算机网络学习笔记:运输层_第6张图片

TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。

发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。

为了便于讨论,做如下假设:

  • 接收方有足够大的接收缓存,因此不会发生流量控制;
  • 虽然 TCP 的窗口基于字节,但是这里设窗口的大小单位为报文段。

计算机网络学习笔记:运输层_第7张图片

慢开始与拥塞避免

发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 …

注意到慢开始每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。设置一个慢开始门限 ssthresh(约是上次遇到拥塞时的值的一半),当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。

如果出现了超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始。

检测到三个冗余 ACK 则将 ssthresh 的值记录为 cwnd 的一半,结束慢开始,执行快速重传并进入快速恢复状态。

快重传与快恢复

若接收方收到的报文段中间出现间隔,即先到达了比期望序号大的失序报文,接收方则立即发送冗余 ACK,指示下一个期待字节的序号(其为间隔的低端的序号)。若发送方收到三个冗余 ACK,则 TCP 执行快速重传,在该报文段(已确认三次的)的定时器过期之前重传丢失的报文段。

该过程可视作回退 N 步 GBN 协议与选择重传 SR 协议的混合体。

在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。

在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3。

在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。

慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。

计算机网络学习笔记:运输层_第8张图片

UDP 和 TCP 的特点

  • 用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),支持一对一、一对多、多对一和多对多的交互通信。
  • 传输控制协议 TCP(Transmission Control Protocol)是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。

其他协议

数据报拥塞控制协议 DCCP

  • 提供了一种低开销、面向报文、类似于 UDP 的不可靠服务
  • 具有应用程序可选择的拥塞控制形式
  • 与 TCP 相兼容
  • 适用于可靠的或半可靠的数据传输,被设想用于诸如流媒体等应用程序中
  • 能够利用数据交付的预定时间和可靠性之间的折中,但是要对网络拥塞做出响应

流控制传输协议 SCTP

  • 可靠的、面向报文的协议
  • 允许几个不同的应用层次的“流”复用到单个 SCTP 连接上
  • 流间的处理是独立的,不会互相影响

TCP 友好速率控制 TFRC

  • 是一种拥塞控制协议,而不是一种功能齐全的运输层协议
  • 定义了一种拥塞控制机制,旨在平滑 TCP 拥塞控制中的锯齿行为,同时维护一种长期的发送速率,该速率合理地接近 TCP 的速率。
  • 适用于 IP 电话或流媒体等多媒体应用

参考:

https://cyc2018.github.io/CS-Notes/#/notes/计算机网络 - 传输层

《计算机网络:自顶向下方法》

你可能感兴趣的:(网络)