计算机网络自顶向下--运输层

运输层为不同系统之间的进程提供逻辑通信。

应用层进程使用运输层的提供的逻辑通信,而不用关心运输层的工作机制,这就是分层的好处。

运输层从从应用程序接收到的报文,转换为运输层分组(加上运输层的头部信息),成为报文段(segment),

网络层将其封装为网络层分组(数据报)发向目的地。

为了下面介绍具体的运输层协议,首先说明下网络层IP为不可靠服务,网络层是尽力交付服务,网络层是不保证

数据交付成功,也不保证交付的顺序,不保证数据的完整性。

运输层

3.1 运输层概述

tcp为应用程序提供了 可靠数据传输服务,使用了诸如(流量控制,序号,ACK,定时器)等机制保证将数据

按顺序正确的交付给接收进程。

tcp还提供了拥塞控制,tcp力求为没每个通过拥塞的网络链路的连接平等的共享网络链路带宽。

扫描二维码关注公众号,回复: 2387945 查看本文章

3.2 多路复用与多路分解

运输层并没有直接将数据交给进程,而是将数据交付给了某个socket,运输层首先检查这些运输层报文段的字段,

然后根据字段信息,标识出接收的socket,将运输层报文段中的数据正确的交付到合适的socket叫多路分解。

从主机中不同进程的套接字中收集数据块,并且为这些数据块封装上首部信息,产生报文段,然后将这些报文段

交付给网络成,成为多路复用。

每个报文段都有一个目的端口字段,来标识要交付给的套接字,

其中UDP套接字是由一个二元组标识的,该二元组是通过目的ip地址和目的端口号标识的。

TCP套接字是有一个四元组标识的,该四元组(源ip地址,源端口号,目标ip地址,目标端口号),

3.3 UDP协议:

应用层将数据交给socket,然后运输层UDP协议将数据打包,将报文段传递给网络层,

UDP没有握手(建立连接)的时延,UDP不维护连接状态,可以不用跟踪一些tcp如序号,确认号等参数,

相对而言,数据量会小,

UDP的首部只有8个字节,2个字节的源端口,2个字节目标端口,2个字节的长度,2个自己的校验和(差错检测功能,看是否bit发生了变化)。

UDP不保证数据的可靠交付,UDP的典型应用为DNS,UDP数据结构如下

3.4可靠数据传输(reliable data trsanfer protocol)

TCP就是在不可靠的IP协议上实现的可靠数据传输协议,

现在定义一个 可信信道(即数据在一条信道内进行传输,并且数据不会损坏,并且保持原顺序传输)。

第一种理想情况(实际信道是不可信的):

在现实中由于传输的信道是 可能发生丢包,顺序错乱情况的,继续升级

第二种情况:解决不可靠信道传输的问题,

当我们传输一个报文段到两外一台主机的时候,接收主机如果给我们一个回复,肯定确认回复,否定确认回复,

这样对于发送方就知道哪些数据是被收到的,哪些数据是没有收到的了,没收到的数据进行重传。

重传请求需要经过的几个步骤,

第一,差错检测,假设有个字段如校验和能够检测到内容是否被修改过,如果被修改过,证明数据不可用。

第二,接收方反馈肯定(ACK),或者否定(NAK),这样就知道接收方的接收情况

第三,重传

第三种情况,解决重传问题

在上面的图中makepkt中多了一个参数序号(0,1),如果NAK不发送,同时在确认ACK加入一个确认的序号就知道是那个报文段是已经确认的。剩下的就是有问题的报文段。

引入倒计时定时器,当经过倒计时的时间(需大于一个报文段往返的时间)的时候还没收到ACK那么则重发该分组,

这个定时器需要的功能如下

1,该定时器必须响应中断操作。

2,该定时器必须在发送分组,或者重传分组的时候启动定时器。

3,终止操作。

第四种情况,上面的虽然可以完成一个可靠的传输协议,但是效率太低

假设将一个报文段传入信道的耗时1毫秒,在信道中RTT平均耗时30毫秒,

这样会导致每31毫秒才能发送确认一个报文段,效率太低,大部分时间都在信道传输。

解决办法就是允许,传递多个报文段,同时允许存在多个已发送未确认的报文段,

1,增加序号范围,不仅仅只是0,1了

2,对于发送发必须能够缓存那些已发送没确认的报文段,对于接收方需要缓存那些已经成功接收的报文段,

因为存在延时接收到之前的报文段,或者丢失的情况。

3,解决差错恢复一般有两种情况,一种是回退N步GBN(go back n),另外一种是选择重传SR(selective repeat)。

发送方图(GBN,没列接收方)

选择重传:

和上面的区别在于,对于发送方,对于未按照顺序收到的ACK确认,只要该ACK在窗口内,那么发送方就把改报文段标识为已发送成功(在接收到的ack正好是base的时候移动窗口则前移),对于接收方,失序的报文就被缓存,直到更小需要的分则接收到为止,这是才会将按序的报文交付给应用层。

接收方图(SR选择重传,没列发送方图)

对于窗口大小N的定义,必须小于序号总空间大小的一般,不然,会出现 当前发送方发送的报文段(当某个报文段丢失的时候),对于接收方来说不知道是重传还是初次发送。

