《计算机网络》学习笔记(4)——运输层

一:运输层的定义

从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通
信部分的最高层,同时也是用户功能中的最低层。真正进行通信的实体是在主机中的进程

二:运输层的作用

  1. 提供应用进程间的逻辑通信。网络层是为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。
  2. 对收到的报文进行差错检测
  3. 向高层用户屏蔽了下面网络核心的细节

三:运输层的端口

定义

通过在运输层使用协议端口号对运输层进行复用和分用。

TCP/IP的运输层用一个16位端口号来标志一个端口。但请注意,端口号只具有本地意
义,它只是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口。

分类

1. 服务器
  1. 熟知端口号或系统端口号(0-1023)。IANA把这些端口号指派给了 TCP/IP最重要的一些应用程序,让所有的用户都知道。当一 种新的应用程序出现后,IANA必须为它指派一个熟知端口,否则因特网上的其他应用进程就无法和它进行通信。
  2. 登记端口号,数值为(1024-49151)。这类端口号是为没有熟知端口号的应用
    程序使用的。使用这类端口号必须在IANA按照规定的手续登记,以防止重复。
2.客户端

数值为49152-65535。由于这类端口号仅在客户进程运行时才动态选择,因此又叫做短暂端口号,通信结束后,刚才己使用过的客户端口号就不复存在。

四:运输层的协议

1:UDP——用户数据报协议

(1):定义

UDP只在IP的数据报服务之上增加了复用分用的功能以及差错检测的功能。

(2):主要特点
  1. UDP是无连接的,即发送数据之前不需要建立连接。减少开销和发送数据的时延
  2. UDP使用尽最大努力交付,即不保证可靠交付。主机不需要维持复杂的连接状态表
  3. UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向
    下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
  4. UDP没有拥塞控制,网络出现的拥塞不会使源主机的发送速率降低。
  5. UDP支持一对一、一对多、多对一和多对多的交互通信。
  6. UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
(3):首部
  1. 源端口:源端口号。在需要对方回信时选用。不需要时可用全0。
  2. 目的端口:目的端口号。这在终点交付报文时必须要使用到,找不到就丢弃。
  3. 长度:UDP用户数据报的长度,其最小值是8 (仅有首部)。
  4. 检验和:检验户数据报在传输中是否有错。有错就丢弃。

发送方:

  • 在UDP用户数据报之前增加伪首部(源IP地址,目的IP地址,全0,IP首部中的UDP协议字段字段17,UDP长度)。
  • 先把全零放入检验和字段,再把伪首部以及UDP用户数据报看成是由许多16位的字串接起来。
  • 若UDP用户数据报的数据部分不是偶数个字节,则要填入一个全零字节(但此字节不发送)。
  • 然后按二进制反码计算出这些16位字的和。写入检验和字段。

接收方:

  • 把收到的UDP用户数据报连同伪首部(以及可能的填充全零字节)一起,按二进制反码求这些16位字的和
  • 当无差错时其结果应为全1

2:TCP——传输控制协议

(1):主要特点
  1. TCP是面向连接的运输层协议。这就是说,应用程序在使用TCP协议之前,必须先
    建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。
  2. 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。
  3. TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、
    并且按序到达。
  4. TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。
    TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
  5. 面向字节流。应用程序和TCP的交互是数据块(大小不等),TCP不保证接收方收到的数据块和发送方发出的数据块具有对应大小的关系,只保证字节流的完整性。

面向连接的端点——套接字(socket):端口号拼接到IP地址即构成了套接字。
表示:套接字 = (IP地址:端口号)

