计网运输层
运输层:帮助到达的数据包找到应用进程
网络层解决的问题是来到主机(提高主机之间的逻辑通信)
数据从远端,经过若干个路由器,通过合适的路由算法,来找到主机
但是我们的数据不能直接交给主机使用,我们交给应用进程来使用数据
- 运输层是面向通信部分的最高层
- 也是用户功能中的最低层
边缘部分的两个主机,使用核心部分的功能进行端到端的通信时,
- 只有位于网络边缘部分的主机协议栈才有运输层。
- 而到网络核心部分中的路由器在转发分组的时候只用到下三层(没有运输层和应用层)
概况运输层的作用:为相互通信的应用进程进行逻辑通信
- 通信的真正端点,实际上是应用进程和应用进程之间
运输层有几个重要的功能:复用、分用、差错检测功能
- 复用:不同的应用进程使用同一个传输层协议工作
- 分用:同一个运输层将应用报文交给不同的应用进程来使用
- 差错检测:(网络层也出现:IP协议只检测IP协议的首部) 而在运输层中,是对整个报文进行检测的(TCP报文段、UDP报文)
运输层协议:面向连接的TCP协议和无连接的UDP协议
- TCP(传输控制协议):全双工可靠性通道(同时接受和发送(全双工))
- UDP(用户数据报协议):不可靠的信道
TCP协议与UDP协议
对于OSI体系结构来说
两个对等运输实体在通信时传送的数据单元叫:运输协议数据单元:TPDU
TCP传送的数据单元协议是TCP报文段
UDP传送的数据单位协议是UDP报文或者用户数据报
UDP协议:一种无连接协议(对数据实时性要求比较高,立刻传递,实时性为主)
- 提供无连接服务
- 在传输数据之前不需要建立连接
- 目的地可以是一个或者多个(利用通过广播或者多播的方式同时发送多个目的地)
- 不需要给出确认(不可靠交付)
- 某些情况下UDP是一种很有效的方式
TCP协议:面向连接的协议
- 提供面向连接的服务(端和端之间建立连接)
- 不提供广播和多播(因为只有一条线连接)
- 可以提供更多的控制功能(可靠性,拥塞)
- 额外开销(确认流量控制,连接管理) 首部增大(占用处理机资源)
UDP协议的首部只有8个字节
TCP协议的首部最短也要20个字节
UDP的用户数据报和IP数据报的区别
- IP数据报主要是经过路由器的存储转发,跨越子网,由一台主机传到另一台主机
- UDP用户数据报是端到端逻辑通信(基于端口号对应用进程的复用和分用)
运输层的端口
网络层的IP地址可以找到主机,而应用进程是端口号来标示,来找到应用进程
端口号是:统一的方法对应用进程来进行标示(协议端口号),内存的起始地址
应用进程通过这个起始的内存地址来读写
当数据到达端口,我们就默认可以直接交给端口来使用,
这里指的端口是软件端口
而路由器的交换机的是硬件端口:不同硬件端口是不同硬件之间交互的端口
TCP/IP运输层端口
- 端口用一个4个字节 16位的端口号进行标识
- 端口号只具有本地一样,端口号只是为了标志本计算机应用层当众的各进程,不同计算机端口号可以重复
- 当两个计算机进程需要通信的时候,不仅要知道对方的IP地址(通过子网,跨越路由器)
- 还要知道端口号(找到应用进程)
UDP协议
- 概述:UDP协议只在IP的数据报服务增加了两个功能:复用和分用(端口号实现)、差错检测(对UDP首部和数据部分整个都可以用来做差错检测)
UDP协议的最大特点!!!
- 无连接
- 使用最大努力交付原则
- 面向报文:交付完整的由应用层下方的报文 但需要应用程序交付合适的报文,因为如果过大过小会影响IP层分片效率
- 没有拥塞控制:按时按量发送,适合多媒体通信要求
- 不仅支持一对一,而且支持更多,多播广播的性质
- 首部开销小,只有8个字节
UDP协议的首部格式
- 先介绍一下运输层使用UDP协议传输的时候过程

