第三章、运输层(重点知识梳理)

本文深入探讨了运输层的服务,重点讲解了UDP协议和可靠数据传输的原理。介绍了UDP的无连接特性、报文段结构及其检验和机制,同时详细阐述了可靠数据传输协议(rdt)的发展,包括rdt1.0、rdt2.0、rdt2.1、rdt2.2和rdt3.0,以及选择重传(SR)策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.1概述和运输层服务

 

3.1.1运输层概述

运输层协议是为运行在不同主机上的应用进程之间提供逻辑通信

传输协议运行在端系统

  • 发送方:将应用层的报文分成报文段,然后传递给网络层
  • 接收方:将报文段重组成报文,然后传递给应用层

有多个传输层协议可供应用选择

  • Internet:TCP和UDP

3.1.2传输层和应用层的关系

传输层vs网络层

网络层服务:主机之间的逻辑通信

传输层服务:进程之间的逻辑通信

  • 依赖于网络层的服务(延时、带宽)
  • 并对网络层的服务进行增强(数据丢失、顺序混乱、加密)

有些服务是可以加强的,(不可靠到可靠、安全);但有些服务是不可以被加强的(带宽、延迟)。

3.2多路复用和多路分解

多路分解:将传输层报文段的数据到正确的套接字的工作。

多路复用:在源主机从不同套接字中收集数据块,并为每个数据块装上首部信息(这将在以后用于分解)从而生成报文段,然后将报文段传递到网络层的工作。

多路解复用的工作原理:

  • 解复用作用:TCP或者UDP实体采用哪些信息,将报文段的数据部分交给正确的进程
  • 主机收到IP数据报

              每个数据报有元IP地址和目标地址

              每个数据报承载一个传输层报文段

              每个报文段有一个源端口号和目标端口号(特定应用有署名的端口号)

  • 主机联合使用IP地址和端口号将报文段发送给合适的套接字

 1.无连接的多路复用与多路分解

  • 创建套接字

服务器端:

server socket=socket(PF_INET,SOCK_DGRAM,O);