(2):首部
  1. 源端口:写入源端口号。
  2. 目的端口:写入目的端口号。
  3. 序号:本报文段所发送的数据的第一个字节的序号。
  4. 确认号:期望收到对方下一个报文段的第一个数据字节的序号。(若确认号=N,则表明到序号N-1为止的所有数据都己正确收到)
  5. 数据偏移:指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。即首部长度(最大值是60字节)
  6. 保留:保留为今后使用,但目前应置为0。
  7. 紧急URG:当URG = 1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
  8. 确认ACK :仅当ACK = 1时确认号字段才有效。连接建立后所有传送的报文段都必须把ACK置1。
  9. 推送PSH:当两个应用进程进行交互式的通信时可以立即响应,发送方把PSH置1,键入一个命令后立即就能够收到接收方的响应。
  10. 复位RST:当RST = 1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。
  11. 同步SYN:在连接建立时用来同步序号。当SYN = 1而ACK = 0 时,表明这是个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN = 1 和ACK = 1,表明这是个连接接受报文段。
  12. 终止FIN:用来释放一个连接。当FIN= 1时,表明此报文段的发送方的数据己发送完毕,并要求释放运输连接。
  13. 窗口:窗口字段明确指出了现在允许对方发送的数据量(接收缓存空间为确认字段号~窗口字段号)。窗口值是经常在动态变化着。
  14. 检验和:和UDP要在TCP报文段的前面加上12字节的伪首部(TCP协议号为6)
  15. 紧急指针:紧急指针仅在URG = 1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。
  16. 选项:最大报文段长度MSS(MSS过小导致网络利用率低,MSS过大导致IP分片),窗口扩大选项(最大的窗口从64 K字节再增加16K字节),时间戳(用来计算往返时间RTT,防止序号绕回 即处理TCP序号超过232的情况),选择确认选项。
(3):提供可靠传输
1:停止等待协议
流程:
  • 发送方:
  1. 发送方在发送完一个分组后,对分组进行编号。
  2. 设置一个超时计时器,(超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些)。如果在超时计时器到期之前收到了对方的确认,就撤销已设置的超时计时器。
  3. 必须暂时保留已发送的分组的副本,只有在收到相应的确认后才能清除暂时保留的分组副本。
  4. 发生了超时重传(发送方超过了一段时间仍然没有收到接收方的确认),认为刚才发送的分组丢失了,重传分组。
  5. 若接收方发送确认迟到,则丢弃重复的确认。
  • 接收方
  1. 接收分组后,对分组进行编号,并发送确认。
  2. 若发送确认失败,则应该丢弃重传的重复的分组,并发送确认。
特点

优点是简单,但缺点是信道利用率太低。

超时计算时间(Karn算法)

TCP采用了一种自适应算法,它记录一个报文段发出的时间,以及收到相应的确认的
时间。这两个时间之差就是报文段的往返时间RTT。
TCP保留了 RTT的加权平均往返时间RTTS和偏差的加权平均值RTTD。
超时重传时间RTO = RTTS + 4 x RTTD
报文段每重传一次,就把超时重传时间RTO增大一些,可以取新的重传时间为2倍的旧的重传时间。

2:连续ARQ协议
流程
  • 发送方
  1. 发送方使用了 “发送窗口”,位于发送窗口内的多个分组都可连续发送出去,而不需要等待对方的确认。
  2. 发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。
  • 接收方
    接收方一般都是采用累积确认的方式。接收方在收到多个分组后,对按序到达的最后一个分组发送确认,表示到这个分组为止的所有分组都己正确收到了。
特点

优点是简单,信道利用率提高
缺点是接收方不能向发送方反映出自己己经正确收到的所有分组的信息。

发送窗口

在这里插入图片描述
定义:
在没有收到接收方的确认的情况下,发送方可以连续把窗口内的数据都发送出去。凡是己经发送过的数据,在未收到确认之前都必须暂时保留,.以便在超时重传时使用。

在经过一段时间后(由超时计时器控制)就重传这部分数据,重新设置超时计时器,直到收到接收方的确认为止。如果收到的确认号落在发送窗口内,那么A就可以使发送窗口继续
向前滑动,并发送新的数据。

虽然发送方的发送窗口是根据接收方的接收窗口设置的,但在同一时刻,发送窗口并不总是和接收窗口一样大。一个原因是通过网络传送窗口值需要经历一定的时间滞后,另一个原因是发送方根据网络当时的拥塞情况适当减小自己的发送窗口数值。

前后:

  • 发送窗口后沿的后面部分表示已发送且已收到了确认,这些数据不需要再保留了。
  • 发送窗口前沿的前面部分表示不允许发送的,因为接收方都没有为这部分数据保留临时存放的缓存空间。

