计算机网络学习笔记(三)- 传输层(上)
传输层服务概述
- 传输层协议为运行在不同host上的进程提供了一种逻辑通信机制
(注:网络层是提供host之间的逻辑通信机制)
• 位于网络层之上
• 依赖于网络层服务
• 对网络层服务进行(可能的)增强 - 端系统运行传输层协议
• 发送方:将应用递交的消息分成一个或多个的segment,并向下传给网络层。
• 接收方:将接收到的segment组装成消息,并向上交给应用层。 - 传输层可以为应用提供多种协议
• TCP
• UDP
多路复用与分用
-
接收端进行多路分用
传输层依据头部信息将收到的Segment交给正确的Socket,即不同的进程 -
发送端进行多路复用
从多个Socket接收数据,为每块数据封装上头部信息,生成Segment,交给网络层 -
无连接分用
• 利用端口号创建Socket
• UDP的Socket用二元组标识(目的IP地址,目的端口号)
• 主机收到UDP段后
• 检查段中的目的端口号
• 将UDP段导向绑定在该端口号的Socket
注:UDP的Socket使用二元组标识仅能标识唯一的Socket,因此来自不同源IP地址和源端口号的IP数据包将被导向同一个Socket(下图中SP仅提供返回地址,并未起到标识作用) -
面向连接分用
• TCP的Socket用四元组标识
源IP地址
源端口号
目的IP地址
目的端口号
• 接收端利用所有的四个值将Segment导向合适的Socket
• 服务器可能同时支持多个TCPSocket
每个Socket用自己的四元组标识
• Web服务器为每个客户端开不同的Socket
无连接传输协议
UDP: User Datagram Protocol [RFC 768]
UDP概述
- 基于Internet IP协议
• 复用/分用
• 简单的错误校验 - “Best effort”服务,UDP段可能丢失
- 无连接
• UDP发送方和接收方之间不需要握手
• 每个UDP段的处理独立于其他段
UDP存在原因
- 无需建立连接(减少延迟)
- 实现简单:无需维护连接状态
- 头部开销少
- 没有拥塞控制: 应用可更好地控制发送时间和速率
UDP校验和(checksum)
- 目的:检测UDP段在传输中是否发生错误(如位翻转)
- 发送方
• 将段的内容视为16-bit整数
• 校验和计算:计算所有整数的和,进位加在和的后面,将得到的值按位求反,得到校验和
• 发送方将校验和放入校验和字段 - 接收方
• 计算所收到段的校验和
• 将其与校验和字段进行对比
• 不相等:检测出错误
• 相等:没有检测出错误(但可能有错误)
注:最高位进位必须被加进去
可靠数据传输原理
可靠数据传输协议
- 可靠数据传输对应用层、传输层、链路层都很重要
- 信道的不可靠特性决定了可靠数据传输协议(rdt)的复杂性
下图为可靠数据传输协议结构: - rdt_send():被上层应用调用,将数据交给rdt以发送给对方
- udt_send(): 被rdt调用,在不可靠信道上向接收方传输数据
- rdt_rcv(): 当数据包到达接收方信道时被调用
- deliver_data(): 被rdt调用,向上层应用交付数据
RDT1.0:可靠信道上的可靠数据传输
- 假设底层信道完全可靠
• 不会发生错误
• 不会丢弃分组 - 采用状态机刻画传输协议,如下所示:
- 伪代码如下:
// 发送端
loop(forever)
if(call from above) // 应用层调用,传送数据给网络层
rdt_send(data);
packet = make_pkt(data); //报文分段
udt_send(packet);
end
end
// 接收端
loop(forever)
if(call from below) // 网络层调用,传送数据给应用层
rdt_rev(packet);
packet = extract(packet