计算机网络运输层的简单总结与思考

运输层

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
上面的脑图是这篇文章的思路,我会按顺序来讲解自己对于运输层的一个理解和思考。

1. 运输层和网络层的关系
在讲解运输层之前,先来讲讲网络层与运输层之间的关系。网络层其实就是主机到主机的一个点到点的逻辑通信,网络层完成了数据平面与控制平面上的功能,也就是转发和路由选择。详细一点的就在下一篇网络层里面讲解。而运输层就是端系统的进程与进程之间的点到点的逻辑通信。他们看起来非常相似,但是处于的层次不同,提供的服务也不同。网络层主要提供的是确定交付,确保时延,带宽等服务,而运输层提供可靠性数据传输,重传,计时等服务。用一个理想性的比喻,两个家庭在不同的国家,也就是两台主机,他们需要相互传输邮件,这个时候就需要邮局来完成这些事情。邮局负责决定中转站,传输路径等,而新到达目的邮局之后需要通过邮递员来送这些邮件到各个家庭。而每个家庭中都有一个人,就叫他们Ben和Jerry吧,他们负责把这些信给家庭的每个人。而这里网络层完成的就是邮局的工作,而运输层就是完成了Ben和Jerry的工作。运输层把报文交给套接字,然后送给对应进程,网络层就是把分组交给主机。

2. 多路复用与多路分解
多路复用简单来说就是应用传输的数据都通过套接字传输到运输层,让运输层完成接下来的包装和传输操作。多路分解,其实就是运输层收到报文段之后,根据对应的端口和ip地址来把这些报文送到对应的套接字这个就是多路分解。那么无连接的复用和分解与有连接的有什么不同。他们判断的元组不同。无连接的只需要二元组,目的ip与端口就可以了,因为无连接的传输比如UDP的传输都是直接把报文发送过去,而不会维持一个连接,这里只需要维持一个服务器应用套接字来接收这些报文就好了,而判断是什么套接字只需要目的端口与ip。而TCP类的一个应用可能就有好几个连接,加上不同主机可能有不同的端口号。所以源ip和端口加上目的ip与端口才能判断对应的套接字来传输报文。

3. UDP
简单说一下UDP,它是一个无连接的一个运输层协议。它完成的服务就是尽力而为的传输服务,也就是丢失,时延上限等这些服务调整它都不会提供。那么为什么UDP现在这么受欢迎呢?UDP传输速度快,可以在丢失一些报文的情况下完成实时应用的数据传输。相对TCP需要做的操作就很多,有拥塞控制还有流量控制自身的传输速度。而且UDP在只传输少量报文的时候有很大的优势,比如DNS的服务,UDP更好。因为TCP的三次连接消耗资源,而且所需时间长。而UDP即使是丢失报文重传速度也非常快。还有一点就是TCP的首部占用空间大。

4. 可靠传输协议的基本原理(FSM比较简便,细节可以看自顶向下,里面的代码更细节)
(rdt1.0协议)
要讲这个原理,就需要从最简单的情况上面来讲。首先假设最简单的一种情况。也就是没有差错和受损的报文和丢失的报文出现的情况。而且是单方向的传输情况。这个时候发送方的FSM(有限状态机,其实就是描述当前发送方的状态)只有一个状态和动作,只需要管发送就行了,而接受方也只需要管接收就好了。但是这种机制只是完成了最简单的尽力而为的服务,如果出现比特差错也是无能为力的。
在这里插入图片描述
(rdt2.0)
那么就要引入第二种情况不丢失报文的情况,但是会有比特差错的情况。那么这种情况相对来说要有些复杂了。仅仅只是发送和接收的动作是完全不够的。这个时候需要引入ACK/NAK机制。也就是一种确认与否认的机制。比如现在传输一个报文,接收方需要告诉发送方我到底是收到了还是没有收到。也就是说现在的这种情况要求协议提供三种功能
①差错检测
②应答机制
③重传
如果我们发现接收到了否认nak的话就需要进行重传,如果是确定ack的则是成功了。这个时候发送方的FSM有两种状态,一种是发送报文的状态,另一种是等待应答状态。而接收方只有一种等待接收的状态,但是会根据报文接收情况有两个动作一个是ack确认应答,一个是nak否认应答。这种协议是一种厅等协议,如果这个时候没有应答,无论上层怎么传输数据,运输层都需要等待到应答才会继续传输。