位置:由窗口前沿和后沿的位置共同确定。

  • 发送窗口后沿的变化情况有两种可能:不动(没有收到新的确认)和前移(收到了新的确认)。发送窗口后沿不可能向后移动,因为不能撤销掉己收到的确认。
  • 发送窗口前沿的变化情况有三种可能:不断向前移动(收到确认),向后收缩(对方通知的窗口缩小了),不动。这对应于两种情况:一是没有收到新的确认,对方通知的窗口大小也不变;二是收到了新的确认但对方通知的窗口缩小了。

指针:

  • 小于P1:已发送并已收到确认的部分
  • 大于P3:不允许发送的部分。
  • P1-P3:发送的发送窗口(又称为通知窗口)
  • P1-P2:己发送但尚未收到确认的字节数
  • P2-P3:允许发送但尚未发送的字节数(又称为可用窗口或有效窗口)
发送缓存

定义:存放己发送出、但尚未收到确认的数据和准备发送的数据。
发送窗口通常只是发送缓存的一部分。

接收窗口

在这里插入图片描述
定义:接收方在收到多个分组后,对 按序到达 的数据的最高序号发送确认。

不按序到达的数据通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。

  • 可以双方事先商定好,通过建立TCP连接时,在首部的选项中加上“允许SACK”的选项。那么原来首部中的“确认号字段”的用法仍然不变。只是以后在TCP报文段的首部中都增加了 SACK选项,以便报告收到的不连续的字节块的边界。(最多只能指明4个字节块的边界信息)
  • 大多数还是重传所有未被确认的数据块。

接收方具有累积确认的功能,这样可以减小传输开销。但是不应过分推迟发送确认,否则会导致发送方不必要的重传,另外捎带确认信息并不经常发生。

前后:

  • 接收窗口后沿的后面部分表示己发送确汄并交付主机 ,这些数据不需要再保留了。
  • 接收窗口前沿的前面部分表示不允许接收的,因为没有为这部分数据保留临时存放的缓存空间。

位置:由窗口前沿和后沿的位置共同确定。

  • 后沿的变化情况有两种可能:不动(没有收到数据)和前移(收到了数据并交付主机)。
  • 发送窗口前沿的变化情况有三种可能:不断向前移动,向后收缩(对方通知的窗口缩小了),不动。这对应于两种情况:一是没有收到新的确认,对方通知的窗口大小也不变;二是收到了新的确认但对方通知的窗口缩小了。
接收缓存

定义:存放按序到达的、但尚未被接收应用程序读取的数据和未按序到达的数据。
接收窗口通常只是接收缓存的一部分。

(4):流量控制——减慢发送方的发送速率,接收方才来得及接收。
1.使用滑动窗口

目的:进行流量控制

  1. 在连接建立时,接收方把自己的接收窗口字节大小X告诉给发送方,则发送方的发送窗口不能超过接收方给出的接收窗口的数值。
  2. 在通信过程中,接收方把确认位ACK=1、确认字段值、接收窗口大小 发给发送方,限制发送方的发送起始数据以及发送窗口大小。当发送方的起始数据超过确认字段值或者发送方发送的总报文数(即发送窗口)超过接收窗口时,停止发送。
  3. 为了防止报文丢失,连接的一方在收到对方的零窗口通知,就启动 持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带1字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。如果窗口仍然是零,那么收到这个报文段的一方就重新设置持续计时器。如果窗口不是零,则可以继续发送。
2.Nagle算法

目的:当数据到达较快而网络速率较慢时,减少所用的网络带宽。

  1. 发送应用进程把要发送的数据逐个字节地送到TCP的发送缓存,并把第一个数据字节先发送出去,后面到达的数据字节都缓存起来。
  2. 当发送方收到对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。
  3. 只有在收到对前一个报文段的确认后才继续发送下一个报文段。当数据到达较快而网络速率较慢时,用这样的方法可明显地减少所用的网络带宽。
3.糊涂窗口综合症

