第3章 传输层
文章目录
目标:
理解传输层的工作原理
多路复用/解复用
可靠数据传输
流量控制
拥塞控制
学习Internet的传输层协议
UDP:无连接传输
TCP:面向连接的可靠传 输
TCP的拥塞控制
3.1 概述和传输层服务
传输服务和协议
- 为运行在不同主机上的应用进程提供逻辑通信
- 传输协议运行在端系统
- 发送方:将应用层的报文分成报文段,然后传递给网络层
- 接收方:将报文段重组成报文,然后传递给应用层
- 有多个传输层协议可供应用选择
- Internet: TCP(字节流的服务,不保证界限) 和 UDP
传输层 vs. 网络层
-
网络层服务:主机之间的逻辑通信
-
传输层服务:进程间的逻辑通信
- 依赖于网络层的服务
- 延时、带宽
- 并对网络层的服务进行增强
- 数据丢失、顺序混乱、 加密
- 依赖于网络层的服务
有些服务是可以加强的:不可靠 -> 可靠;安全
但有些服务是不可以被加强的:带宽,延迟
Internet传输层协议
可靠的、保序的传输: TCP(字节流的服务)
- 多路复用、解复用
- 拥塞控制
- 流量控制
- 建立连接
不可靠、不保序的传输:UDP(数据包的服务)
- 多路复用、解复用
- 没有为尽力而为的IP服务添加更多的其它额外服务
都不提供的服务: 延时保证 带宽保证
3.2 多路复用与解复用
多路复用/解复用(一个TCP/UDP实体上有很多应用进程借助其发送)
在发送方主机多路复用
从多个套接字接收来自多个进程的报文,根据套接字对应的IP地址和端口号等信息对报文段用头部加以封装 (该头部信息用于以后的解复用)
在接收方主机多路解复用
根据报文段的头部信息中的IP地址和端口号将接收到的报文段发给正确的套接字(和对应的应用进程)
多路解复用工作原理
- 解复用作用:TCP或者UDP实体采 用哪些信息,将报文段的数据部分 交给正确的socket,从而交给正确 的进程
- 主机收到IP数据报
- 每个数据报有源IP地址和目标地 址
- 每个数据报承载一个传输层报 文段
- 每个报文段有一个源端口号和 目标端口号 (特定应用有著名的端口号)
- 主机联合使用IP地址和端口号将报文段发送给合适的套接字
无连接(UDP)多路解复用
当创建UDP段采用端口号,可以指定: • 目标IP地址 • 目标端口号
当主机接收到UDP段时: • 检查UDP段中的目标端 口号 • 将UDP段交给具备那个端口号的套接字
目标IP地址,目标端口号一样发送给同一个进程
面向连接(TCP)的多路复用
TCP套接字:四元组本 地标识: 源IP地址 源端口号 目的IP地址 目的端口号
解复用:接收主机用 这四个值来将数据报 定位到合适的套接字
socket 和message
3.3 无连接传输:UDP
UDP: User Datagram Protocol 用户数据包协议
在IP(主机到主机)所提供的基础上增加了一个多路复用/解复用(进程到进程)的服务
-
“尽力而为”的服务,报文 段可能
- 丢失
- 送到应用进程的报文段乱序(延迟不一样)
-
无连接:
- UDP发送端和接收端之间没有握手
- 每个UDP报文段都被独立地处理
-
UDP 被用于:
- (实时)流媒体(丢失不敏感, 速率敏感、应用可控制 传输速率)
- DNS
- SNMP
- 事务性的应用(一次性往返搞定)
-
在UDP上可行可靠传输:
- 在应用层增加可靠性
- 应用特定的差错恢复
UDP:用户数据报协议
为什么要有UDP?
-
不建立连接 (会增加延时)
-
简单:在发送端和接收端没有连接状态
-
报文段的头部很小(开销小)
-
无拥塞控制和流量控制:UDP可以尽可能快的发送报文段
-
应用->传输的速率 = 主机->网络的速率 (忽略头部时)
UDP校验和
目标: 检测在被传输报文段中的差错 (如比特反转)
发送方:
将报文段的内容视为16 比特的整数
校验和:报文段的加法和(1的补运算)
发送方将校验和放在 UDP的校验和字段
接收方:
计算接收到的报文段的校验和
检查计算出的校验和与校验和字段的内容是否相等:
不相等––检测到差错
相等––没有检测到差错 ,但也许还是有差错 (残存错误,为检测出来)
Internet校验和的例子
注意:当数字相加时,在最高位的进位要回卷(加到最低位上),再加到结果上
目标端:校验范围+校验和=1111111111111111 通过校验
否则没有通过校验
注:求和时,必须将进位回卷到结果上
3.4 可靠数据传输的原理
可靠数据传输(rdt)的原理 rdt(Reliable Data Transfer)
rdt在应用层、传输层和数据链路层都很重要
是网络Top 10问题之一
信道的不可靠特点决定了可靠数据传输协议( rdt )的复杂性
渐增式地开发可靠数据传输协议( rdt )的发送方和接收方
只考虑单向数据传输
但控制信息是双向流动的!
双向的数据传输问题实际上是2个单向数据传输问题的综合
使用有限状态机 (FSM) 来描述发送方和接收方
Rdt1.0: 在可靠信道上的可靠数据传输
下层的信道是完全可靠的
- 没有比特出错
- 没有分组丢失
发送方和接收方的FSM
- 发送方将数据发送到下层信道
- 接收方从下层信道接收数据
发送方:接收–封装–打走 接收方:解封装–交付 什么都不用干
Rdt2.0:具有比特差错的信道
下层信道可能会出错:将分组中的比特翻转
用校验和来检测比特差错
问题:怎样从差错中恢复:
确认(ACK):接收方显式地告诉发送方分组已被正确接收
否定确认( NAK): 接收方显式地告诉发送方分组发生了差错
• 发送方收到NAK后,发送方重传分组
rdt2.0中的新机制:采用差错控制编码进行差错检测
发送方差错控制编码、缓存
接收方使用编码检错
接收方的反馈:控制报文(ACK,NAK):接收方->发送方
发送方收到反馈相应的动作
Rdt2.0:FSM描述
发送方接收nak (接收方检测出错) ,将之前封装的package重传,直到收到ack才开始下一轮的发送
rdt2.0的致命缺陷!-> rdt2.1
如果ACK/NAK出错?
发送方不知道接收方发生了什么事情!
发送方如何做?
重传?可能重复
不重传?可能死锁(或出 错)
需要引入新的机制
序号
处理重复:
发送方在每个分组中加 入序号
如果ACK/NAK出错,发送方重传当前分组
接收方丢弃(不发给上层)重复分组
接收方通过序号判断,是否重复接收同样的包,在进行下一次流程/发送ack
停等协议: 发送方发送一个分组, 然后等待接收方的应答
发送方:
- 在分组中加入序列号
两个序列号(0,1)就 足够了
一次只发送一个未经确认 的分组 - 必须检测ACK/NAK是否 出错(需要EDC )
状态数变成了两倍
必须记住当前分组的序列号为0还是1
接收方:
- 必须检测接收到的分组是否是重复的
状态会指示希望接收到的 分组的序号为0还是1
注意:接收方并不知道 发送方是否正确收到了 其ACK/NAK
rdt2.1的运行
接收方不知道它最后发送的ACK/NAK是否被正确地收到
发送方不对收到的ack/nak给确认,没有所谓的确认的确认;
接收方发送ack,如果后面接收方收到的是:
老分组p0?则ack 错误
下一个分组?P1,ack正确
rdt2.2:无NAK的协议
- 功能同rdt2.1,但只使用ACK(ack 要编号)
- 接收方对最后正确接收的分组发ACK,以替代NAK
- 接收方必须显式地包含被正确接收分组的序号
- 当收到重复的ACK(如:再次收到ack0)时,发送方与收到NAK采取相同的动作:重传当前分组
- 为后面的一次发送多个数据单位做一个准备
- 一次能够发送多个
- 每一个的应答都有:ACK,NACK;麻烦
- 使用对前一个数据单位的ACK,代替本数据单位的nak
- 确认信息减少一半,协议处理简单
NAK free