夜间模式暗黑模式
字体
阴影
滤镜
圆角
第 5 章 运输层

第 5 章 运输层

5.1 运输层协议概述

5.1.1 功能

  • 运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。
  • 两个主机进行通信实际上就是两个主机中的应用进程互相通信。
  • 应用进程之间的通信又称为端到端的通信。
  • 运输层协议和网络层协议的主要区别

5.1.2 端口

  • 概念:传输层服务访问点
    • 链路层通过MAC地址寻址
    • 网络层通过IP地址寻址
    • 传输层按照端口号寻址
  • 软件端口与硬件端口
    • 在协议栈层间的抽象的协议端口是软件端口。
    • 路由器或交换机上的端口是硬件端口。
  • 三类端口
    • 熟知端口,数值一般为 0~1023。
    • 登记端口号,数值为1024~49151,为没有熟知端口号的应用程序使用的。使用这个范围的端口号必须在 IANA 登记,以防止重复。
    • 客户端口号或短暂端口号,数值为49152~65535,留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后,这个端口号可供其他客户进程以后使用。

5.1.3 无连接服务和面向连接服务

  • 无连接服务
    • 用户数据报协议UDP(User Datagram Protocol)
  • 面向连接服务
    • 传输控制协议 TCP(Transmission Control Protocol)

5.2 用户数据报协议 UDP:User Datagram Protocol

5.2.1 UDP 概述

  • 无连接的,尽最大可能交付,数据无需确认。
  • 网络出现的拥塞不会使源主机的发送速率降低(无拥塞控制)。
  • 支持一对一、一对多、多对一和多对多的交互通信。
  • 报文段头部小,开销小。

5.2.2 UDP 数据报

  • 首部 + 数据(如下所示)image-20200417175904188

5.2.3 UDP效验

  • 伪首部(从数据报所在IP分组头的分组头中提取)只用于计算和验证校验和,不传送。
  • 计算校验和前要加上伪首部。
  • 若计算时数据长度不为偶数需要填充0

5.3 传输控制协议 TCP:Transmission Control Protocol

5.3.1 TCP 特点

  • 是面向连接的,提供可靠交付。
  • 每一条 TCP 连接只能是点对点的(一对一)。
  • 报头段头部长,传输开销大。
  • 面向字节

5.3.2 TCP报文段

image-20200417182309068

  • 序号 seq:占4B,用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。
  • 确认号 ack:占4B,表示期望收到的下一个TCP报文段的第一个字节序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节(501~700),因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。
  • 数据偏移(首部长度):占4位,指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。最小单位4B, 最长为15(1111~0001)* 4B
  • 保留字段:占6位,今后使用。
  • 紧急URG:URG=1,表明有紧急数据,需要尽快传送,需要与紧急指针配合使用。不进入缓冲!
  • 确认 ACK :当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。
  • 推送比特PSH:PSH=1,尽快交付应用程序,不需要等缓冲满,再向上交付。
  • 复位RST:RST=1,出现了严重差错,必须释放连接,再重新建立。
  • 同步 SYN :在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。
  • 终止 FIN :用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。
  • 窗口字段 :窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
  • 校验和字段:检验首部和数据两部分。检验前要加上12B的伪首部(与UDP类似,但将17改为6)。
  • 紧急指针字段:2B
  • 选项字段:长度可变。
  • 填充字段:为了使整个首部长度为4B的整数倍。

5.3.3 TCP 连接

  • 三阶段:连接建立、数据传输、连接释放。
  • TCP 连接的端点叫做套接字(socket)或插口。
    • 套接字 socket = (IP地址: 端口号)
  • 三次握手

image-20200417214051463

    1. 假设 A 为客户端,B 为服务器端。 B 处于 LISTEN(监听)状态,等待客户的连接请求。
    2. A 向 B 发送连接请求报文,SYN = 1,选择一个初始的序号 seq = x, 表明传送数据时的第一个数据字节是序号x。
    3. B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,ack = x+1,同时也选择一个初始的序号 seq = y。
    4. A 收到 B 的连接确认报文后,还要向 B 发出确认 ACK = 1,ack = y+1,seq = x+1。
    5. B 收到 A 的确认后,连接建立。
  • 四次挥手