目的:避免发送方发送很小的报文段,接收方确认很小的窗口。

  1. 接收方等待一段时间,使得接收缓存己有足够空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间,再发出确认报文,并向发送方通知当前的窗口大小。
  2. 发送方也不要发送太小的报文段,而是把数据积累成足够大的报文段,或达到接收方缓存的空间的一半大小,再发出报文。
(5):拥塞控制
定义:

在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。

负载:代表单位时间内输入给网络的分组数目,也称为输入负载或网络负载。
吞吐量:代表单位时间内从网络输出的分组数目。

具有理想拥塞控制的网络,在吞吐量饱和之前,网络吞吐量应等于提供的负载,当提供的负载超过某一限度时,由于网络资源受限,吞吐量不再增长而保持为水平线,即吞吐量达到饱和。这就表明提供的负载中有一部分损失掉了。

实际上,随着提供的负载的增大,网络吞吐量的增长速率逐渐减小。也就是说,在网络吞吐量还未达到饱和时,就己经有一部分的输入分组被丢弃了。当提供的负载达到某一数值时,网络的吞吐量反而随提供的负载的增大而下降,这时网络就进入了拥塞状态。当下降到零时,网络己无法工作。这就是所谓的死锁。

解决:

(1)开环控制:事先将有关发生拥塞的因素考虑周到,力求网络在工作时不产生拥塞。
(2)闭环控制

  1. 监测网络系统以便检测。由于缺少缓存空间而被丢弃的分组的百分数、平均队列长度、超时重传的分组数、平均分组时延、分组时延的标准差等等指标的上升都标志着拥塞的增长。
  2. 把拥塞发生的信息传送到可采取行动的地方,要将拥塞发生的信息传送到产生分组的源站,另一种方法是在路由器转发的分组中保留一个比特或字段表示堵塞,
  3. 调整网络系统的运行

发送方维持持一个叫做拥塞窗口的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方的发送窗口会小于等于拥塞窗口。

  • AIMD算法(加法增大乘法减小)= 慢开始+拥塞避免

发送方控制拥塞窗口的原则:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。
在这里插入图片描述

  1. 当主机开始发送数据时,由小到大逐渐増大拥塞窗口数值。通常在刚刚开始发送报文段时,先把拥塞窗口 设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送方的拥塞窗口,可以使分组注入到网络的速率更加合理。
  2. 每经过一个 传输轮次 (即往返时间RTT),拥塞窗口就加倍。
  3. 当拥塞窗口 < 慢开始门限时,继续使用上述的慢开始算法。当拥塞窗口= 慢开始门限时,既可使用慢开始算法,也可使用拥塞避免算法。当拥塞窗口 > 慢开始门限时,停止使用慢开始算法而改用拥塞避免算法。
  4. 每经过一个 传输轮次 (即往返时间RTT),拥塞窗口就+1。
  5. 只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就要 “乘法减小” ——把慢开始门限设置为出现拥塞时的发送方窗口值的一半 (但不能小于2)。然后 “加法增大”——把拥塞窗口重新设置为1,执行慢开始算法。
  • 快重传和快恢复(超时计时器时限已到)
    在这里插入图片描述

快重传:

  1. 接收方每收到一个失序的报文段后就立即发出重复确认(为的是使发送方及时知道有报文段没有到达)而不要等待自己发送数据时才进行捎带确认。
  2. 发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。

快恢复:

  1. 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限减半。这是为了预防网络发生拥塞。
  2. 发送方不执行加法增大,而是把拥塞窗口值设置为慢开始门限减半后的数值,(也有的是增大3个报文段的长度)然后开始执行拥塞避免算法。
(6):随机早期检测RED——网络层与运输层的配合
问题
  • 路由器的处理速度:路由器对分组的处理时间特别长,那么这就可能使这些分组中的数据部分(即TCP报文段)经过很长时间才能到达终点,结果引起发送方对这些报文段的重传。
  • 路由器的分组丢弃策略:路由器的队列通常都是按照“先进先出” 策略和尾部丢弃策略。可能导致一连串分组的丢失,这就使发送方出现超时重传,多个TCP连接进入慢开始状态,导致全局同步。
定义

