计算机网络第五章
五、运输层
运输层向上面的应用层提供通信服务,属于面向通信的最高层,同时也是用户功能的最底层
网络层IP协议只在源主机到目的主机之间作用,并不在意主机内进程通信的细节。而运输层协议TCP和UDP在源主机的某个通信进程到目的主机的对应的通信进程之间作用,范围更宽更深入
端到端的通信是进程之间的通信
功能:发送报文时的复用、接收报文后的分用
运输层只有两种协议:面向连接的TCP、无连接的UDP
TCP:相当于建立一条全双工的可靠信道
UDP:提供一条不可靠信道
两个对等运输实体在通信时传送的数据叫运输协议数据单元TPDU,TCP传送的是TCP报文段,UDP传送的是UDP报文
端口
16位端口号。端口号只具有本地意义,端口号只标志本计算机应用程序中的各进程
通过IP地址找到互联网上的唯一主机,通过端口号找到该主机上的唯一进程
分类:
- 服务器端使用:熟知端口0-1023、登记端口号1024-49151
- 客户端使用:短暂端口号49152-65535
常用端口:
用户数据报协议UDP
在IP层的数据报服务上增加了复用和分用的功能、差错检测的功能
特点:
- 无连接的:发送数据不需要建立连接
- 尽最大努力交付:不保证可靠交付,不需要维持复杂的连接状态表
- 面向报文的:UDP对应用层交下来的报文,不合并不拆分,一次交付一个完整的报文
- 没有拥塞控制:网络的拥塞不会影响源主机的发送速率
- 支持一对一、一对多、多对一、多对多通信
- 首部开销小:首部只有8个字节
应用程序必须选择合适大小的报文
UDP首部:
计算校验和时,临时把“伪首部”和UDP用户数据报连接在一起,伪首部仅仅是为了计算校验和,并不加入到UDP数据报中
传输控制协议TCP
特点:
- 面向连接的
- 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)
- 提供可靠交付(不重复、不丢失、不失序)
- 提供全双工通信
- 面向字节流:虽然TCP的交互是一次一个数据块,但是TCP把数据看成一连串无结构的字节流
不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系,但是接收方收到的字节流和发送方发送的字节流必须相同
TCP不关心应用进程一次把多长的报文发送到TCP缓存。TCP对连续的字节流进行分段,形成TCP报文段
TCP根据对方给出的窗口值和当期网络拥塞的程度来决定一个报文段应包含多少个字节
TCP连接的端点叫做套接字socket或插口
套接字:端口号拼接到IP地址
TCP报文段首部:
首部最小长度为20个字节
源端口和目的端口各占2个字节,是运输层和应用层的服务端口,运输层的复用和分用功能都要通过端口实现
序号占4字节,TCP连接中传送的每一个数据流中的每一个字节都编上一个序号。序号字段的值为本报文段所发数据的第一个字节的序号
确认号占4字节,是期望收到下一个报文段的数据报的第一个字节的序号
数据偏移占4位,即首部长度,指出TCP报文段的数据起始处离报文起始段有多远,单位为4个字节
保留字段占6位,目前置0
紧急URG占1位,URG=1表示紧急指针字段有效
确认ACK占1位,ACK=1表示确认号字段有效;ACK=0表示确认号字段无效
发送PSH占1位,PSH=1表示TCP尽快地交付接收应用进程,而不再等到缓存满后再交付
复位RST占1位,RST=1表示TCP连接出现差错,必须释放连接,重新建立连接
同步SYN占1位,SYN=1表示这是一个连接请求或连接接受报文
终止FIN占1位,FIN=1表示发送端数据已发送完毕,请求释放连接
窗口占2个字节,接受窗口大小,用来让对方设置发送窗口的依据
检验和占2字节,检验的范围包括首部和数据,还需要加上伪首部运算
紧急指针占2字节,指出本报文段紧急数据共多少字节,紧急数据放在报文段数据的最前面
可选字段长度可变
**实现可靠传输:**以字节为单位的滑动窗口、超时重传时间的选择、选择重传SACK
**自动重传请求ARQ:**使用确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信
ARQ方法分类:停止-等待ARQ、回退N帧ARQ、选择重传ARQ
停止等待ARQ协议
每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组
使用停止-等待ARQ模式
差错控制:
- 发送方超时重传:发送方为每一个已发送的分组都设置一个超时计时器,如果超时之前收到确认就撤销计时器,继续发送下一个分组;否则重新发送超时的分组
在发送完一个分组后,必须暂时保留已发送的分组的副本,以备重发
分组和确认分组ACK都必须编号
超时重传时间设置:
-
加权平均往返时间RTTS:新的RTTS = (1-α)×旧的RTTS + α×新的RTT样本,α推荐取0.125 -
超时重传时间RTO:RTO = RTTS + 4 × RTTD,其中RTTD是RTT的偏差的加权平均值,第一次取RTT样本值的一半 新的RTTD = (1-β)×旧的RTTD + β × | RTTS - 新的RTT样本 |,其中β推荐取0.25 -
修正的Karn算法:报文段每重传一次,就把RTO增大一些。新的RTO = γ × 旧的RTO,其中γ取2
连续ARQ协议
发送方维持一个发送窗口,在发送窗口内的分组都可以连续的发送出去,而不需要等待对方的确认。发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。接收方也维持一个接收窗口,表示只允许接收窗口内序号的分组
累计确认:接收方只对按序到达的最后一个分组发送确认,表示到这个分组为止之前所有的分组都已经收到了
**回退N帧ARQ:**表示需要退回来重传已发送过的N个分组
TCP的可靠传输机制用字节的序号进行控制。TCP所有的确认都是基于序号而不是基于报文段
TCP利用滑动窗口实现了流量控制
**选择重传ARQ:**接收方接收的字节流不连续,告诉发送方哪些字节块未收到,发送方只发送丢失那部分字节,不会发送后面发送过并被正确接收的字节
流量控制
利用可变窗口进行流量控制
当接收方接收窗口大小rwnd为0时,发送方在收到确认后发送窗口大小也会变成0。此时如果接收方rwnd不为0时,发送方却并不知道,发送窗口始终为0,就不会进行数据传输,产生死锁。解决方法为为TCP连接设置一个持续计时器,TCP连接的一方收到零窗口通知就启动持续计时器,时间到期则就发送一个1字节的零窗口探测报文段,若对方如果rwnd不为0就会在给出ACK时给出rwnd的值,解除死锁;若对方rwnd仍为0,则收到零窗口通知的一方则重置持续计时器
糊涂窗口综合症:接受方应用程序从接受窗口中提取字节速度较慢,使得接收方接受窗口rwnd始终很小,导致发送方发送窗口很小,TCP传输效率低。解决方法为让接受方等待一段时间,使得接受缓存足够容纳一个最长的报文段或者有一半的空闲空间,这时再发出ACK确认报文
Nagle算法:若发送应用进程把要发送的数据逐个字节地送到TCP的发送缓存,则发送方就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来。当发送方收到对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。只有在收到对前一个报文段的确认后才继续发送下一 个报文段。当到达的数据已达到发送窗口大小的一半或已达到报文段的最大长度时,就立即发送一个报文段
拥塞控制
拥塞:在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏
拥塞常常趋于恶化。因为路由器因为没有足够缓存会丢弃一些分组,这些被丢弃的分组就会发生重传,从而加剧网络拥塞
拥塞控制:防止过多数据注入到网络中
流量控制是对点对点通信量的控制,拥塞控制是全局的,涉及到所有主机、路由器以及有关所有因素
拥塞控制是一个动态的过程
基于窗口的方法:
TCP发送方维持一个拥塞窗口cwnd
发送窗口大小取cwnd和rwnd的最小值
拥塞的判断:重传定时器超时(已经拥塞)、收到三个相同的ACK(快拥塞)
TCP拥塞控制算法:慢开始、拥塞避免、快重传、快恢复
慢开始:
由小到大逐渐增大拥塞窗口数值。发送方每收到一个对新报文段的确认,就使cwnd+1,即每过一个传输轮次,cwnd就翻倍
慢开始门限ssthresh(状态变量):防止拥塞窗口cwnd增长过大引起网络拥塞
**拥塞避免算法:**cwnd缓慢增大,每经过一个RTT就使cwnd+1
当网络出现拥塞时:①ssthresh = max(ssthresh/2, 2);②cwnd=1;③执行慢开始算法
快重传FR:
首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认
含义:当发送方收到三个重复ACK,就立即进行重传
快恢复FR:
当连续收到三个重复ACK时,不执行慢开始算法,而是①ssthresh = cwnd / 2;②cwnd = ssthresh;③开始执行拥塞避免算法
TCP运输连接管理
分为三个阶段:连接建立、数据传送、连接释放。连接管理就是建立和释放连接
TCP连接建立的方式采用客户服务器方式,主动发起连接的应用程序叫客户,被动接受连接的应用程序叫客户端
TCP建立连接的过程叫握手。握手需要在客户和服务器直接交换三个TCP报文段,称为三报文握手
三报文握手是为了确认既可以从客户向服务器发送数据,又可以从服务器向客户发送数据
释放连接需要四报文握手,双方都需要发送一次释放请求,并得到对方的ACK,所以需要四次握手。最后一次确认发送后,这一方会设置一个等待计时器,在2MSL时间过后,如果没有收到新的数据,那么就释放连接
|