bind(server socket,&sad,sizeof(sad);

server socket和sad的端口号捆绑

客户端:

没有Blind,client socket和OS为之分配的某个端口号捆绑(客户端使用什么端口号无所谓,客户端主动找服务器)

  • 在接收端,UDP套接字用二元组标识(目标IP地址,目标端口号)
  • 当主机收到UDP报文段:检查报文段的目标端口号    用该端口号将报文段定位给套接字
  • 如果两个不同源IP地址/源端口号的数据报,但是有相同的目标IP地址和端口号,则北定位到相同的套接字
2.面向连接的多路复用和多路分解
3.Web服务器与TCP

3.3无连接运输:UDP(User Datagram Protocol)---用户数据报协议

“尽力而为的服务”,报文段可能

  • 丢失
  • 送到的应用进程的报文段乱序

无连接

  • UDP发送端和接收端之间没有握手
  • 每个UDP报文段都被独自的处理

UDP被用于

  • 流媒体(丢失不敏感,速率敏感,应用可控制传输速率)
  • DNS
  • SNMP

在UDP上实现可靠传输:

  • 在应用层增加可靠性
  • 应用待定的差错恢复

为什么要有UDP?

  • 不建立连接(会增加延时)
  • 简单:在发送端和接收端没有连接状态
  • 报文段的头部很小(开销很小)
  • 无拥塞控制和流量控制,UDP可以尽可能快的发送报文段

应用--传输速率=主机--网络的速率

3.1.1UDP报文段结构

3.3.2 UDP检验和

目标:检测在被传输报文段中的差错(如比特反转)

发送方:

  • 将报文段的内容视为16比特的整数
  • 校验和:报文段的加法和(1的补运算)
  • 发送方将校验和放在UDP的校验和字段

接收方:

  • 计算接收到的报文段的校验和
  • 检查计算出的校验和字段的内容是否相等,不相等---检查到差错;相等---没有检查到差错(可能还存在差错)

 3.4可靠数据传输

3.4.1可靠数据(rdt)传输的原理

  • rdt在应用层,传输层和数据链路层都很重要
  • 是网络Top10问题之一
  • 信道的不可靠特点决定了可靠数据传输协议(rdt)的复杂性

我们将:

  • 渐增式地开发可靠数据传输协议(rdt)的发送方和接受方
  • 只考虑单向传输    但控制信息是双向流动的!
  • 双向流动的数据传输问题实际上是2个单向数据传输问题的综合
  • 使用有限状态机(FSM)来描述发送方和接受方

3.4.2 rdt1.0:在可靠信道上的数据传输

下层的信道是完全可靠的

  • 没有比特差错
  • 没有分组丢失

发送方和接收方的FSM

  • 发送方和数据发送到下层信道
  • 接收方从下层信道接收数据

3.4.3 rdt2.0:具有比特差错的信道

用校验和来检验比特差错

问题:怎么从差错中恢复;

  • 确认(ACK):接收方显式地告诉发送分组已被正确接收
  • 否认确认(NAK):接收方显式地告诉发送方分组发生了丢失    发送方收到NAK后,发送方重传分组

rdt2.0中的新机制:采用差错控制编码进行差错检测

  • 发送方差错控制编码,缓存
  • 接收方使用编码检错
  • 接收方的反馈:控制报文(ACK,NAK):接收方----发送方
  • 发送方收到反馈相应的动作

3.4.4 rdt2.1发送方和接收方处理出错的ACK/NAK 

rdt2.1:讨论

发送方:

  • 在分组中加入序列号
  • 两个序列号(0,1)就足够了    一次只发送一个未经确认的分组
  • 必须检测ACK/NAK是否出错(EDC)
  • 状态数变成了两倍           必须记住了当前分组的序列号为0还是1

接收方:

  • 必须检测接收方的分组是否是重复的    状态会指示希望接收到的分组的序号为0还是1

注意:接收方并不知道发送方是否正确接收到了其ACK/NAK

  •     没有安排确认的确认
  • 具体解释见下

接收方不知道最后发送的ACK/NAK是否被正确地收到

  • 发送方不对收到的ACK/NAK给确认,没有所谓的确认的确认;
  • 接收方发送ACK,如果后面接收方收到的是:

           老分组PO?  则ACK错误

           下一个分组?p1,ACK正确

3.4.5 rdt2.2:无NAK的协议 

功能同rdt2.1,但只使用ACK(ACK要编号)

接收方对最后正确接收的分组发送ACK以代替NAK

  • 接收方必须是显示地包含被正确接受分组的序号

当收到重复的ACK(如:再次收到ack0),发送方与收到NAK采取相同的动作:重传当前分组

为后面的一次发送多个数据单位做一个准备

  • 一次发送多个
  • 每一个的应答都有:ACK,NAK;麻烦
  • 使用对前一个数据单位的ACK,代替本数据单位的NAK
  • 确认信息减少的一半,协议处理简单

3.4.6 rdt3.0:具有比特差错和比特丢失的信道 

  • 新的假设:下层信道可能会丢失分组(数据或ACK)
  • 会锁死
  • 机制还不够处理这种状况:

        检验和    序列号    ACK    重传

方法:发送方等待ACK一段合理的时间

  • 发送方端时重传;如果到时没有收到ACK----重传
  • 问题;如果分组(ACK)只是被延迟了;

                重传将会导致数据重复,但利用序列号已经可以处理这个问题

                接收方必须指明备被正确接收的序列号

  • 需要一个倒计时定时器

链路层的time out时间是确认的

传输层timeout时间是适应式的

  • 过早超时(延迟的ACK)也能够正常工作;但是效率较低,一般的分组和确认是重复的
  • 设置一个合理的超时时间也是比较重要的

rdt3.0的性能

  • rdt3.0可以工作,但是链路容量比较大的情况下,性能较差

链路容量比较大,一次发一个PDU的不能够充分利用链路的传输能力

 3.4.7 选择重传(SR)

  • 接收方对每一个正确接收的分组,分别发送ACKn(非累计确认)

接收方窗口>1    可以缓存乱序的分组

  • 发送方只对那些没有收到ACK的分组进行重发-选择性重发

        发送方为每一个未确认的分组设定一个计时器

  • 发送窗口的最大值(发送缓冲区)限制发送未确认分组的个数

选择重传

发送方:

从上层接收数据:

  • 如果下一可用该分组的序号可在发送窗口中,则发送time out(n):
  • 重新发送分组n,重新设定定时器 
  • 将分组n标记为已接收
  • 如n为最小未确认的分组序号,将base移到下一未确认序号

接收方:

  • 发送ACK(n)
  • 乱序:缓存
  • 有序:该分组及以前缓存的序号连续的分组交付给上层,然后将窗口移动到下一个仍未被接收的分组
  • 忽略该分组

3.5面向连接的传输:TCP

  •  点对点:

一个发送方,一个接收方

  • 可靠的,按顺序的字节流:

没有报文边界

  • 管道化(流水线):

TCP拥塞控制和流量控制设置窗口大小

  • 发送和接收缓存
  • 全双工数据:

在同一连接中数据流双向流动

MSS:最大报文段大小

  • 面向连接    在数据交换之前,通过握手(交换控制报文)初始化发送方,接收方的状态变量
  • 有流量控制    发送方不会淹没接收方

TCP序号,确认号

  • 序号:报文段首字节在字节流的编号
  • 确认号:

                   期望从另一方收到的下一字节的序号

                    累计确认

     Q:接收方如何处理乱序的报文段--没有规定

       TCP往返时延(RTT)和超时

Q:怎样设置TCP超时?

  • 比RTT要长  但RTT是变化的
  • 太短:太早超时           不必要的重传
  • 太长:对报文段丢失    反应太慢,消极 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值