由于 序号是可以重复利用的,当一个序号x或者确认号x在中间网络缓存,或者其他原因x暂时被没有到达发送或者接收方,

序号x或者确认号x随时都有可能,重新发出。

在实际应用中,确认一个序号或者确认号x不在网络中,是通过发送方确认先前发送的分组都不会在网络中,具体实现是假定报文段在网络中存活的时间不超过某个具体的时间

tcp连接是面向连接的,必须先三次握手,同时tcp连接是全双工的。下面介绍下tcp的报文结构

tcp估算往返时间

tcp并不会对每个报文的发送计算时间,只是在特定时间进行某个报文段sampleRTT,sampleRTT是不会计算重传的报文段

tcp的加权平均值 estimateRTT= (1-a)*estimateRTT + a*sampleRTT,

a的值RFC给出的建议为0.125,

时间偏离值devRTT = devRTT*(1-b) + b*|estimateRTT -sampleRTT|

devRTT 的值越小越说明RTT越稳定

超时间隔必须大于estimateRTT,不然会造成没必要的重传,超时间隔也不能无限大,不然会造成延迟,那么他的上界建议为

timeoutInterval  =  estimatedRTT  +4*devRTT

timeoutInterval  的初始值建议为1秒,同时当出现超时的时候 timeoutInterval  的值将翻倍,

同时,当接收到确认ack的时候(非重传的报文段)或者接收到引用层数据将重新计算estimatedRTT 并且更新timeoutInterval 

tcp可靠数据传输

tcp是需保证数据传输到接收端的,当发生报文段丢失的时候,tcp需要重传该报文段,那么tcp什么情况下重传呢

当tcp接收到应用层数据的时候,准备将数据交付给IP,如果发现没有启动定时器,那么就启动一个定时器,

如果定时器启动了那么则共用同一个定时器(不会为每个报文段启动一个定时器,不然开销太大了)。

当定时器超时的时候,那么则重启定时器,超时时间翻倍,

当发送端接收到确认ACK,当该并且该ACK确认号>发送方sendbase时,并且发送方仍然有未确认的报文段,则重启定时器。

当发送方连续收到三次相同的ACK(接收端会回传ACK,如果不是按序则回传当前确认的最小序号),则说明报文段有丢失,

发送方则重新发送当前未被确认的最小序号的分组,而不用等待超时事件发送(不然耗时太长)

流量控制

tcp接收方有一个接受缓存,如果发送持续快速大量发送数据则接收方的接收缓存将溢出。buffer为接受缓存大小

tcp接收方必须维护一个rwnd(接收窗口),

lastByteRead = 应用层从接受缓存读取的数据;

lastByteRcvd = 从发送读取的字节序号;

rwnd= buffer-(lastByteRead-lastByteRcvd );

对于发送方lastByteSent - lastByteAcked的值必须  <= rwnd;不然就可能出现缓存溢出

有一种特殊情况,当rwnd的值为0的时候,发送方发送一个字节的数据给接收方,接收方清理缓存后发送一个更新后的rwnd给发送方

拥塞控制

拥塞控制,分为两大类,一类是是网络层提供辅助,典型的有ATM,ABR异步传输模型的可用传输速率

还有一种就是TCP自己实现端到端的拥塞控制。

此时发送方必须维护一个变量cwnd,为拥塞窗口,它对tcp能对发向网络中的速率进行限制。

lastByteRead-lastByteRcvd   < min{cwnd,rwnd};

cwnd即限制了未被确认的报文段的数量,则就可控制发送速率,发送速率为cwnd/RTT就是他的每秒发送速率。

对于发送端丢包时间有两种情况,超时,和收到三次ACK。

TCP可以根据丢包和ACK来调整他的cwnd,来控制发送速率

一个确认的ACK标示表示接收正常,可以增加发送速率。

一个超时事件,或者一个报文段连续收到重复ACK表示需要减少发送速率。

TCP拥塞算法主要包括如下3个部分

1,慢启动

慢启动是指在连接创建的时候,cwnd的值为1个MSS,发送方向网络中发送报文段,

一但全部被确认,那么发送方将以两倍cwnd的速度指数递增,

慢启动的结束事件为,当发生超时事件的时候,将cwnd将设置为1,重新进入慢启动状态。

同时设置变量ssthresh(慢启动阈值)为原cwnd的一半,当下次达到或者超过ssthresh的值的时候,就将进入拥塞避免模式。

当接收到三个冗余的ACK的时候,TCP将执行快速重传,进入快速恢复状态。

2,拥塞避免

当进入到拥塞避免阶段的状态,当到达一个新的 确认的时候,每个RTT,cwnd的窗口值将增1个MSS。

例如在一个RTT内发送了5个报文段,每个达到的ACK会增加1/5个MSS。

当出现超时丢包的情况的时候,sthresh的值将为原cwnd的一半,将进入慢启动状态,

当收到3个冗余的ACK的时候,将进入快速恢复状态,tcp将cwnd的值减半,sthresh的值是cwnd的一半,

3,快速恢复

对于引起tcp进入快速恢复的缺失报文段,对收到的每个冗余ack,cwnd将增加一个MSS,当收到缺失的报文段的时候,

将继续进入拥塞避免,

猜你喜欢

转载自blog.csdn.net/woyixinyiyi/article/details/80999563
今日推荐