传输层

两盒软妹~` 提交于 2020-02-10 16:38:24

一.目录

传输层服务的基本理论与基本机制

  1. 复用/分用技术
  2. 可靠数据传输
  3. 流量控制机制
  4. 拥塞控制机制

Internet传输层协议

  1. UDP
  2. TCP
  3. TCP拥塞控制

二.概述

传输层为运行在不同主机上的进程提供了逻辑通信机制

发送方:将应用层提交的消息分成一个或多个segment,并向下传给网络层

接收方:将接收到的segment组装成消息,并向上交给应用层

三.UDP(User Datagram Protocol)

特性

  1. 基于IP协议(复用/分用,有简单的错误校验)
  2. Best effort服务(可能丢失,非按序到达)
  3. 无连接(无需握手)

优点

  1. 无需建立连接(减少延迟)
  2. 实现简单(无需维护连接状态)
  3. 头部开销少
  4. 没有拥塞控制(应用可更好的控制发送时间及速率)

用处

  1. 常用于流媒体应用(容忍丢失,速率敏感)
  2. 用于DNS,SNMP

报文结构

UDP数据报结构
报文结构在图中比较清楚

长度(length):UDP段的长度,包括了头部
校验和(checksum):用于差错校验

checksum

目的

检测UDP段在传输中是否发生位错误

算法

伪首部

伪首部是为了计算校验和,临时添加在UDP数据报前面,不向下传送,也不向上递交。共12个byte

  1. 源IP地址(4byte)
  2. 目标IP地址(4byte)
  3. 全0(1byte)
  4. IP首部中的协议字段值,对于UDP来说是17(1byte)
  5. UDP数据报长度(2byte)
步骤

发送方

  1. 首先增加12个字节的伪首部
  2. 将段内容视为16bit整数
  3. 计算所有整数的和,进位加在和的后面,将得到的值按位取反
  4. 将校验和放入校验和字段

接收方

计算所收到段的校验和,比对

不相等:检测出错误

相等:没有检测出错误(仍有可能出错)

四.可靠数据传输(Rdt)

定义

不错,不丢,不乱

  1. rdt1.0:底层信道完全可靠,不会发生错误,不会丢弃分组,则传输数据可靠
  2. rdt2.0:产生位错误的信道
  3. rdt2.1&rdt2.2: 基于ACK的改进
  4. rdt3.0:产生位错误及丢包的信道

rdt2.0

问题:底层信道可能翻转分组中的bit

校验和检测位错误

确认机制ACK恢复错误

接收方发送ACK,通知发送方分组正确接收

发送方发送NAK,通知发送发分组错误

发送发收到NAK后,重传分组

基于重传机制的rdt协议成为ARQ(automatic repeat request)

rdt2.1& rdt2.2

问题:ACK/NAK消息发送错误

  1. 为ACK/NAK增加校验和,检错并纠错
  2. 若ACK/NAK坏掉,重传

使用序列号重传(sequence number)

为每个分组增加序列号,返回的认证消息中增加序列号,表示对某序列号的分组确认。

在停等协议中,只需要0,1两个序列号即可。

rdt2.2去掉了NAK,接收方通过ACK告知最后一个被正确接收的分组,在ACK消息中显示的加入被确认分组的序列号

rdt3.0

问题:信道既可能发生错误,也可能丢失分组。

增加计时器,在发送消息后,开启计时器,在计时器结束后,自动重发。

总结

rdt使用的技术:

  1. 校验和
  2. 带序列号的ACK/NAK
  3. 定时器

rdt使用停等协议,性能很差。

示例:

1Gbps链路,15ms端到端传播延迟,1KB分组。
T = L / R = 8kb/10 ^ 9 = 8 microsec

发送方利用率:

U = (L/R)/(RTT+(L/R)) = 0.00027

五. 滑动窗口协议

解决利用率低的问题

允许发送方在收到ACK之前连续发送分组

需要更大的序列号范围

发送方和接收方需要更大的存储空间缓存分组

窗口尺寸为N,最多有N个等待确认的消息,窗口在序列号空间内向前滑动

GBN(GO-BACK-N)

发送方

ACK(n):确认到序列号n的分组已被正确接收

为空的分组设置计时器

Timeout(n):大于等于n,还未收到ACK的所有分组,全部重传。

接收方

发送拥有最高序列号的,已被正确接收的分组的ACK

乱序到达的分组:直接丢弃(接收方没有缓存),重传确认序列号最大的,按序到达的分组

SR(Selective Repeat)

接收方对每个分组单独进行确认,设置缓存机制,缓存乱序到达的分组

发送方只重传没有收到ACK的分组,为每个分组设置定时器(GBN只有一个定时器)

问题:若窗口尺寸与序列号接近,很可能会出现确认混乱情况。

要求2^k 远远>= 窗口尺寸

六.TCP

1.概述

  1. 点对点
  2. 可靠的,按序的字节流
  3. 流水线机制
  4. 发送方/接收方缓存
  5. 全双工
  6. 面向连接
  7. 流量控制机制

2.报文结构

TCP报文结构

序列号:segment中第一个字节的编号,建立TCP连接时,双方随机选择序列号

确认号:希望接收到的下一个字节的序列号,采用累计确认,该序号前的所有字节均被正确接收

URG(urgent data):generally not used

ACK:ACK

PSH(push data now):generally not used

RST,SYN,FIN(connection establish)

Receive window:希望接收的字节数

3.流量控制

发送方不会传输太多,太快导致淹没接收方。

接收方会为TCP连接分配buffer

接收方计算目前可用空间:RcvBUffer - (lastByteRcvd - LastByteRead)

通过头部字段 Receive window告诉sender。

sender限制自己已经发送的,但还未收到ACK的数据不能超过接收方receive window尺寸

4.连接管理

建立连接

TCP连接

关闭连接

client向server发送TCP FIN

server收到FIN,回复ACK,关闭连接,发送FIN

client收到FIN,回复ACK

server收到ACK 连接关闭

5.TCP拥塞控制

基本原理

sender限制发送速率

rate = congWin/RTT

动态调整以改变发送速率

如何感知网络拥塞

Loss事件 = timeout或3个重复的ACK

发生loss事件后,发送方降低速率

AIMD 加性增-乘性减

每个RTT将CongWin增大一个MSS

发送loss事件后,将CongWin减半

SS 慢启动

每个segment被确认后,CongWin增大一个MSS(每个RTT。CongWin翻倍)

实现算法

  1. 设置默认阈值
  2. 达到阈值前,使用SS
  3. 达到阈值后使用加性增
  4. 发送loss事件后,阈值变为当前CongWin的一半
  5. loss事件为3个重复ACK时,CongWin变为一半,采用线性增长(表示网络还能传输segment)
  6. loss事件为timeout事件,CongWin直接设为1个,采用指数增长。(拥塞更严重)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!