image-20200417220259307

    1. A发送连接释放报文,FIN=1,seq = u,此时 A停发数据。
    2. B收到之后发出确认,ACK = 1, ack = u+1, seq = v,B通知高层,此时TCP属于半关闭状态,B能向 A发送数据,但是A不能向B发送数据。
    3. 当 B不再需要向 A发送数据时,发送连接释放报文,FIN=1,ACK = 1, ack = u+1, seq = w。
    4. A收到后发出确认 ACK = 1,seq = u+1,ack= w+1,进入 TIME-WAIT状态,等待 2 MSL(最大报文存活时间)后释放连接。
    5. B收到 A的确认后释放连接。
  • 为什么TCP在建立连接时不能每次选择相同的、固定的初始序号?
    1. 假定A和B频繁建立连接,传送一些数据后,释放连接。
    2. 假定每一次建立连接,A主机都选择相同的、固定的初试序号。
    3. 假定主机 A发送的某些 TCP在网络中滞留了较长时间,以致造成主机A超时重传这些报文。
    4. 假定有一些报文在重传之前到达主机 B,此时传送该报文的连接已经释放,到达时已经是一条新的 TCP连接。
    5. 这样主机 B可能会接收到过时的、没有意义的报文段,从而导致错误。
    • 所以,必须是迟到的 TCP报文段的序号不处在新的连接所使用的的序号范围之内。
  • 为啥不用“两次握手”建立连接?
    • “三次握手”完成了两个重要功能:
      1. 双方做好发送数据的准备
      2. 允许双方就初始序列号进行协商,在握手过程中被发送和确认。
    • 若改成“两次握手”,则有可能发送死锁。A给B发送了一个连接请求分组,B收到了分组,并发送了确认应达分组。由于采用“两次握手”协议, B认为连接已经成功建立,并开始发送数据。此时,若B的应达分组在传输中丢失,A不知道B是否已经准备好,且不知道B发送数据的初始序列号,将忽略 B发送的数据。A甚至怀疑B是否收到自己的连接请求分组。在这种情况下,A重发连接请求分组,且只等待 B的连接确认应达分组;B重发数据分组。形成了死锁。
  • 为什么不采用“三次挥手”释放连接,且发送最后“一次挥手”报文后要等到2MSL(最长报文寿命)的时间呢?
    • 为啥要“四次挥手”?
      • 客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。
    • 为啥要“TIME_WAIT = 2MSL”?
      1. 为了保证A发送的最后一个确认报文能够到达B。如果A不等待2MSL,A返回的最后确认报文段丢失,则 B不能进入正常关闭状态,而 A此时已经关闭,也不可能再重传。
        1. 防止出现“已失效的连接请求报文段”。 A在发送完最后一个确认报文段后,再经过 2MSL可保证本连接持续的时间内所产生的的所有报文段从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。情况与“两次握手”相同。

5.3.4 可靠传输

  1. TCP数据编号与确认
    • 采用累积确认。
    • ACK = 1, seq = x, ack = ?
    • ACK = 1, ack = x+1(表示期待收到第x+1个序号), seq = ?
  2. TCP的重传机制
    • 每发送一个报文,就对改报文进行计时。到了重传时间,就开始重传。
    • 采用自适应算法来计算超时计时器的重传时间。
      • RTO(超时重传时间)略大于RTT

5.3.5 流量控制 Flow Control

  • 流量控制是为了控制发送方发送速率,保证接收方来得及接收。
  • 利用滑动窗口实现流量控制
    • 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
    • TCP为每一个连接设有一个持续计时器。只要TCP连接的一方收到对方的零窗口,就启动持续计时器。若持续计时器设置的时间到期了,就发送一个零窗口探测报文段(仅携带1B数据),对方在确认这个探测报文段是给出了现在的窗口值,若为0,继续重设持续计时器,不为0,就打破了死锁的僵局。
    • 可用不同的机制来控制TCP报文段的发送时机。
      1. TCP维持一个变量,它等于最大报文长度(MSS)。只要缓存中存放的数据达到MSS字节时,就组装成一个TCP报文段发送出去。
      2. 由发送方的应用进程指明要求发送报文段,即TCP支持的推送(push)操作。
      3. 发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但不能超过MSS)发送出去。

5.3.6 拥塞控制 Congestion Control

  1. 概念如果网络出现拥塞,网络的性能将变坏,整个网络的吞吐量将随输入负荷的增大而下降,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度(动态过程)。

    开环控制和闭环控制

  2. 拥塞控制方法(四大算法)
    • 发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。
    1. 慢开始
    2. 拥塞避免
    3. 快重传
    4. 快恢复。

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

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

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

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

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

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

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

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

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

暂无评论

发送评论 编辑评论


				
上一篇
下一篇