运输层(一)

运输层 | 为运行在不同主机上的应用进程提供了逻辑通信功能

运输层服务

运输层协议在端系统中实现(不是路由器),

  • 发送端:将从发送应用程序进程接收到的报文转换成运输层分组(报文段,segment),实现方法是将报文划分成较小的块,为每个块加上一个运输层首部以生成运输层报文段
  • 接收端:网络层从数据报中提取运输层报文段,并向上交给运输层

运输层和网络层间区别:

网络层是主机间通信,运输层是主机进程间通信

类比案例:

image-20220407105707573.png

运输层协议能够提供的服务受制于底层网络层协议的服务模型

因特网运输层

网络协议IP为主机间提供逻辑通信,服务模型是尽力而为交付服务(best-effort delivery service),不确保报文段的顺序交付和完整性。因此被称为不可靠服务

TCP(传输控制协议):可靠的、面向连接

UDP(用户数据报协议):不可靠的、无连接

多路复用(multiplexing)和多路分解(de~)

多路复用:在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段

多路分解:将运输层报文段中的数据交付到正确的套接字

image-20220413223606259.png

多路复用:

image-20220413233211509.png

主机接收IP数据报,每个数据报携带一个传输层的报文段;主机使用IP+port传送报文段到正确套接字

port:16bits,0-65535(0-1023:周知well-known;1024-49151:registered;49152-65535:dynamic or private)

无连接的

UDP套接字:二元组(目的IP,目的端口号)

image-20220413234533831.png

面向连接的

TCP套接字:四元组(源IP地址,源端口号,目的IP地址,目的端口号)

image-20220413235630796.png

现在P4、P5、P6都合并为一个进程,每新建一个连接就创建一个新的线程

UDP(User Datagram Protocol)

无连接的:发送报文段前,发送方和接收方的运输层实体之间没有握手

应用:

  • 流媒体应用程序
  • DNS:避免了TCP的连接创建时延
  • SNMP(Simple Network Management Protocol)
  • RIP(Routing Information Protocol)

为什么用UDP

  • 没有拥塞控制:如果用TCP,信息传输链路如果拥堵会继续重新发送直到得到接收方收到确认,不管可靠交付多长时间;而UDP不用这样,可以满足实时应用的特点
  • 无需建立连接:TCP传输数据前还需要经过三次握手,UDP不需任何准备即可开始传输数据,减少了延迟
  • 无连接状态:UDP不维护连接状态,支持更多的活跃用户
  • 分组首部开销少:TCP 20 bytes,UDP 8 bytes

UDP报文段结构

image-20220414085033998.png

UDP检验和(checksum)

检验UDP报文段传输过程中其中的比特是否发生改变

发送方:对所有16比特字的和进行反码运算→循环进位累加(最高位溢出右移与最低位相加)再求反码,得到的结果放入UDP检验和字段中

接收方:全部的16比特字进行相加(包括检验和),如果和=1111111111111111,可能无错误;否则出错

eg:image-20220414091025404.png

为什么使用检验和

  • 不能保证源和目的之间的所有链路都提供差错检测
  • 报文段存储时可能引入比特差错
  • 差错检测作为一种保险措施(提供检测,但是对差错无能为力:丢弃受损报文段 或 交给应用程序并给出警告)

可靠数据传输原理

image-20220414095016293.png

考虑单向数据传输,FSM:finite state machines有限状态机

rdt1.0:经完全可靠信道的可靠数据传输

底层信道完全可靠:没有比特差错、没有分组损失,接收端不需要提供反馈信息给发送方

image-20220414095851722.png

rdt2.0:经具有比特差错信道的可靠数据传输

底层信道发生比特错误,仍假设分组会按顺序接收,检验和来检查比特错误

此时需要自动重传请求协议(ARQ,Automatic Repeat reQuest):有误的内容重传

  • 差错检测
  • 接收方反馈:ACK(acknowledgement)、NAK(negative acknowledgement),若收到接收方返回的NAK,发送方重传
  • 重传

image-20220414102540741.png

image-20220414102638775.png

在等待ACK、NAK时,不能发送新的数据分组:停等协议(stop-and-wait),如图红线所示

image-20220414103245396.png

发送出错

image-20220414103322594.png

rdt2.0存在致命性缺陷:ACK、NAK有可能损坏

方案:正确收到ACK则发新数据,正确收到NAK或者无法确认收到的ACK、NAK则重发老数据

