5.1 传输层提供的服务
1.传输层提供的功能
- 为不同的主机上的进程提供逻辑通信,网络层是为不同的主机提供逻辑通信
- 功能
- 复用和分用
- 复用:不同的进程可以使用同一个协议传输数据
- 分用:在传输层接收协议后,剥去首部交付正确的目的进程
- 差错检测(首部,数据部分)
- 提供两种并存的传输协议(网络层只能选择一种)
- 提供透明地数据传输服务,差错控制,流量控制
- 复用和分用
2.端口与寻址
- 端口的作用:应用进程通过端口将数据向下交付给传输层(反之亦然)
- 各层的 SAP
- 数据链路层:MAC
- 网络层:IP 地址
- 传输层:端口
- 端口用于标识主机进程的
- 传输层使用的是软件端口
- 端口号
- 长度:16 bit
- 分类
- 服务端使用的端口号
- 熟知端口号(0~1023)
- 最重要的应用程序
- 常用的熟知端口号(如下图)
- 登记端口号(1024~49151)
- 熟知端口号(0~1023)
- 客户端使用的端口号(49152~65535):客户进程运行时动态分配
- 服务端使用的端口号
- 套接字
- 组成:主机 IP 地址+端口号
- NOTE:主机 A 发送给 主机 B 的报文段包含了目的端口号和源端口号
note
在 HTTP 中,服务端的端口号是 80,而客户端是由系统自动分配的
3.TCP 和 UDP 和 IP
相同点
- 二者均是传输层协议
- 不同点
- TCP
- 面向连接,提供可靠传输服务
- 产生时延
- 利用滑动窗口和确认重传机制,使得信息传输更加可靠
- 不提供广播和组播服务
- UDP
- 无连接(尽力而为的交付),发送快,需要高层实现可靠传输
- TCP
**
- UDP 和 IP 协议
- 相同:都不可靠,都有检验和,出错了都丢弃
- 不同:UDP 的检验和要检验首部和数据部分,且包含伪首部,IP 仅检验首部
5.2 UDP 协议
5.2.1 UDP 数据报
- UDP 概述
- 服务
- 复用/分用
- 差错检测
- 优势
- 无须建立连接
- 无连接状态
- 分组首部开销小
- TCP:20B
- UDP:8B
- UDP 首部的格式
- 源端口
- 目的端口
- 长度:包括了首部和数据
- 校验和
- 特点
- 传输可靠性有应用层完成
- 面向报文
- 不拆分合并报文,仅添加首部
- 服务
💡 伪首部就是从 IP 首部拿了一些重要的字段参加校验,伪首部中的 17 表示 IP 数据报中中协议字段为 17 及 UDP 的为 17,最后伪首部的 UDP 长度和 UDP 中的长度字段是一样的。
💡 伪首部仅在校验的时候使用
5.2.2 UDP 校验
- 计算校验在 UDP 数据报之前临时添加 12B 的伪首部
- 校验和的检查范围
- UDP首部
- 数据部分
- 伪首部还包含源目 IP 地址
- 步骤
- 全 0 放入校验和字段,添加伪首部
- 16 位为单位,数据部分不是偶数字节,全 0 补齐
- 相加得到 和,并求反码放入校验和字段
- 接收方把收到的 UDP 字段进行同样的运算,如果全 1,则成功(此时校验和字段是反码了噢)
- NOTE
- 补充字段和伪首部都不发送
- 校验和功能不是必须的
- PS:二进制反码运算
拓展
IP 数据报与UDP数据报的主要区别
💡 IP 数据报在网络层进行路由转发,而 UDP 使用端口号进行端到端的通信
💡 IP 数据报首部校验和仅对首部信息进行校验,而 UDP 校验和要对数据部分校验
5.3 TCP 协议
1. TCP 协议的特点
- 全双工可靠(面向连接)字节流
- 一对一通信
- 可靠交付
- 无差错
- 不丢失
- 不重复
- 有序
发送缓存和接收缓存
首部最短为 20B
- 作用
- 运载数据
- 建立连接
- 释放连接
- 应答
- 首部
💡 窗口值是接收方允许发送的窗口大小,也就是自己能接收的大小
💡 计算窗口值大小 = RTT*带宽
💡 计算序列号大小 = 最大生存周期*带宽
💡 计算TCP数据部分大小 = IP 总长度-IP 首部-TCP 首部
URG=1,发送方报文优先发送
PSH=1,接收方接收缓存中的报文优先上交到应用层
- 数据部 分
- TCP 报文段
udp
note
- 如何计算 TCP 首部长度,即 TCP 首部长度位记录的十进制数*4B
- 快速以太网的最小载荷 46B
- IP 分组中的标识是计数经过的路由器数量
- TCP 采用滑动窗口进行流量控制,接收端返回当前接收窗口的最大值
- TCP 的确认号(ack)表示,已经接到 n-1 个报文,期望下一次接收 n 号报文
- SYN = 1,ACK = 0,表示此时是连接请求;SYN = 1,ACK = 1,此时是连接接收
- 窗口字段表示还可接收或者出动方还有多少缓存空间可以使用
- 确认号是 ack (小写),其值表示为对方的序号+1
- 数据偏移就是首部(固定首部+可选首部)的长度,是 4B 为单位
3. TCP 连接管理
1.特点
- 连接的端口:套接字
- 连接的方式
- 客户端/服务器
- 发起连接的称为客户机,接收连接的称为服务器
PS:ACK 和 ack 的区别
ACK 表示确认连接(存在于双方连接阶段),ack 表示确认序号,就是 TCP 报文段的那个确认序号
2.连接的建立
- 第一步:客户端发起连接。SYN(用于表示建立连接) = 1,随机选择一个 x,作为 seq 的值
- 第二步:服务器发送确认报文,SYN = 1,ACK = 1,ack = x+1,本报文的 seq = y
- 第三步:客户机返回确认。ACK = 1,seq = x+1,ack = y+1(此处加1,加的是有效载荷)
PS:
- 服务端资源在第二次握手分配,客户端资源在第三次握手分配
- 服务器容易收到 SYN 泛洪攻击
- SYN = 1 的报文,不携带数据,但要消耗序号
- ACK = 1 表示**确认连接**;
ack = seq +1 表示前一个报文的所有字段都接收完成了 - 我们的窗口大小单位都是**字节**
🔦 拓展**
1.为什么TCP是三次握手,如果不这样会出现什么情况
假定A向B发送TCP连接请求,而该请求滞留于网络中,A超时重传,与B取得了TCP连接,并交换数据后,关闭连接。
此时,滞留的TCP请求到达B,B以为A又建立连接,于是发送请求确认,A接到请求确认后,由确认号推出该SYN报文无效,于是发送复位报文 RST=1
3.连接的释放
- 第一步:客户机发起释放。FIN(用于表示关闭连接) = 1,seq = x(客户机:我要挂了)
- 第二步:服务器发送确认。ACK = 1,seq = v,ack = x+1(服务器:好的)
- 第三步:服务器发起释放。FIN = 1,seq = w,ack = x+1(服务器:我要挂了)
- 第四步:客户机确认。ACK = 1,seq = h,ack = w+1(客户机:好的)
note
- FIN 不携带数据,但是要消耗序号
- 客户端和服务端都可以发起连接释放
- TCP 是全双工的,所以必须客户端和服务端都释放连接才算完成
- 释放完成,等待 2MSL 的原因
- 如果在已经建立连接的两个主机端口之间再建立连接,那么建立失败,但是不会影响先前的连接
- 图中两个 ack =u+1 可以省略第一个吗?不可以,因为到第一个 ack=u+1 时,仅仅是 A 不在发送数据,但如果 B 继续发送数据,而 A 此时收到的对自己的确认并不完整,就会认为自己发起的 FIN 断开连接失败
4. TCP 可靠传输
TCP 使用校验,序号,确认和重传(认传验号)的机制来实现(差错控制)
1.**序号(序号字段)**
- 作用:有序提交和接收
- 特点:序号字段的值是本报文数据的第一个字节的序号
PS:**序号是建立在字节流上的,所以是对每个字节进行确认,但同时又累加确认,所以在每个报文段后进行确认
2.**确认
累计确认
比如,接收已经接收了 0~2 和 6~7 的报文段,缺少 3~5 那么接收方回传给发送的确认号是 3
PS:**发送方的缓存区会继续存储已发送但未确认的报文段**
3. 重传
重传事件
5. TCP 流量控制
1.**作用
接收方抑制发送方的发送速率,防止接收方缓存溢出
2.**机制
滑动窗口
3.**窗口**
- 接收窗口(rwnd)
- 接收方根据自己接收缓存的大小,调整发送方的发送窗口
- 通过窗口字段设置
- 拥塞窗口(cwnd):发送方根据当前网络拥塞程度估计的窗口值
- 发送窗口 = min{接收窗口,拥塞窗口}。即 rwnd 是接收方对发送方的要求。cwnd 是发送方对自己的要求
PS:
- 传输层和链路层的流量控制的区别,**传输层定义端到端,动态变化;(网络层即以下)**链路层定义点到点,非动态变化
- TCP 采用 GBN 策略管理流量,所以是累加确认
6. TCP 拥塞控制
1.**作用
防止过多数据注入网络,其中 ACK 机制就是用于拥塞控制中
2.**拥塞的表现
时延增加
3.**拥塞控制和流量控制的区别**
拥塞控制:涉及全局,所有主机和路由器
流量控制:点对点,抑制发送端的发送速率
4.拥塞控制算法
- 慢开始
- 初始化 cwnd(拥塞窗口)=1,每收到一次确认后,cwnd +1。此处特别注意:比如,如果你一开始 cwnd 为 2,那么经过确认,实际上发送方接收到的是两个确认,所以下一次,每一个确认增加一,实际上发送方的 cwnd 增加了 2 ,数值上好像翻倍了一样。
- 直到 cwnd = ssthresh(阈值),使用拥塞避免算法
- 拥塞避免
- 每收到一次确认后,cwnd += 1
- 当出现一次拥塞,ssthresh = 1/2 cwnd,cwnd = 1
PS
- 当 cwnd < ssthresh,使用慢开始
- 当 cwnd > ssthresh,使用拥塞避免
- 当 cwnd = ssthresh,都可以
- 每次翻倍的时候确保 cwnd <= ssthresh,如果大于,则 cwnd = ssthresh
TCP 的窗口单位是字节
快重传:当发送方收到三个冗余 ACK(确认失序的 ACK),立即重传,无需等待计时器
- 快恢复:把 cwnd 值设为慢开始门限改变后的数值后直接进行加法增大
PS:**出现超时->慢开始和慢结束;出现 3 ACK-> 快重传和快恢复
PS:乘法减小:当出现拥塞的时候,把慢开始门限减半
拓展
🔦简述TCP 和 UDP 两个协议的特点,并进行比较
🔦 拥塞控制和流量控制的区别
流量控制:接收方限制发送方发送速率,以便接收方能够来得及接收。这是一个点对点,端到端的问题。
拥塞控制:防止过多数据注入网络重,使网络不过载。拥塞控制是一个全局性的过程,涉及到所有的主机,路由器。
🔦 为什么 UDP 是面向报文的,而 TCP 时面向字节流的
因为 UDP 对报文既不拆分,也不合并,仅仅只是向下传递添加首部,向上交付删除首部。而 TCP 将报文视为无结构的字节流
🔦 不是因为拥塞而引起的分组丢失
- 分片 IP 数据报未能按序及时到达
- 接收端缓存不够
- 中途网桥缓存不够