在这里插入图片描述
但是问题又来了,这种协议有个问题。他不能够处理受损的ACK。思考一下为什么。如果ACK受损了就无法知道到底报文是否正常传输了。那么怎么解决呢?答案就是使用序号。但是由于这是一个停等协议,其实序号的范围是很小的,只需要两个就好了,0和1。那么接下来就告诉你为什么需要序号。首先为什么在受损之后让发送方去询问这样的报文解决这种受损问题不行呢?如果询问也出了毛病,这个时候接收方也不知道这个信息是什么,那么就无法告诉发送方再发送一次,那么发送方和接收方处于一个死循环。还有一种方法就是发送方如果收到这个受损的ack就直接重传,但是会造成数据冗余的情况无法处理。那么为什么序号就可以完成这样的重传呢?因为我们可以通过01序号的变换来确定报文是不是一个需要重传的报文,ack0与ack1,如果发送方接收到多个ack0也就是说这个时候需要重传报文0,因为报文0可能受损了。如果是接收方收到多个报文0,可能就是ack0受损了。而这个时候可靠传输协议也能够完成数据冗余的处理。(如果描述有点难懂可以看看下面的图)。解释一下下面的图,它是rdt2.2的情况。他这里不再使用ACK/NAK机制而是全部有ack就可以完成全部的应答。当ack=0的时候,就是否认,如果是确认的时候,ack=1。但是不要搞混了,下面的ack0只是一个序号标记的ack而不是ack=0。仔细来说就是序号是否变化将会决定报文或者ack是不是需要重传。比如第一个传输的报文0,第二个传输的是报文1,那么接收方不需要重传,如果报文0连续出现,的话也就是说发送方没有正确接收到ack0,需要接收方重新发送。换过来1也是这么操作。由于是停等协议,每次都是需要报文法送到接收成功才能够发送下一个报文,所以序号只需要在01之间切换来确认报文是不是需要重传。
(第一种方法)
在这里插入图片描述

(序号的方法)
发送方状态变化
在这里插入图片描述
接收方状态变化

(rdt3.0)
最后还有一种情况就是丢失报文,报文损坏都会出现的情况。那么怎么检验丢失和处理呢?可以通过计时器来判断是不是丢失,如果超时了就需要重传这个报文。而fsm只需要加上一个计时和超时重传的操作就好了。
在这里插入图片描述
那么所有的情况都涉及到了。接下来就要谈谈停等协议会出现的问题。每次都是需要发送并确认之后才能发送下一个报文。那么看上去好像没什么问题。但是从细节上面去看,我们传输报文(发送报文时需要准备,就好像是射击之前需要上弹的时间)的时间非常短,但是传播报文的时间占比非常大。这样的话,一个来回传输报文所需时间占比太少,也就是说发送方利用率非常低。那么怎么解决这个问题?可以通过流水线技术来解决。流水线技术允许发送方一次可以发送多个报文(暂时不管流量控制),并且接收方也可以发送多个ack应答。那么就不需要等待前面的报文发送之后才能发送下一个。传输占用的时间增加,利用率也增加了。但是流水线技术需要什么功能呢?如果我们还是用01序号配合就会发送很多个01重复的报文,如果受损或者丢失完全无法处理。这个时候就需要扩展序号的范围。还需要两个功能就是确认累积和重传机制。
首先来说说什么是确认累积,也就是说需要报文按照顺序返回的ack来累积确认。如果没有确认成功就需要重传。
第一个重传的方法就是回退n步,gbn协议。简单来说就是一个窗口机制。我们每次可以同时发送的报文数字是被一个窗口大小限制的,而接收方只接受有序的报文段,如果其中发生了丢包或者损失就需要重传,发送方会重传窗口上面已经发送但是没有确认的报文。而这个也是这个协议的缺点,重传了很多没有用的报文段(冗余)。
第二个重传机制就是选择重传。与gbn不同,它会判断哪个报文可能丢失和受损来接收报文。而且可以把无序的报文放到运输层的缓存中等待所有的报文到到达。

5. 面向连接的tcp
首先介绍一下mss也就是tcp中最大的可发送数据长度,而它收到mtu链路层可发送数据长度的的限制。它是tcp比较重要的一部分。但是真正决定tcp重要的部分的tcp的确认号字段和序号字段。为什么他们这么重要呢?第一个先讲讲三次握手也就是tcp的连接管理。第一次客户发送syn=1(syn其实就是请求连额吉的一个tcp字段)的报文请求连接,并且包含了序号与确认号,其中序号是标记着数据的开始位置。而确认号的含义就是确认号之前的数据都传输成功了,并且请求确认号之后的数据。也就是说确认号有两个功能,确认和请求下一个数据段,如果多次请求同样的数据段也就是说这个是一个重传。接下来呢,第二次握手就是服务器端发送一个syn ack,包含了服务器端的初始序号和确认号。最后就是客户端发送一个ack并且可以传输数据了。这个就是三次握手的简单介绍。接下来tcp既然连接了,那肯定也需要有断开的机制,也就是4次挥手。首先是客户端发送fin=1来请求断开连接,而服务器端发送一个ack,然后再发送一个fin=1,最后客户端发送一个ack完成四次挥手的操作。其中客户端和服务器端都有多个状态的变化,在这里就不详细介绍了。