如果在发送方收到不清楚的ACK或NAK时,这种方法在发送方到接收方的信道中引入了冗余分组(duplicate packet),困难在于接收方不知道发送方是否正确收到上次所发的ACK或NAK

解决:在数据分组中添加新字段,让发送方对数据分组编号

rdt2.1

sender:

image-20220414110713854.png

receiver:

image-20220414111046406.png

rdt2.2

无NAK可靠数据传输协议,此时两次接收到相同的ACK相当于最后一次没有接收到正确分组(NAK)

当发送方收到接收方反馈的ACK中出现冗余情况(即接收方并未收到预期编号的正确数据包,isACK()),发送方认为刚才发送的数据存在错误,则重发该数据。

sender:

image-20220414111556932.png

receiver:

image-20220414111629460.png

rdt3.0:经有比特差错的丢包信道的可靠数据传输

假定除了比特受损外,底层信道还会丢包,需要关注怎么检测丢包以及发生丢包后该做什么

方案:发送方传输一个数据分组,该分组或接收方对该分组的ACK发生了丢失,此时发送方都收不到接收方的响应,如果发送方愿意等待足够长时间以便确定分组已丢失,只需重传数据分组即可

为了实现基于时间的重传机制,需要一个倒计时定时器(countdown timer)

image-20220414172612665.png

比特交替协议 alternating-bit

image-20220416165138733.png

image-20220416165155798.png

image-20220416165211645.png

image-20220416165231197.png

流水线可靠数据传输协议

rdt3.0仍是一个停等协议,发送利用率很低

方案:不以停等方式运行,允许发送方发送多个分组而无需等待确认→流水线(pipelining)技术

image-20220416165758384.png

(停等发送)

image-20220416165839679.png

(流水线发送)

流水线技术的影响

  • 必须增加序号范围(每个输送中的分组【不重传的】必须有一个唯一的序号)
  • 协议的发送方和接收方都需要缓存多个分组(发送方最低限度应当能够缓冲那些已发送但没有确认的分组)

GBN:回退N步

Go-back-N:

  • 发送方发送多个分组而不需等待确认,流水线中可存在N个未被确认的数据包
  • 接收方需发送累计确认(cumulative ack):如果出现间断就不发ack
  • 发送方为最早未被确认数据包维护一个定时器

发送方

image-20220416170518181.png

N被称为窗口长度(window size),GBN协议也被称为滑动窗口协议(sliding-window protocol),存在限制是为了进行流量限制

NOTE:TCP序号是按字节流中的字节进行计数的,不是按分组计数

扩展的FSM

发送方:

  • 上层的调用(invocation from above):发送方首先查看窗口是否已满

    • 不满:创建分组并发送
    • 已满:只需将数据返回给上层
  • 收到ACK:累计确认,必须正确接收序号
  • 超时事件:超时则重传所有未被确认的分组

image-20220416171542506.png

接收方:

image-20220416171614910.png

  • 丢弃所有失序分组,只需维护下一个按序节后的分组的序号

eg:

image-20220416174007207.png

SR:选择重传

GBN一个问题是需要重传大量分组,如果窗口长度和带宽时延很大

Selective repeat:

  • 发送方只需重传没有收到ACK的分组(使用计时器限时)
  • 也使用和GBN相同的窗口限制未完成、未被确认的分组
  • 接收方确认一个正确接收的分组而不管其是否按序(缓存失序的分组)

image-20220416175328075.png

发送方:

  • 从上层收到数据:同GBN
  • 超时
  • 收到ACK:若分组序号在窗口内,则发送方标记为已接收;若分组序号等于send_base,则窗口序号前移到具有最小序号的未确认分组处,窗口移动后有序号落在窗口内且未发送,则发送这些分组

接收方:

  • 序号在[rcvbase, rcvbase+N-1]被正确接收:发送ACK回发送方;若该分组以前没收到过,缓存该分组;若该分组序号等于接收窗口的基序号,则该分组以及以前缓存的序号连续的分组交付给上层。然后接收窗口向前移动分组的编号向上交付这些分组
  • 序号在[rcvbase-N, rcvbase-1]被正确接收:必须产生一个ACK,即使该分组是接收方以前已确认过的分组
  • 其他:忽略

eg:

image-20220416182551695.png

小结:

发展顺序

检验和:rdt2.0

确认(ACK):rdt2.0

否认确认:rdt2.0

序号:rdt2.1

定时器:rdt3.0

窗口、流水线:rdt3.0+

最后修改:2022 年 06 月 15 日
如果觉得我的文章对你有用,请随意赞赏