文章目录
传输层
基本理论和基本机制
- 多路复用/分用
- 可靠数据传输机制
- 流量控制机制
- 拥塞控制机制
传输层协议为运行在不同Host上的进程提供了一种逻辑通信机制(端到端)
端系统运行传输层协议
- 发送方:将应用递交的消息分成一个或多个的segment,并向下传给网络层
- 接收方:将接收到的segment组装成消息,并向上交给应用层
Internet传输层协议
- 可靠(不易丢失)、按序的交付服务(TCP)
- 拥塞控制
- 流量控制
- 连接建立
- 不可靠的交付服务(UDP)
- 只实现了传输层的必要的服务
- 两种服务均不保障
- 延迟
- 带宽
多路复用和多路分用
如果某层的一个协议对应直接上层的多个协议/实体,则需要复用/分用。
分用原理:
- 主机接收到IP数据报(datagram)
- 每个数据报携带源IP地址、目的IP地址。
- 每个数据报携带一个传输层的段(Segment)。
- 每个段携带源端口号和目的端口号
- 主机收到Segment之后,传输层协议提取IP地址和端口号信息,将Segment导向相应的Socket
- TCP做更多处理
分用工作:
-
无连接分用
- 利用端口号创建Socket
- DatagramSocket mySocket1 = new DatagramSocket(99111);
- DatagramSocket mySocket2 = new DatagramSocket(99222);
- UDP的Socket用二元组标识 (目的IP地址,目的端口号)
- 主机收到UDP段后
- 检查段中的目的端口号
- 将UDP段导向绑定在该端口号的Socket
- 来自不同源IP地址和/或源端口号的IP数据包被导向同一个Socket
- 利用端口号创建Socket
-
面向连接的分用
- TCP的Socket用四元组标识
- 源IP地址
- 源端口号
- 目的IP地址
- 目的端口号
- 接收端利用所有的四个值将Segment导向合适的Socket
- 服务器可能同时支持多个TCPSocket
- 每个Socket用自己的四元组标识
- Web服务器为每个客户端开不同的Socket
- TCP的Socket用四元组标识
UDP协议(User Datagram Protocol)
基于Internet IP 协议
- 复用/分用
- 简单的错误校验
"Best effort"服务,UDP端可能问题:
- 丢失
- 非按序到达
无连接协议
- UDP发送方和接收方之间不需要握手
- 每个UDP段的处理独立于其他段
- 因为不需要建立连接因此减少了延迟
- 实现简单——无需维护连接状态
- 头部开销少
- 没有拥塞控制——应用可更好的控制方法送时间和速率
用途
- 常用于流媒体应用
- 容忍丢失
- 速率敏感
- UDP还用于
- DNS
- SNMP
- 可靠数据传输
- 在应用层增加可靠性机制
- 应用特定的错误恢复机制
UDP校验和(checksum)
目的:检测UDP段在传输中是否发发生错误(如位翻转)
校验和的计算(发送方)
- 以IP首部中的校验和为例。
- 首先把校验和字段清零;
- 然后对每 16 位(2 字节)进行二进制反码求和;
- 反码求和时,最高位的进位要进到最低位,也就是循环进位。先取反后相加与先相加后取反,得到的结果是一样的
校验和的校验(接收方)
- 以IP首部中的校验和为例。
- 接收方进行校验时,也是对每16位(2字节)进行二进制反码求和。
- 接收方计算校验和时的首部与发送方计算校验和时的首部相比,多了一个发送方计算出来的校验和的反码。
- 如果首部在传输过程中没有发生差错,那么接收方计算的结果应该为全0。
可靠数据传输协议(rdt)
可靠——不错、不丢、不乱
-
rdt_send():应用层将数据交付给可靠传输协议(rdt)以发送 给对方
-
udt_send():被rdt调用,在不可靠的信道上向接收方传输数据
-
rdt_rcv():当数据包到达接收方信道时被调用
-
deliver_data():向上层应用交付数据
-
rdt_send()和deliver_data()是单向的,应用层发送和接收到的都是正确的
-
udt_send()和rdt_rcv()是双向的,说明在不可靠的信道通道进行数据传输,需要双向的控制消息流动
-
rdt1.0:可靠信道上的可靠数据传输
- 条件:底层信道完全可靠
- 不会发送错误
- 信道不会弄丢分组
- 条件:底层信道完全可靠
-
rdt2.0:产生位错误的信道
- 底层信道可能翻转分组中的位(bit)
- 利用校验和检测位错误
- 错误恢复
- 确认机制(Acknowlegements,ACK):接收方显示的告诉发送方分组已经正确接收。
- NAK:接收方显示的告诉发送方分组错误
- 发送方收到NAK后,重传分组
- 基于这种重传机制的rdt协议称为**ARQ(Automatic Repeat reQuest)**协议,Rdt2.0比Rdt1.0中新引入的新机制
- 差错检测
- 接收方反馈控制信息:ACK/NAK
- 重传
- 底层信道可能翻转分组中的位(bit)
-
rdt2.1:产生位错误的信道
-
如果ACK/NAK 消息发生错误/被破坏(corrupted)会怎么样
- 为ACK/NAK增加校验和,检错并纠错
- 如果ACK/NAK 坏掉,发送方重传
- 不能会简单的重传:产生重复分组
-
如何解决重复分组问题
- 增加序列号(sequence number):发送方给每个分组增加序列号
- 接收方丢弃重复分组
- 发送方为每个纷纷组增加了序列号(0,1),01两个即可
- 注意:第一条数序列号seq=0,当收到接收方返回该数据已经收到且无损害时,seq=1,表示第二条数据,两个序列号够用,因为使用了停等协议。
-
-
rdt2.2:无NAK消息协议(与rdt2.1功能相同,但是只是用ACK)
- 接收方通过ACK告知最后一个被正确接收的分组
- 在ACK消息中显式地加入被确认分组的序列号
- 发送发放收到重复ACK之后,采取与收到NAK消息相同的动作
- 重传当前分组
- 重传当前分组
-
rdt3.0
- 能够正确工作,但性能很差
- 网络协议限制了物理资源的利用
- 网络协议限制了物理资源的利用
- 能够正确工作,但性能很差
因为信道既可能发生错误,也可能丢失分组,即“校验和+ 序列号+ACK+重传” 不够用了,如果第一次发送丢失,发送方和接收方都不知道怎么处理。
- 方法:发送方等待“合理”时间
- 如果没有收 到ACK,重传
- 如果分组或ACK只是延迟而不是丢了
- 需要定时器