tcp提供了什么样的功能?第一个就是我们都知道的可靠数据传输。可靠数据传输需要什么样的功能服务完成呢?第一个就是ack应答,这里的ack应答就与之前的很不一样。它的含义在这个号前面的数据已经成功传输,比如345,345序号之前的报文已经成功传输。如果出现多次相同的ack号也就是需要重传这个345报文了。第二个功能就是计时,也就是超时重传解决丢包问题。第三个功能就是重传功能。那么这里的超时时间是怎么计算出来的呢?RTT也就是一个数据报文往返的时间一定是小于这个超时间隔时间的,不然就会造成大量的没有用的重传。这里超时间隔也是通过这个SampleRTT进行计算的,tcp传输会不时地计算这个来回时延,并且通过指数加权移动平均来计算这个时延。它会通过,计算出来的数值和RTT的波动数值来进行计算(不详细介绍)。

tcp传输还有一个快速重传的功能,其实就是通过三次冗余的ack来让发送方重传报文。那么为什么1需要快速重传呢?如果这个时候超时间隔太长的时候就需要这个重传的机制来完成判断丢失的重传。

tcp的重传机制也很特别,它集合了gbn的确认累积的一个功能,还有选择重传的功能的一个重传机制,他可以接收失序的分组放在·缓存,而且ack有着捎带数据(请求下一个报文)的功能,并且可以用于检测重传(多个同样的ack)。

除此之外tcp还有流量控制功能。也就是窗口机制,我们都知道无论是发送方还是接收方都有对应的缓存,如果发送速度太快,那么接收方的缓存用满接下来的报文就会被丢弃。这个时候就需要两方互相发送报文来告知对方窗口的大小,并且控制发送速率。

6. 拥塞控制
第一个需要介绍的就是拥塞控制的原理,为什么会产生拥塞?首先是最简单的情况,两台无限缓存的路由器,如果我们发送速率非常快,而路由处理报文的速率比报文到达率要更小,那么就会造成排队时延。第二种就是两个有限缓存的路由器会造什么问题。如果缓存发送速率太快,缓存满了,那么后到的报文段就会被丢弃。而且如果排队时延太大就会造成多余的重传占用链路容量。最后一种情况就是多个路由的情况,如果多个路由器在工作和发送报文,一个报文经过多个路由,但是在其中一个中被丢失,就会导致上游的路由器的传输容量被浪费。

那么拥塞控制的方法有什么?第一个就是端到端的控制,比如冗余ack,第二种就是网络辅助,由网络层标记丢失情况,并且通知给运输层来调整发送速度。

7. 如何进行拥塞控制
首先先提出问题,怎么控制流量?怎么设置流量控制算法?如何检测拥塞?

首先解决第一个问题如何控制流量,答案就是使用拥塞窗口来控制一次可以发送报文数量,假设除去流量控制功能,单单只是用拥塞控制窗口。cwnd拥塞控制窗口会控制发送方一次可以发送的报文数量。

第三个问题如何检测呢?可以通过丢包情况,比如冗余ack和超时重传的次数来判断拥塞情况。如果丢失包那么就可以当做是一个拥塞的指示,开始进行拥塞控制。

第二个问题,也就是一个关键问题如何进行用算法进行流量控制。
算法的组成有慢启动、拥塞避免、快速恢复。简单总结就是三种不同状态。慢启动的方法是每次窗口设置为1,并且慢慢开始指数级别的增长,如果发现超过阀值,那么就转入到拥塞避免的状态(暂时略过)。如果发现丢包情况出现,那么可以进入快速恢复状态(暂时略过),也可以把阀值=窗口/2,窗口等于1重新开始进行慢启动的操作。

接着就是拥塞避免,他比慢启动更温和,如果超越阀值就需要转入到拥塞避免的操作。这里的窗口会线性增长每次增长一个mss报文段,检测带宽。如果发生丢包那么就会进入快速恢复状态或者是阀值=窗口/2,并且窗口=窗口/2,如果超时重传就会重新回到慢启动状态。

然后就是快速恢复,它其实也是每次增长一个mss,如果这个得到丢包的ack就会回到拥塞避免状态,如果是超时就会回到慢启动的状态。

上面的介绍就是算法的功能与状态的切换。

最后介绍一下拥塞通告和公平性问题,其实就是网络辅助的一个拥塞告知,它会在网络层测试,如果发现丢包就会给ip数据报的ecn字段标记,并且去到接收方后,检测这个ecn字段,并且可以配置tcp的ece字段来告知发送方网络拥塞,而发送方也可以通过cwr字段来告知接收方是否完成拥塞控制。

那么什么是公平性问题?其实就是带宽的一个争抢。假设使用aimd算法,加性增,乘性减,没有慢启动的状况,其实就是类似于拥塞避免算法的计算方式来控制窗口。如果两个tcp连接的rtt相等与mss大小相同,那么他们竞争带宽的都是各自一半的,但是如果是其中有一个tcp连接的rtt更小,那么这个tcp连接就有可能抢占带宽。而与之相比的udp协议就是不公平的,它会按照自己的速率发送,也不管有多么拥塞。

最后总结:运输层里面最关键就是理解tcp的一个运作原理,拥塞控制等。并且需要梳理好网络层和运输层的一个关系。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值