概述
只有主机才有的层次
传输层功能:
- 提供进程和进程之间的逻辑通信
- 网络层提供主机间的逻辑通信
- 复用和分用
- 复用:应用层所有的应用进程都可以通过传输层再传输到网络层
- 分用:传输层从网络层收到数据后交付指明的应用进程
- 对收到的报文进行差错检测
两个协议
TCP:面向连接的传输控制协议
- 可靠,面向连接,时延大,适用于大文件
UDP:无连接的用户数据报协议
- 不可靠,无连接,时延小,适用于小文件
寻址与端口
端口:传输层的SAP,标识主机中的应用进程
端口号 只有本地意义,在因特网中无意义。
端口号长度为 16 bit,能表示 65536 个不同端口号
- 按范围分为:服务端、客户端
- 套接字 Socket = (主机IP地址,端口号)
- 唯一标识网络上的一个主机它上面的一个进程(端点)
UDP 协议
UDP 只在 IP 数据报服务上增加了很少功能:复用分用和差错检测功能。
UDP 主要特点:
- UDP 是 无连接 的,减少开销和发送数据之前的时延
- UDP 使用最大努力交付,即 不保证可靠交付
- UDP 是 面向报文 的,适合 一次性 传输少量数据的网络应用
- UDP 无拥塞控制,适 合很多实时应用
- UDP 首部开销小,8B,而 TCP 20B
UDP 首部格式
- 分用时,找不到对应的端口号时,丢弃,然后发送 ICMP “端口不可达”差错报告报文
UDP 校验
伪首部只有在计算校验和时才出现,不向下传送也不向上递交
17:封装 UDP 报文的 IP 数据报首部协议字段是 17
UDP 长度:UDP 首部 8B + 数据部分长度(不包括伪首部)
发送端
- 填上伪首部
- 全 0 填充校验和字段
- 全 0 填充数据部分(UDP数据报要看成许多 4B 的字串接起来)
- 伪首部 + 首部 + 数据部分采用二进制反码求和
- 把和求反码填入校验和字段
- 去掉伪首部,发送
接收端
- 填上伪首部
- 伪首部 + 首部 + 数据部分采用二进制反码求和
- 结果全为 1 则无差错,否则丢弃数据报/交给应用层附上差错警告
TCP 协议
TCP 的特点:
- TCP 是 面向连接(虚连接) 的传输层协议
- 每一条 TCP 连接只能由两个端点,每一条 TCP 连接只能是 点对点 的
- TCP 提供 可靠交付 的服务,无差错、不丢失、不重复、按序到达
- TCP 提供 全双工 通信(发送缓存、接收缓存)
- TCP 是面向字节流的 => TCP 把应用程序交下来的数据看成仅仅是一连串的 无结构的字节流
TCP 首部格式
- 序号:表示本报文段所发送数据的 第一个字节的序号
- 确认号:期望 收到对方下一个报文段的第一个数据直接的序号
- 确认号为 N,则代表前 N-1 都已经正确接收了
- 数据偏移(首部长度):TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远
- 以 4B 为单位
- 保留字段:占6位,目前全0
- 6 个控制位
- 紧急位 URG:URG=1时,标明此报文段中有紧急数据,是高优先级的数据,是高优先级的数据,发送方尽快发送,配合 紧急指针字段 使用
- 确认位 ACK:ACK=1时,确认号有效,在连接建立后,所有传送的报文段都必须把ACK置1
- 推送位 PSH:PSH=1时,接收方尽快接收
- 复位 RST:RST=1时,表示TCP连接中出现严重差错,必须释放连接,然后再重新建立
- 同步位 SYN:SYN=1时,表明是一个连接请求/连接接受报文
- 终止位 FIN:FIN=1时,表示此报文段发送方数据已发完,要求释放连接
- 窗口:指的是发送本报文段的一方的接收窗口,以让对方确认发送窗口的大小
- 校验和:检验首部+数据,校验时要加上12B伪首部(协议字段为4)
- 紧急指针:URG=1时才有意义,指出本报文段中紧急数据的字节数(从数据段的第一字节开始)
- 选项:最大报文段长度MSS(TCP报文段中数据段的最大长度)
TCP 连接管理
TCP 连接传输三个阶段:连接建立 -> 数据传输 -> 连接释放
- 连接的建立采用 客户服务器方式(三次握手),主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫服务器
连接建立 (三次握手)
- 客户端发送 连接请求报文段,无应用层数据
- SYN=1, seq=x[随机]
- 服务器为该 TCP 连接 分配缓存和变量,并向客户端返回 确认报文段,允许连接,无应用数据
- SYN=1, ACK=1, seq=y[随机], ack=x+1
- 客户端为该 TCP 连接 分配缓存和变量,并向客户端返回确认的确认,可以携带数据
- SYN=0, ACK=1, seq=x+1, ack=y+1
SYN 洪泛攻击
攻击者发送 TCP SYN,SYN 是 TCP 三次握手中的 第一个数据包,而服务器返回 ACK 后,该攻击者就不对其进行再确认,那么这个 TCP 连接处于挂起状态,也就是所谓的半连接状态,占用服务器的资源。
- 仅握手两次
连接释放 (四次握手)
- 客户端发送 连接释放报文段,停止发送数据,关闭 TCP 连接
- FIN=1, seq=u[最后发送的数据序号+1]
- 服务器端回送一个确认报文段,客户到服务器这个方向的连接就释放了——半关闭状态
- ACK=1, seq=v, ack=u+1
- 服务器端发完数据,就发出 连接释放报文段,主动关闭 TCP 连接
- FIN=1, ACK=1, seq=w, ack=u+1
- 客户端回送一个确认报文段,再等到时间等待计时器设置的 2MSL(最长报文段寿命)【防止确认报文段丢失】后,连接彻底关闭
- ACK=1, seq=u+1, ack=w+1
TCP 可靠传输
可靠:保证接收方进程从 缓存区 读出的字节流与发送方发出的字节流完全一样的
TCP 实现可靠传输的机制:
- 校验:与 UDP 校验一样,增加伪首部
- 序号:一个字节占一个序号。序号字段 指的是一个报文段第一个字节的序号。
- 确认:TCP 默认使用 累计确认
- 重传:TCP 的发送方 超时重传
- 重传时间:采用自适应算法,动态改变重传时间 RTTs(加权平均往返时间)
- 为什么动态改变:由于 TCP 的下层是一个互联网环境,IP 数据报所选择的路由变化很大。因而传输层的往返时间的方差也很大
- 快速重传:
- 接收方每收到一个失序的报文段后就立即发出重复确认
- 发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段
- 快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段
TCP 流量控制
流量控制:让 发送方慢点,要让接收方来得及接收。
TCP 利用 滑动窗口 机制实现流控制。
-
发送方维持 拥塞窗口 cwnd,根据网络的拥塞程度动态调整。
-
接收方根据自己 接收缓存的大小,动态地调整 发送方的发送窗口大小,即接收窗口 rwnd(接收方设置 窗口字段 来将 rwnd 通知给发送方),发送方的 发送窗口 = Min{接收窗口rwnd, 拥塞窗口cwnd}
-
TCP 为每一个连接设有一个持续计时器,只要 TCP 连接的一方收到零窗口通知,就启动。到期后就发送一个零窗口的 探测报文段,得到当前窗口值,若为0则重新设置计时器。
TCP 拥塞控制
出现拥塞的条件:对资源需求的总和 > 可用资源
拥塞控制:防止过多的数据注入到网络中。全局性,涉及到所有主机、所有路由器,以及与降低网络传输性能有关的所有因素。
流量控制:往往指在给定的发送端和接收端之间的点对点通信量的控制
- 接收窗口 (receive window, rwnd):接收方根据其目前的接收缓存大小所许诺的最新的窗口值,是来自接收方的流量控制
- 拥塞窗口 (congesition window, cwnd):发送方根据自己估计的网络拥塞程度而设置的窗口值,是来自发送方的流量控制
- 发送窗口 = Min{接收窗口rwnd, 拥塞窗口cwnd}
慢开始和拥塞避免
- 一个传输轮次:把 cwnd 所允许发送的报文段都发送出去,并收到它们的确认的时间。
- “传输轮次”的时间并不是固定不变的
- 图中一个传输轮次为一个往返时延 RTT
- 慢开始
- “慢”是指:开始时发送速率“慢”(cwnd = 1)
- 收到一个对新报文段的确认(不包括重传),就使 cwnd 加 1,因此每次都增加一倍,即 指数增长
- 拥塞避免
- cwnd 每经过 一个往返时延 RTT 就 增加一个 MSS 的大小(而不管在时间 RTT 内收到了几个 ACK),线性增长
- 慢启动门限 ssthresh:出现拥塞时的发送窗口值的一半
快重传和快恢复
- 刚开始仍然是慢开始、拥塞避免,但是采用了快重传、快恢复技术,拥塞时不是直接减到 1,而是减到新的 ssthresh
- 慢启动门限 ssthresh:依然是出现拥塞时的发送窗口值的一半