- 首部只有8个字节:前两个字节是原端口和目的端口(端口号识别不同应用程序实现分用和复用)
- 除去端口号的字段,还有长度字段(用户报文段长度),最后一个字段是校验和字段
分用:
复用:与分用的过程相反
由于UDP在发送数据的时候不需要建立连接,所以IP地址和端口号并不是严格的绑定在一起,所以UDP不需要套接字
UDP的校验
- 在首部的基础之上,加了一个伪首部(没有实际的地址空间,也不存在,只是使用的时候拿出来)来计算校验和
- 伪首部中主要包含了IP地址
但这个在运输层本身是没有IP地址信息,强制引入了伪首部的IP地址,这破坏了网络分层,所以TCP/IP协议不是一个十分严格的分层结构
- 引入伪首部的作用:①对UDP端口号和其他数据的校验②对IP地址的再校验(必要的)
例子:

TCP协议的特点
面向连接
连接之上全双工
一条TCP连接只有两个端点,只能点对点连接(发送方和接受方都需要缓存,将发送和接受的数据放到缓存中)
可靠交付
数据面向字节流:流:流入或者流出进程字节序列。应用程序的字节流在TCP看来是无结构的一连串的字节流(虽然它有符合接受方的数据结构)
TCP不保证接受和发送的数据块有大小对应关系。
接收方应用进接受的字节流和发送方发送的字节流必须一致。(如何分块由发送方决定)

TCP报文段对应的整个字节流会整个交付给接收方,所以字节流是完全一致的。
虚连接传递给IP层,不是物理连接。TCP根据接收方的接受窗口和当前网络拥塞程度来发送报文(和UDP的不同)
TCP连接的端点
TCP的连接端口是套接字(socket)
端口号拼接到IP地址构成了套接字
- 两个套接字就可以构成一条TCP连接

- 同一个IP地址可以有不同的TCP连接,同一个端口号也可以出现在不同的TCP连接
- socket=ip+端口号
TCP的可靠传输
IP数据报到另一台主机通过路由找到一条合适的路径来传输,但是不能保证是否达到
TCP协议在连接的基础之上可以做到不可靠的通信链路之上做到数据可靠地传送(通过停止等待协议或者其他协议来实现可靠传输)
停止等待协议:每发完一个分组就停止发送,等待对方的确认,在收到却后再发送下一个分组。
全双工通信的双方既是发送方也是接收方
- 无差错情况下的发送数据
ACK:确认分组

如果出现了差错:
- B接受M1检测出了差错,就丢弃M1,其他的什么都不做(不需要通知A收到了差错分组)
- M1在传输过程中丢失了,B什么都不知道,当然不需要发送做什么
在这两种情况下,我们采用的方法是超时重传
A为每一个发送的分组设置一个超时计时器。超时默认没有收到,重新发送。
如果ACK报文确认丢失:
- A还是超时重传,B至少收到了2次重复的正确的M1分组。B丢弃一个M1再重新发送ACK
确认ACK分组没有丢掉,确认分组滞留迟到超过超时计时器范围
- A收到重复的确认,收到之后丢弃不需要重新发送。B至少收到2次重复的M1分组,处理同上

注意:

自动重传请求
因为停止等待协议在信道利用率很低,为了进一步提高信道利用率,我们采用流水线ARQ、连续ARQ
信道利用率:有效发送一个数据分组时间占整个发送和确认这个分组的时间比例
为了提高传输效率,我们可以在发送方采用流水线方式,一次发送若干个分组。不间断的传送。
发送是:
- 滑动窗口:TCP协议的精髓所在。 以字节为单位。当TCP报文中的确认号为31的时候,表明前30个已经发送完毕,期待收到第31个序号。这时滑动窗口会滑动。滑动到下一个字节
接受是:
- 累计确认:不必逐个发送确认,对按序到达的最后一个分组进行发送确认即可。但不能反映出所有发送分组的确认请求
- 如果出现了出错,接收方会向发送方进行回退操作:

