传输层概述
传输层协议为运行在不同Host上的进程,提供了一种逻辑通信机制,端到端的
逻辑:两个进程间好像直接连接的
发送方:将应用层递交的消息分成一个或多个Segment,向下传至网络层
接收方:将接收到的Segment组装成消息,向上交给应用层
传输层vs网络层
不同:
1、网络层提供主机与主机之间的逻辑通信机制
2、传输层提供应用进程之间的逻辑通信机制
联系:
1、传输层位于网络层之上;
2、传输层依赖于网络层服务;
3、传输层对网络层服务进行(可能的)增强
Internet提供的协议
TCP
可靠(不会丢失)、按序(按照发送顺序)的交付服务
1、拥塞控制;
2、流量控制;
3、连接建立
UDP
不可靠的交付服务
基于“尽力而为”的网络层,没有做(可靠性方面的)扩展
两种服务均不提供延迟和带宽方面的保障
复用和解复用
为什么?
基本原则:如果某层的一个协议对应直接上层的多个协议/实体,则需要复用/分用技术
因为网路层针对主机,传输层针对进程,并且每台主机上含有多个进程,所以需要多路复用和多路分用技术。
以下图为例:
主机2中有两个进程,p1和p2要接受来自其他主机的消息时,涉及多路分用,传输层必须要做的一件事就是必须把从网络层接收到的Segment传输至对应的进程
多路复用是针对从传输层至网络层
多路分用和多路复用
多路分用:传输层依据头部信息将收到Segment交给正确的Socket,即不同的进程
多路复用:从多个Socket接收数据,为每块数据封装上头部信息,生成Segment,交给网络层
多路分用?
主机(网络层)接收到IP数据报
- 每个数据报携带源IP地址、目的IP地址
- 每个数据报里都有一个Segment
- 每个Segment里都有源端口号和目的端口号
TCP/UDP下Segment格式如下:
主机收到Segment后,传输层协议提取IP地址和端口号信息,依据端口号将Segment传至相应的Socket(TCP会做更多处理)
无连接多路分用
UDP的socket用二元组来标识(目的IP地址,目的端口号)
这样的话会导致来自不同源IP地址或源端口号的IP数据包若目的IP和端口均相同后会被导向同一个Socket
如下图所示:
面向连接多路分用
TCP的socket用四元组标识(源IP地址、源端口号、目的IP地址、目的端口号)
此时不同源IP地址或源端口号就会对应不同的Socket
如下图所示:
多线程形式:
UDP
基于IP协议;复用/分用;简单的错误校验,不进行错误恢复
为什么要在传输层做错误检测?
端到端的原则,第一点是不能保证所经过的每一个链路层均有错误检验机制,路由器在存储-转发的过程中也可能出错。
“Best effort”服务,可能丢失,可能非按序到达
无连接,发送方和接收方之间不需要握手建立连接,每个报文段间互相独立
为什么存在?
- 不需要建立连接,减少延迟,这也是为啥DNS使用UDP
- 实现简单,无需维护连接状态
- 头部开销少,UDP8字节,TCP20字节
- 没有拥塞控制,应用可更好地控制发送时间和速率
应用
常用于流媒体应用:容忍数据包丢失、速率敏感,对速度要求高
DNS和SNMP
如何在UDP上实现可靠数据传输?
在应用层增加可靠性机制,应用开发难度加大
应用特定的错误恢复机制
报文段格式
UDP校验和
目的:检测UDP段在传输中是否发生错误(0变1,1变0)
发送方:
- 将段的内容视为16-bit整数,段的内容包括UDP伪首部、UDP首部和数据报文
- 校验和计算:计算所有整数的和,进位加在和后面,将得到的值按位求反,得到校验和
- 将校验和放入校验和字段
接收方:
计算所收到段的校验和,与校验和字段进行对比
相等是指没有检测出错误,但可能有错误
比如两个位发生了翻转,正好抵消
示例: