传输层
运输层概述
概述
面向通信的最高层,面向应用的最底层
只有位于网络边缘部分的主机才有运输层,路由器最高到网络层,也就是说数据在网络上传输的过程中并没有用到传输层
主机通信:本质上来讲是应用进程到应用进程的通信
运输层的功能:
- 提供应用进程之间的逻辑通信,如微信到微信,QQ 到 QQ,而不能微信到 QQ
- 提供端到端服务,如 P2P 下载器
不同于网络层,网络层提供的是主机到主机的通信
层级 | 通信范围 |
---|---|
数据链路层 | PPP/HDLC:点对点;局域网:MAC 通信 |
网络层 | 主机到主机 |
传输层 | 端到端;进程到进程 |
功能
一个计算机具有很多进程,需要提供 IP 分用和复用的功能
TCP/IP 模型的运输层有两个主要协议
- 用户数据报协议 UDP
- 传输控制协议 TCP
两个对等运输实体在通信时传送的数据单位叫做运输协议数据单元 TPDU
TCP:提供全双工的可靠协议,数据单位协议是 TCP 报文段
- 面向连接的协议,提供面向连接服务
- 只支持点对点单播
- 复杂,如电子邮件、万维网、文件传输
UDP:提供不可靠的通信,数据单位协议是 UDP 报文或用户数据报
- 无连接的协议,提供无连接服务
- 单播、多播、广播
- 简单,如多媒体应用
传输层的功能
- 传输层的分用和复用
- 流量控制
- 可靠传输
- 拥塞控制
端口
使用端口号的方法对不同进程进行标识
有了端口以后,我们可以通过 IP+端口 的方式区分不同网络的不同进程
端口用一个 16 位端口号进行标志,运行 65535 个不同的端口号,并且,端口号只具有本地意义,即只用于标识本主机应用层的各进程
两大类端口
- 服务器端使用的端口号
- 客户端使用的端口:比较大,四万往上
常见端口
- RPC: 111
- DNS: 53
- TFTP: 69
- SNMP: 161
- SMTP: 25
- FTP: 21/20
- Telnet: 23
- HTTP: 80
- HTTPS: 443
UDP 概述
在 IP 数据报服务之上增加了很少功能
- 复用和分用的功能
- 差错检测的功能
UDP 的主要特点
- 无连接的协议
- 不保证可靠交付,尽最大努力
- 面向报文,一次性发出整个报文,一次交付整个报文
- 没有拥塞控制
- 支持一对一、一对多、多对一和多对多的交互通信1
- 首部开销小,只有 8 字节
面向报文的 UDP:将应用层的报文整个封装到 UDP 用户数据报中,不切割,不拆分
- 应用程序必须选择大小合适的报文,不然延迟会很大
首部和差错控制
2+2+2+2 字节
- 源端口
- 目的端口
- 长度
- 检验和
基于端口的分用和复用
- 复用用的是源端口
- 分用用的是目的端口
校验和实现差错控制
- 在数据链路层中使用 CRC 技术检测冗余位的误码率实现差错控制,这里 UDP 使用的并不是 CRC,将首部和数据一起检验,若校验有错,直接丢弃
- 虽然做了差错校验,UDP 仍然是不可靠的数据传输
TCP
TCP 概述
面向连接的运输层协议,在无连接、不可靠的 IP 网络服务基础上提供可靠交付的服务
TCP 特点
- 面向连接
- 点对点
- 可靠交付
- 全双工通信
- 面向字节流,它要对每个字节均编号
注意
- TCP 连接是一条虚连接,并不是物理连接
- TCP 根据窗口值和网络拥塞程度来决定报文段的字节大小,意思是可以拆分,也可以等待积累多了再一起发
TCP 的连接
- TCP 连接的两端并不是主机,而是进程套接字 socket
- 套接字:IP+端口号,参考 TCP/IP Sockets in C
TCP 报文段的首部格式:同样分为首部和数据部分
首部共 20 字节
- 源端口和目的端口
- 序号(seq):要发送数据的首地址字节编号(TCP 对数据中每个字节都有编号)
- 确认号(ack):期望收到的下一个字节序号,如 a 向 b 发送了编号 1001 到 2000 的字节数据,b 想要继续接收,其发给 a TCP 报文的确认号则为 2001
- 数据偏移
- 保留
- URG:紧急处理
- ACK:ACK=1 表示确认号有效
- PSH:push=1 表示向上提交数据
- RST:当连接出现问题,RST=1 重置连接
- SYN:建立连接的一种方式,SYN=1 表示同意确认连接
- FIN:终结连接
- 窗口:调节发送双方每次发送多少数据
- 校验和:差错校验
- 紧集指针:表示紧集数据有多少个
- 选项:定义 MSS 大小(maximum segment size)
- 填充:使首部满足 4 字节整数倍
不同层级的差错校验
层级 | 协议 | 校验范围 |
---|---|---|
数据链路层 | CRC | 首部和数据 |
网络层 | IP 数据首部校验和 | 首部 |
运输层 | UDP/TCP | 伪首部、首部和数据 |
流量控制机制
IP 网络提供的是不可靠传输,整个计算机网络只有一个可靠协议 TCP
TCP 可靠传输机制
- 编号:编号即给每个字节进行编号
- 确认机制:接收方需要对每一个数据进行确认接收
- 超时机制:若在规定时间内未收到确认,发送方重传
- 自动重传机制:若未收到确认,将自动重传
停止-等待协议
有点像数据链路层的流量控制
停止等待协议:每发送一个分组后要等待对方的确认,确认后才可以发下一个
这样会出现两个问题
- B 收到数据时检测出了差错,直接丢弃
- 传输过程中丢失
上述两种情况下,发送方 A 都不会收到确认
解决方案:超时重传
如果确认号丢了怎么办?
解决方案:编号
- 发送的数据和确认都具有编号,同组数据的发送和确认编号一致
- 若长时间未收到确认(确认丢了),发送方将重新发送上次放的编号的数据,B 收到后发现该编号已有,则丢弃本组数据并再次发送确认号
- 同理,当发送方 A 收到已有编号的确认号,则将其丢弃,避免重复发送
自动重传机制:重传是自动进行的,不需要接收方向发送方请求
回顾一下链路层的连续 ARQ 协议
一次发送多个分组,通过滑动窗口协议控制发送方和接收方所能发送和接受的分组的数量和编号
接收方采用累计确认的方式,采用 GBN 方法进行重传
- 链路层的窗口大小是固定的,而 TCP 的窗口是动态的
拥塞控制机制
重点
对资源的需求超出了该资源提供的可用部分,网络性能就会变坏,这种现象叫做拥塞,最坏结果,系统崩溃
导致因素
- 缓存太小
- 链路容量不足
- 处理数据太慢
根本原因:对资源需求 > 可用资源量
拥塞控制和流量控制的区别
- 拥塞控制是一个全局性的控制,涉及多方面因素
- 而流量控制仅仅是点对点控制,是端到端的问题
开环控制和闭环控制
开环控制:将路修得足够大,力争不发生拥塞,不可取,往往造成大量资源浪费
闭环控制:通过反馈信号采取响应控制措施
一些基本概念
- MSS:maximum segment size,是数据字段的最大长度,是发送数据的基本单位,即必须为 MMS 的整数倍
- 窗口
- 接收窗口:根据接收端接受能力确认窗口值
- 拥塞窗口:根据网络状况确定的大小
- 发送窗口:发送端根据网络拥塞情况和接收端能力确定的窗口值
- 真正的窗口值 = Min(拥塞窗口值, 接收窗口值)
- 传输轮次:一来一回叫做一个传输轮次,即所有数据发送和确认完,即为一个传输轮次
控制拥塞窗口的原则:只要没有拥塞,令拥塞窗口大点,反之令其小点
拥塞是基于反馈的,反馈有
- 重传定时器超时:已经拥塞
- 收到三个重复的 ACK:可能产生拥塞
TCP 拥塞控制算法
四种拥塞控制算法
- cwnd 的单位为 MMS,发送从 1 个 MMS 开始,指数倍增加到 SSTH 个 MMS,再逐个增加
- 完全窗口的概念,发送窗口的值等于一个接收窗口的数据值,我们就说发送方发送了一个完全窗口
- RTT 指一轮发送和接收所需的总时间
算法 | 执行过程 | 特点 |
---|---|---|
慢开始(Slow Start) | 设置初始拥塞窗口 cwnd,每次收到一个确认报文段,令 cwnd+1(重传的不算);设置慢开始初始门限 SSTH,就是 cwnd 的上限值;当 cwnd 达到门阀,执行拥塞避免算法;当出现拥塞,迅速将窗口大小降为 1,门限值降为 Max(cwnd/2, 2),继续执行慢开始算法,当可能出现拥塞,执行快重传、快恢复算法 | 从小到大逐渐增大窗口数值,每收到一个确认,cwnd 加一,每经过一个轮次,cwnd 加倍,这一阶段拥塞窗口将呈指数级增加 |
拥塞避免算法 | 当 cwnd > SSTH 时,让 cwnd 每经过一个轮次只加一,同时 SSTH 也加一 | 让拥塞窗口呈线性增加 |
快重传和快恢复算法 | 当发生丢包时,接收方快速连续重传三个相同编号的 ACK 消息,发送方收到三个连续重复的 ACK 后,采用快恢复算法,将 cwnd 和门阀值 SSTH 均降为 cwnd / 2,同时采用拥塞避免算法 | 这里包含了两个算法,二者视作一体,快重传发送的三个冗余的 ACK 将触发快恢复 |
始终注意实际窗口 = Min(拥塞窗口, 接收窗口)
习题位于 P13 00:30:00
TCP 的连接建立
采用客户服务器方式
- 发起连接建立的进程叫做客户
- 被动接收连接的是服务器
三次握手:SYN 表示同意建立连接,ACK 表示是确认信息,seq 是发送数据的字节编号的起始位置,ack 是希望收到的字节的编号的起始位置
- 客户端请求:SYN = 1, ACK = 0, seq = x
- 服务器确认:SYN = 1, ACK = 1, seq = y, ack = x+1
- 客户端确认确认:SYN = 0, ACK = 1, seq = x+1, ack = y+1
三次握手后,连接建立,可以开始发送数据,注意第三次握手的 TCP 首部中 URG = 1,表示要紧急发送
四次挥手,前两步和后两步完全一样,因为是全双工,需要双向断连
- 客户端断连:FIN = 1, ACK = 1, seq = u
- 服务器确认:FIN = 0, ACK = 1, seq = v, ack = u+1
- 服务器断连:FIN = 1, ACK = 1, seq = w, ack = u+1
- 客户端确认:FIN = 0, ACK = 1, seq = u+1, ack = w+1
四次挥手,等待 2MSL 后,二者才断开连接,避免最后一个数据丢失
- MSL:报文最大生存时间
TCP/IP 综合题: P13 00:50:00
- IP 分组由谁发送看源地址和目的地址
- 判断 TCP 建立过程看 SYN、ACK、URG 状态和序号/确认号是否对应
- 是否填充看首部记录的数据段长度,若小于 46 则要填充,注意首部中的记录是十六进制,需要转化
- 计算收到数据长度,看第一个发送数据的序号和最后一个数据的确认号,相减即为大小(不考虑握手数据)
- TCP 数据传输经过多少路由器,TTL 相减
数据交换模式
电路交换
交换:建立专用的物理连接,如两部电话机只需要一对电线就可连接
三个阶段
- 建立连接
- 通信
- 释放连接
优点
- 双方专用,时延小
- 实时性强
- 按发送顺序传输数据,不存在失序问题
- 适用于传输 模拟信号
- 交换设备及控制均较简单
缺点
- 建立连接时间较长
- 线路被独占,空闲时其他设备也无法使用,利用率小
- 因为数据直达,不同类型、规格、速率的终端很难相互通信
- 这种通信方式非常适合语音(如打电话)这种实时性很高的业务,但不适合数据传输业务
- 没有差错控制能力
报文交换
典型的:UDP
让每个报文携带目的地址、源地址等信息,采用存储转发的传输方式,不需要建立连接
优点
- 不需要建立连接,随时发送
- 因为存储转发,便于设置代码检验和数据重发设置,同时可以进行路径选择,重传时可以更换路径,提高可靠性
- 不占用通信线路,提高利用率
缺点
- 转发延迟较高
- 只适合数字通信
- 节点增加会造成传送时延增加
- 没有流量控制
分组交换
同样采用存储转发,将报文切成小块,每个小报文均携带目的地址、源地址等信息,即均带有首部
也叫 IP 分组,各个小报文以流水线的形式进行发送
实现方式
- 数据报:就是 IP 数据报,无连接,不可靠,不能保证按序到达
- 虚电路:有连接的服务,需要经过建立-传输-拆除的过程,每个分组都带有虚电路的标识,到达顺序严格遵循发送顺序,端之间可以建立多个虚连接