TCP报文的首部
- TCP虽然是面向字节流的,但是TCP传送的数据单元确实报文段
- TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在它的首部各字段的作用
- TCP报文段首部的前20个字节是固定的,后面有4n字节是根据需要而增加的选项(n是整数)【最小长度是20个字节】
- 前两个字节是源端口和目的端口
- 序号字段占四个字节,在传输数据流的每一个字节都会有一个编号。(到达最大值之后重新回零)
- 确认号占四个字节作为接收方已经收到的确认号,以及期望对方接下来发送的序号
- 数据偏移段:32位 4个比特 最大值是15 最多可以有60个字节
- 保留字段:暂时没有用 站6个比特
- 窗口字段:2个字节,用来让对方设置发送窗口的依据。单位是字节
- 校验和:2个字节。范围是校验首部和数据两部分。计算校验和的时候,要在TCP报文段的前茅加上12字节的伪首部(网络层的原IP地址和目的IP地址和TCP的类型)
- 紧急指针字段:占16位,指出本报文段中紧急数据共有多少个字节(紧急数据放在本报文段的最前面)
- 选项字段:4字节的整数倍 填充字段 规定了最大报文长度mss:缓存所能接受数据的字段的最大长度是MSS个字节(提高传输效率,根据实际情况选择合适的MSS长度)
MSS与接受窗口值没有关系

发送缓存与发送方的关系:


1 | ### TCP超时重传 |
- 每发送一个报文段,就对这个报文段设置一次计时器
- 重传时间到了却还没有收到确认,就需要重传这一报文段
- 选取一个合适的重传时间。
重传时间的设置
自适应算法,记录一个报文发出的时间,以及收到的对应的时间。这两个时间差就是报文段往返的RTT
RTT可以通过一种新的方法来计算RTT

往返RTT的计算是非常复杂的方法
karn算法是用于此
TCP的流量控制
利用滑动窗口设置rwnd的接收窗口的大小实现流量控制的关键
发送数据的大小不超过rwnd的数据大小。
- 如果发送方发送的数据过快,接收方来不及接受,这就会造成数据丢失
- 流量控制就是让发送方的速率不要太快,既要来得及接受,也不要让网络发生拥塞
发多少字节是由接收方决定的,下面是一个例子

- 死锁的情况:(rwnd的非零窗口的确认分组没有收到,采用持续定时器机制来解决死锁)
B向A发送了零窗口的报文段后,B分接受缓存又有了一些存储空间。于是B向A发送了rwnd=400报文段
但是这个报文段在传送中丢失了,那么A一直等待B发松的非零窗口的通知,而B也一直等待A发送的数据
为了解决这个问题,提供了每一个连接的持续计时锁
- 持续计时器
- 每一个连接中都有一个
- 只要有一方收到对方的零窗口通知,就启动该持续计时器。
- 若持续计时器设置的时间到期,就发送一个零窗口探测文段,而对方就确认了这个探测报文段给出了窗口值
- 若窗口任然是0,则这个报文段的一方就可以重新设置计时器 了。
- 若窗口不是0,那么这个局面就可以改变了
TCP的传输效率
发送机制:
第一种机制:TCP维持一个变量=MSS 如果缓存的数据=MSS的时候就发送出去
第二种机制:发送方的应用进程指明要求发送报文段。TCP支持的推送操作
第三种机制:发送方的一个计时器期限到了会把已有的缓存装入MSS直接发送,但不能超过MSS
发送方糊涂窗口综合征:
发送方TCP每次接收到一个字节的数据后就发送
解决方式:Nagle算法
:发送第一个,后面的都缓存,当收到第一个确认的时候再去发送报文段 或者等于MSS的时候就直接发送
接收方糊涂窗口综合征:
接收方的缓存区域满的时候,接收方会通知接收方的窗口大小为0.如果这个时候接收方遵从交互式的方式的时候那么就会值发送一个字节的报文段
解决方式:让接收方等待一段时间。让接收缓存足够容纳最大缓存接受空间。或者一半也可以
TCP拥塞控制(全局性过程、动态问题)
拥塞:在某段时间,对网络中的资源的需求超过了该资源可以提供的可用部分,性能下降,这个现象叫拥塞
吞吐量:单位时间网络输出的分组数 在拥塞的时候就会随着负荷的增加而下降
简单的增加资源不能解决拥塞问题 当堵车的时候,简单的拓宽道路是不会有大效果提升
所以各种资源要匹配,才能正确的处理拥塞的问题。
拥塞引起的重传不能环节网络的拥塞,反而会加剧网络的拥塞
拥塞控制与流量控制的区别:
- 流量控制往往指点到点通信量的控制,是个端到端的问题。拥塞是一个全局性的过程,涉及所有的主机、路由器、降低网络传输性能的所有因素
- 流量控制所要做的就是一直发送端发送数据的速率,以便接收端来得及接收