使得有少量的TCP连接会减小其窗口值,到达路由器的分组的数量减少。
结果,队列平均长度就减小了,从而避免了网络拥塞的发生。
有利于路由器可以更好地管理其队列长度。

方法

使路由器的队列维持两个参数,即队列长度最小门限THmin最大门限THmax

  • 最小门限THmin必须足够大,以保证连接路由器的输出链路有较高的利用率。
  • 最大门限THmax和最小门限THmin之差也应当足够大,使得在一个TCP往返时间RTT中队列的正常增长仍在最大门限THmax之内。一般为两倍。

当每一个分组到达时,RED就先计算平均队列长度Lav
平均队列长度Lav=(1 - ξ) x (旧的Lav) + ξ x (当前的队列长度样本)

  1. 若平均队列长度小于最小门限THmin,则把新到达的分组放入队列进行排队。
  2. 若平均队列长度超过最大门限THmax,则把新到达的分组丢弃。
  3. 若平均队列长度在最小门限THmin和最大门限THmax之间,则按照某一概率p将新
    到达的分组丢弃。
(7):运输连接管理
过程

运输连接有三个阶段,即:连接建立、数据传送和连接释放。

TCP连接的建立采用客户服务器方式。主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫做服务器。

(1):连接建立(三次握手)
  1. 最初服务器和客户端两端的TCP进程都处于CLOSED (关闭)状态
  2. 服务器的进程被动先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程就处于LISTEN (收听)状态,等待客户的连接请求。
  3. 客户端的客户进程也是主动首先创建传输控制模块TCB,然后向B发出连接请求报文段(同步位SYN = 1,初始序号seq = x),TCP客户进程进入SYN-SENT (同步已发送)状态
  4. 服务器收到连接请求报文段后,如同意建立连接,则向A发送确认报文段(SYN位和ACK位都置1,确认号是ack = x + 1,初始序号seq = y),TCP服务器进入SYN-RCVD (同步收到)状态
  5. 客户端的TCP客户进程收到服务器的确认后,还要向服务器发出确认报文段(ACK置1,确认号 ack = y + 1,序号seq = x+1),这时TCP连接己经建立,A进入ESTABLISHED (已建立连接)状态。
  6. 当服务器收到客户端的确认后,也进入ESTABLISHED状态。

在这里插入图片描述

(2):连接释放(四次握手)
  1. 服务器每收到一次客户的数据,就重新设置保活计时器,若在规定时间内没有收到客户的数据,服务器就发送一个探测报文段,若仍无响应,则服务器关闭连接。
  2. 客户端的应用进程先向其TCP发出连接释放报文段(FIN=1,seq = u 也就是己传送过的数据的最后一个字节的序号加1),并停止再发送数据,主动关闭TCP连接。这时A进入FIN-WAIT-1(终止等待1)状态,等待服务器的确认。
  3. 服务器收到连接释放报文段后即发出确认报文段(ack = u+ 1,seq = v 也就是己传送过的数据的最后一个字节的序号加1) ,然后B就进入CLOSE-WAIT(关闭等待)状态。
  4. TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭状态。
  5. 客户端收到来自服务器的确认后,就进入FIN-WAIT-2 (终止等待2)状态,等待服务器发出的连接释放报文段。
  6. 若服务器已经没有要向客户端发送的数据,其应用进程就通知TCP释放连接。这时服务器发出连接释放报文段(FIN= 1,seq = w,ack = u + 1),这时B就进入LAST-ACK (最后确认)状态,等待A的确认。
  7. A在收到B的连接释放报文段后,必须对此发出确认报文段(ACK置1,ack = w + 1,seq = u + 1),然后进入到TIME-WAIT (时间等待)状态。
  8. 必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL(最长报文段寿命)后,客户端才进入到CLOSED状态。当客户端撤销相应的传输控制块TCB后,就结束了这次的TCP连接(保证客户端发送的最后一个ACK报文段能够到达服务器,防止已失效的连接请求报文段出现在本连接中)。
  9. 服务器只要收到了客户端发出的确认,就进入CLOSED状态。同样,B在撤销相应的传输控制块TCB后,就结束了这次的TCP连接(比客户端早)。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值