原理:
分组丢失是网络发生拥塞的征兆,而不是原因。(路由器处理跟不上链路分组的传输,导致分组丢失)
设计算法:
开环控制和闭环控制
开环:事先分析导致拥塞的各方面原因,进行控制。(全方位考虑)
闭环:基于反馈环路。三种措施
检测网络系统以便检测拥塞何时何地发生
检测指标:

将拥塞发生的信息传送到可采取行动的地方(发送方和路由器)
调整网络系统的运行,限制发送方发送报文段的速率
TCP拥塞控制算法
慢开始:维持拥塞窗口CWND,发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量
(从小到大慢慢的增加发送量(指数),上限为ssthresh(门限)但不是发送慢速,而是慢慢增加发送量)
- Cwnd的设置不超过2-4个SMSS的数值
- 所以发送的窗口值是=Min(公告窗口值(接收方),拥塞窗口值)
- 基本原则:只要网络没有出现拥塞就可以放大拥塞窗口,只要出现了就必须减少
- 拥塞判断:①重传定时器的超时来判断,②收到三个相同的ACK

拥塞避免:当CWND达到极限的时候,就进入此阶段(缓慢增长来延迟拥塞,拥塞不可避免)
思路:当达到上限之后就让Cwnd缓慢的增加(线性)。
判断依据:①重传超时。
下一步:

实例:


快重传和快恢复:(防止因为报文段重新进入到慢启动的过程)
- 判断方式:连续收到3次ACK来判断
快重传:让发送发尽早知道发生了个别报文段的丢失
- 当确认丢失的情况时,要求接收方立刻发出确认。重复发送三个确认,使网络方认为没有发送拥塞
(并非取消重传计时器)- 提高约20%吞吐量
快恢复:当发送端收到三个重复的确认时,由于发送方认为很可能没有出现网络拥塞,所以不执行慢开始 而是快恢复
AIMD
发送窗口的上限
TCP的运输连接管理
TCP的连接的建立:
- 数据连接
- 数据传送
- 连接释放
TCP连接的要解决的三个问题:
- 要知道每一方的存在
- 要允许双方协商一些参数(最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量)
- 要对运输实体资源进行分配
建立的方式是:客户-服务器方式
- 客户:主动发起连接建立的应用叫做客户
- 被动等待连接建立的应用叫做服务端
建立连接的过程:握手
- 握手需要在客户端和服务器之间交换三个报文段。称之为三报文握手
- 防止已经失效的连接请求报文段又突然传送到了,因而产生错误

第三次的确认是非常重要的:可以防止对失效连接所在此发送的连接而造成的错误
TCP的连接释放
- 数据传输结束以后,通信的双方都可以释放连接。
- TCP连接释放的过程是四报文握手

- 设置两倍2MSL时间的原因是
- 为了保证A发送的最后一个ACK报文段能够达到B
- 防止“已失效的连接请求报文段”出现在本连接中。A在完成最后一个ACK报文段后,再经过2MSL,就可以让连接内产生的所有报文段从网络中消失。



