跳至主要內容

传输层

red-velet原创计算机基础计算机网络约 9999 字大约 33 分钟

传输层的主要任务为运行在不同主机上的上层应用进程提供直接的通信服务

计算机网络-传输层

一、简介

1、主要任务

传输层的任务是什么?

传输层的主要任务是与下面的三层一起共同构建进行网络通信所需的线路和数据传输通道,为运行在不同主机上的上层应用进程提供直接的通信服务,向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就好像是在两个传输层实体之间有一条端到端的逻辑通信信道。

  • 根据应用需求的不同,因特网的传输层为应用层提供了两种不同的运输协议,用于解决进程之间基于网络的通信问题
    • 面向连接的TCP、 无连接的UDP
  • 传输层的数据单元是数据段,这个名称显然太容易混淆,于是在OSI/RM体系结构的传输层中还是把其中传输的数据单元称为TPDU(不过,在TCP/IP体系结构中,TCP的协议数据单元仍然为数据段)。

2、为什么需要

为什么需要传输层?

因为仅靠网络层把数据传送到目的主机上还是不够的,还必须把它交给目的主机的应用进程,下面是详细解答:

  • 物理层为数据通信提供实际的物理线路和通信信道,这是任何数据通信的基础;
  • 数据链路层同一网络中(数据链路层的通信限于同一局域网中)的数据通信提供了虚拟的通信通道,可以根据不同链路类型对物理层的比特流进行帧封装和传输
  • 网络层为不同网络间的数据通信提供了数据包的路由、转发功能,把数据包从一个网络中的主机传送到位于另一网络中的目的主机上,其中需要选择传送的最佳路径。

既然网络层已把源主机上发出的数据包传送给了目的主机,那么为什么还需要设置一个传输层呢?

  • 因为两台网络主机间的真正数据通信主体不是这两台主机,而是两台主机中的各种网络应用进程。因为在同一时刻,两主机间可以进行多个应用通信
  • 而这里的应用进程识别就要依靠传输层了,它就是通过“端口”将不同应用进程进行对应的。
传输层-简单工作流程
传输层-简单工作流程
  • 在传输层内部,完成这项任务的硬件或软件称为传输实体(transport entity)。
    • 传输实体可能位于操作系统的内核,或者在一个独立的用户进程中,或者以一个链接库的形式被绑定在具体的网络应用中。

3、端到端的服务

传输层的主要作用就是为它的上层提供端到端的数据传输服务

为什么叫端到端服务呢?

  1. 物理的网络连接角度来讲的,即端到端是指网络通信的双方不是在同一链路上不是点对点连接的;
  2. 虚拟的传输连接角度来讲的,即端到端是指在用户看来两端的连接是直接进行的(其实并不是这样的),屏蔽了核心网络结构和各种子网间的差异

点对点连接和端到端连接的区分?

  1. 点对点连接就是通信双方直接通过电缆进行的连接,中间没有经过任何其他设备
    • 如上图的主机A与路由器1、主机B与路由器2
    • 点对点传输
      • 源端可直接把数据传给与它直接相连的设备,在需要的时候又可把数据传给与之直接相连的下一台设备,通过一台台直接相连的设备,把数据传到接收端。很显然,这是一种接力传输方式,但是不可靠
  2. 端到端连接两个终端系统之间的连接,体现在两个终端系统的连接中时要经过一个或多个设备
    • 如上图的主机A与主机B
    • 端到端传输
      • 就是需要在两端所经过的线路上建立一条构建于网络层已搭建好的路由路径之上的虚拟传输连接(当然,这里仅是针对面向连接的传输层协议而讲的),以此来屏蔽所经网络类型或参数配置的不同,就像它们是直接相连的一样;链路建立后,源端就可以发送数据,直至数据发送完毕,接收端确认接收成功。
      • 直到目的端收到数据为止,源端的设备一直要参与传输,因为只有在传输完成后,从源端到目的端所建立的虚拟传输连接才能**“拆除”,否则会中途中断数据的传输,因此是可靠传输

4、TSAP和TPDU

OSI/RM体系结构的传输层中,涉及两个非常重要的术语—TSAP(传输服务访问点)和TPDU(传输协议数据单元),它们贯穿整个传输层数据传输服务的始末。

(1)TSAP

TSAP是什么?

  • TSAP是上层调用传输层服务,以及传输层为它的上层提供服务逻辑接口。
  • 同一时间、同一对网络实体间的用户应用进程可能有多个,不能仅靠网络实体地址(即NSAP)来标注通信双方(因为此时通信的实体各个应用进程,而不是通信双方主机),而必须借助传输层地址进行标识。TSAP相当于传输层的地址,不同的TSAP标识不同的会话或应用进程

TSAP组成:

为确保所有的传输地址在整个网络中是唯一的,因此将传输地址分成网络ID、主机ID、主机分配的端口三部分。

  • 端口传输层特定的属性,用来与应用进程进行一一对应的,所以说真正的传输层地址其实就是具体应用所占用的端口

(2)TPDU

TPDU是什么?

TPDU与前面几章中介绍的比特分组是同类概念

  • OSI/RM体系结构的传输层中还是把其中传输的数据单元称为TPDU
  • TCP/IP体系结构的传输层中还是把其中传输的数据单元称为数据段
传输层数据 - 数据段 - 封装流程
传输层数据 - 数据段 - 封装流程

5、寻址与端口号

为什么要有端口号?

  • 运行在计算机上的进程使用进程标识符PID来标志,但是因特网上的计算机并不是使用统一的操作系统,不同的操作系统(windows,Linux,Mac OS),又使用不同格式的进程标识符,为了使运行不同操作系统的计算机的应用进程之间能进行网络通信,必须使用统一的方法对TCP/IP体系的应用进程进行标识,即端口号。

端口号的组成和含义:

端口(逻辑端口/软件端口):是传输层的SAP,唯一标识主机中的应用进程

  • 端口号只有本地意义(端口号只是为了标识本计算机应用层中的各进程),在因特网中不同计算机的相同端口是没有联系的
  • 端口号长度为16bit,能表示65536个不同的端口号
    • 服务端使用的端口号
      • 熟知端口号0~1023):给TCP/IP最重要的一些应用程序/应用协议,所有用户都知道
      • 登记端口号1024~49151):为没有熟知端口号的应用程序使用的,使用时登记,如微软远程桌面使用的端口是3389
    • 客户端使用的端口号/短暂端口号49152~65535):仅在客户进程运行时才动态选择,当服务器进程收到客户进程的报文时,就知道了客户进程所使用的的动态端口号。通信结束后,这个端口号可供其他客户进程以后使用

常见端口号:

应用程序端口号
FTP21
TELNET23
SMTP25
DNS53
TFTP69
HTTP80
SNMP161

套接字(Socket):

  • 套接字就是:主机号+端口号

  • 在网络中采用发送方和接收方的套接字组合来识别端点,套接字唯一标识了网络中的一个主机(主机号)和它上面的一个进程(端口号)。

6、复用和分用

复用和分用:

复用(Multiplexing):

应用层所有的应用进程都可以通过传输层再传输到网络层,也就是将多个上层应用程序的数据流合并为一个传输层数据流,以便在传输层和网络层之间传输。

  • 发送方的某些应用进程所发送的不同应用报文,在传输层使用UDP协议进行封装,这是UDP复用;若用TCP封装则称TCP复用

  • 传输层使用端口号区分不同进程,不管使用何种协议封装的报文,在网络层都需要使用IP协议封装成IP数据报,这是IP复用,数据报中协议字段的值用来表名封装的是何种协议数据单元

    • 实现方式:复用可以通过端口号来实现。每个应用程序会被分配一个唯一的端口号,这样在传输层就可以区分不同应用程序的数据流。

    • 目的:复用允许多个应用程序同时使用网络传输层服务,从而在网络上传输它们的数据。
      :::

分用(Demultiplexing):

传输层从网络层收到数据后交付指明的应用进程,指在接收主机的传输层将从网络上接收到的数据流分解成多个上层应用程序的数据流。

  • 分用是根据协议字段的值,将IP数据报封装的协议数据单元上交传输层的过程叫IP分用

  • UDP根据端口号将数据交给应用进程叫做UDP分用,TCP根据端口号将数据交给应用进程叫做TCP分用

    • 实现方式:分用依赖于端口号,接收主机根据数据包中的目标端口号来将数据分发给相应的应用程序。

    • 目的:分用保证了数据能够正确地交付给目标应用程序,从而保持了端到端的通信。

总的来说,复用和分用是在传输层中确保多个应用程序能够同时使用网络传输层服务的重要机制。复用允许多个应用程序的数据流合并为一个传输层数据流,而分用则确保接收主机能够将传输层数据流分解为多个上层应用程序的数据流。这两个机制共同保证了网络通信的有效进行。

二、TCP协议

1、TCP协议的特性

TCP的特点有哪些?

  1. TCP是面向连接(虚连接)的传输层协议
    • 只有建立了连接才能开始通信
    • 连接是逻辑连接,不是实际链路
    • 支持原因: TCP通过三次握手建立连接,确保通信双方的状态同步和连接的可靠性。这种连接导向的方式允许在数据传输前后进行数据完整性检查和确认,确保数据能够可靠地发送和接收。
  2. 仅支持单播传输,无法用于多播、广播
    • 支持原因:每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
  3. TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达
    • 支持原因: TCP的可靠性来自于序号、确认和重传机制。序号和确认保证了数据的有序传输,重传机制确保了即使出现丢失或损坏,数据也能被重新传输。
  4. TCP提供全双工通信
    • 发送缓存
      • 准备发送的数据
      • 已发送但尚未收到确认的数据
    • 接收缓存
      • 按序到达但尚未被接受应用程序读取的数据
      • 不按序到达的数据
  5. TCP面向字节流,而非报文流
    • TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流
    • TCP将要传输的数据分成多个字节,以字节为单位传送
    • 字节流传输使TCP更加灵活,可以处理不同大小的数据而不受消息边界的影响
  6. 传输单位为数据段,每次发送的TCP数据段大小和数据段数都是可变的
  7. TCP能保证可靠传输、流量控制、拥塞控制

2、TCP的报文格式

TCP的报文格式
TCP的报文格式

这是TCP协议头部的一些重要字段,它们承载了TCP通信过程中的关键信息。

以下是这些字段的功能和作用:

第一层

源端口、目的端口(16位,2B):分别用于标识发送和接收TCP报文的应用程序,确保数据能够准确地交付到目的地的应用程序。

3、TCP的连接管理

TCP连接的建立采用客户服务器方式

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

(1)TCP连接的建立

TCP连接的建立采用的是三次握手方式.

三次握手方式.流程描述:
  1. 客户端发送连接请求报文段,无应用层数据
    • SYN=1
    • seq=x(随机产生)
    • ACK=0
    • ack无效
  2. 服务器端为该TCP连接分配缓存和变量,并向客户端返回确认报文段,允许连接,无应用层数据
    • SYN=1
    • seq=y(随机)
    • ACK=1
    • ack=x+1
  3. 客户端为该TCP连接分配缓存和变量,并向服务器端返回确认的确认,可以携带数据
    • SYN=0
    • seq=x+1
    • ACK=1
    • ack=y+1
图例-三次握手
图例-三次握手

chatgpt🤖:SYN洪泛攻击

  • SYN洪泛攻击是一种常见的网络攻击方式,针对TCP协议中的三次握手过程。
  • 攻击者发送大量伪造的TCP连接请求(第一次握手的SYN数据包),但不完成后续的握手过程,导致服务器有大量挂起等待确认的TCP连接,消耗CPU和内存,进而导致死机。
  • 解决方法:
    1. SYN Cookie: 服务器可以启用SYN Cookie机制,它在握手阶段不会在连接表中保存信息,而是通过加密和计算检验和等方式临时存储信息。这样可以避免在握手阶段占用过多的资源。
    2. 连接限制: 设置连接限制或阈值,当服务器达到一定的连接数时,暂时停止接受新的连接请求,或者采取其他限制措施。
    3. 网络设备配置: 通过防火墙、负载均衡器等网络设备,配置规则来过滤恶意流量,识别和阻止大量伪造的连接请求。

(2)TCP连接释放

TCP连接释放采用的是四次挥手方式.

四次挥手过程消息描述:

参与一条TCP连接的两个进程中的任何一个都能终止该连接

  1. 客户端发送连接释放报文段,停止发送数据,主动关闭TCP连接,转为FIN-WAIT-1状态
    • FIN=1
    • seq=u
  2. 服务器端回送一个确认报文段,并转为CLOSE-WAIT状态;客户到服务器这个方向的连接就释放了(半关闭状态),客户端收到这个确认段后转为FIN-WAIT-2状态
    • ACK=1
    • seq=v
    • ack=u+1
  3. 服务器端发完数据,就发出连接释放报文段,主动关闭TCP连接,转为LAST-ACK状态
    • FIN=1
    • seq=w
    • ACK=1
    • ack=u+1
  4. 客户端回送一个确认报文段,转为TIME-WAIT状态,再等到时间等待计时器设置的2MSL(最长报文段寿命)后,连接彻底关闭
    • seq=u+1
    • ACK=1
    • ack=w+1
图例-四次挥手
图例-四次挥手

2MSL的意义:防止服务器端因为未收到客户端的确认报文段导致无法关闭

4、TCP的可靠传输

可靠:保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的

  • 可靠传输是TCP的主要目的,而校验和、序列号、确认号、超时重传等机制是TCP使用的手段,用于实现可靠传输。这些机制一起工作,确保了数据的完整性和可靠性,以及网络的稳定性。

(1)校验

与UDP类似,通过伪首部进行检验和校验

  • TCP报文段包含一个校验和字段,用于检测报文在传输过程中是否发生了错误。

(2)序号

为传输流中的每一个字节进行编号,将缓冲区中的字节组成若干个TCP段(数据报),通过确认号和序号的机制进行发送

  • 发送方将数据分割成小的报文段,并为每个报文段分配一个唯一的序列号。
  • 接收方使用确认号来指示下一个期望接收的序列号。

(3)确认号

接收方收到报文段后,返回确认字段,确认字段中的确认号为下一个期望收到的起始字节编号。

捎带确认:接收方将确认字段捎带在自己要发送的数据中(ACK=1,使用相应的确认号即可)

累计确认:只确认到第一个丢失为止的字节,而不需要一个一个地确认每个数据包。

TCP发送方缓存

TCP发送方缓存

发送方缓存
发送方缓存


  • 此时接收方返回的确认号为4
  • 7、8仍然正常接收
  • 发送方重新发送4、5、6
  • 接收方收到后返回的确认号为9

(4)重传

超时重传:TCP的发送方在规定的时间(重传时间RTTs)内没有收到确认就要重传已发送的报文段,RTTs本质是加权平均往返时间

  • 重传时间过短:太长的数据报来不及发送完毕
  • 重传时间过长:增加网络空闲时间,降低传输效率

TCP采用自适应算法,动态改变重传时间RTTs

冗余ACK(冗余确认)

每当比期望序号大的失序报文段到达时,发送一个冗余ACK,指明下一个期待字节的序号


例题:

发送方已发送1,2,3,4,5报文段

  • 接收方收到1,返回给1的确认(ACK=2)
  • 接收方收到3,返回给1的确认(ACK=2,冗余ACK)
  • 接收方收到4,返回给1的确认(ACK=2,冗余ACK)
  • 接收方收到5,返回给1的确认(ACK=2,冗余ACK)
  • 发送方收到3个对于报文段1的冗余ACK
  • 发送方认定2丢失,重传2

可靠传输的特点

  1. 数据按序交付:TCP会根据序列号确保接收方按照正确的顺序接收到数据,即使数据包乱序到达,也会在接收方重新排序后交付给应用层。

  2. 数据完整性保证:TCP使用校验和和序列号等机制来保证数据在传输过程中的完整性,接收方可以检测到任何丢失或损坏的数据。

  3. 重传机制:如果发送方没有收到接收方的确认信息,它会定时重传数据,确保数据的可靠传输。

5、TCP的流量控制

(1)概述

流量控制就是让「发送方」根据「接收方」的实际接收能力控制发送的数据量,让发送方的发送速率不要太快,要让接收方来得及接收,以避免发送方发送速度过快导致接收方无法处理或缓存溢出的问题。

(2)实现方式

TCP利用滑动窗口机制实现流量控制。

  • 接收方根据自己的缓冲区大小,动态的通过窗口字段调整发送方发送窗口的大小。
  • 发送方窗口大小取接收窗口rwnd拥塞窗口cwnd最小值
    • 拥塞窗口:发送方根据自己估算的网络拥塞程度而设置的窗口值,反映网络当前容量
    • 发送方发送完窗口内数据后需要等到确认报文才会滑动窗口并继续发送,若窗口内的某个值很久没有收到回答报文,则超时重传报文
    • 实时调整:窗口大小可以实时调整,当接收方通过确认重传机制进行字节编号确认时,会连带着修改发送方的允许发送窗口大小,可以根据网络状况和接收方的处理能力来动态控制数据的发送速度。
例题:

例:A向B发送数据,连接建立时,B的初始rwnd=400(B),设每一个报文段100B,报文段序号初始值为1

图例-拥塞窗口
图例-拥塞窗口

若接收方发送的允许发送的确认信息丢包,则此时会出现“死锁”情况,即发送方窗口大小仍然为0,无法发送数据;接收方一直等待发送方发送新数据,没有新的确认信息。

解决方法:TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。到时间则发送一个零窗口探测报文段,并重置计时器时间。

  • 滑动窗口过小:产生太多ACK
  • 滑动窗口过大:路由器发生拥挤,主机可能丢失分组

chatgpt🤖:零窗口探测报文

零窗口探测报文的出现是为了解决TCP通信中可能出现的接收方窗口为零(Zero Window)的情况。

接收方窗口为零表示接收方暂时无法接收更多的数据,这可能由以下几个原因导致:

  1. 接收方处理能力不足:接收方的处理能力可能不足以及时处理收到的数据,导致其缓冲区满了。

  2. 接收方应用程序忙碌:接收方的应用程序可能正在处理大量任务,无法及时处理新的数据,导致缓冲区满了。

  3. 网络拥塞:在网络拥塞的情况下,数据包可能会丢失,接收方为了保证数据的完整性可能会将窗口大小设为零。

  4. 接收方主动控制接收速率:接收方可能希望控制数据的接收速率,通过将窗口大小设为零来暂停数据的接收。

  5. 死锁问题:在某些情况下,如果发送方一直等待接收方的窗口变为非零,可能会导致死锁。零窗口探测报文允许发送方主动探测接收方窗口的变化,避免了可能的死锁情况。

零窗口探测报文的出现是为了及时解决这种情况,它的作用包括:

  1. 主动探测接收方窗口变化:发送方可以通过发送零窗口探测报文来主动询问接收方的窗口是否已经变为非零,从而及时恢复数据的传输。

  2. 保持连接状态:零窗口探测报文可以避免连接在窗口为零的情况下被错误地认为是不活跃的,从而保持连接的活跃状态。

  3. 其次,零窗口探测报文也有超时重传机制

总的来说,零窗口探测报文的出现是为了提升TCP通信的可靠性和效率,保证数据的及时传输,同时避免不必要的连接中断。

6、TCP的拥塞控制

(1)概述

拥塞控制是一种网络流量控制的机制,其主要目的是避免在网络中发生拥塞,以保证网络的稳定性和吞吐量的合理分配。

  • 拥塞控制:全局性的控制
  • 流量控制:端到端的控制

拥塞控制的意义:防止过多的数据注入到网络中

讨论前提

  • 数据单方向传送,而另一个方向只传送确认
  • 接收方总是有足够大的缓存空间(rwnd -> ∞),因而发送窗口大小取决于拥塞程度
拥塞控制的出现背景和原因:

拥塞控制的背景:

在计算机网络中,当网络中的路由器、交换机等网络设备的处理能力不足以处理大量的数据流时,就会导致网络拥塞。

  • 前面的流量控制是避免「发送方」的数据填满「接收方」的缓存,但是并不知道网络的中发生了什么,一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。
  • 在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大....
  • 所以,TCP 不能忽略网络上发生的事,它被设计成一个无私的协议,当网络发送拥塞时,TCP 会自我牺牲,降低发送的数据量,于是,就有了拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。为了在「发送方」调节所要发送数据的量,定义了一个叫做拥塞窗口 的概念。

拥塞控制的原因:

原因:

  • 不均衡的流量:可能有一些节点或链路的流量远远超过了其处理能力,导致拥塞。

  • 路由选择问题:不恰当的路由选择可能导致某些路径过于拥挤,造成拥塞。

  • 丢包和重传:在网络中丢失的数据包会导致重传,增加了网络的负担。

  • 缓冲区溢出:当网络设备的缓冲区已满时,新到达的数据包可能会被丢弃。

  • 网络拓扑变化:动态的网络拓扑变化可能导致数据包传输的不稳定性,可能引发拥塞。

chatgpt🤖:拥塞控制可以解决以下问题

  1. 避免网络拥塞:通过监测网络状态,控制数据的发送速率,避免在网络中发生拥塞。

  2. 提高网络性能:通过动态调整传输速率,可以使网络资源得到合理利用,提高网络的吞吐量。

  3. 保证公平性:拥塞控制机制可以确保网络中的各个流量源公平地共享网络资源。

总的来说,拥塞控制是为了保证网络稳定运行,避免拥塞发生,以及在拥塞发生时能够有效地应对和解决问题。通过动态调整数据发送速率和监测网络状态,拥塞控制可以保证网络的稳定性和吞吐量的合理分配。

(2)实现方式

什么是慢开始门限ssthresh? 什么是拥塞窗口?和发送窗口有什么关系呢?

  • 慢开始门限ssthresh是TCP拥塞控制算法中的一个阈值,用于控制拥塞窗口(cwnd)的大小。
  • 拥塞窗口 cwnd是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的,表示在不收到确认信息的情况下可以发送的数据量。

我们在前面提到过发送窗口 swnd 和接收窗口 rwnd 是约等于的关系,那么由于加入了拥塞窗口的概念后,此时发送窗口的值是swnd = min(cwnd, rwnd),也就是拥塞窗口和接收窗口中的最小值。

拥塞窗口 cwnd 变化的规则:

  • 只要网络中没有出现拥塞,cwnd 就会增大;
  • 但网络中出现了拥塞,cwnd 就减少;

那么怎么知道当前网络是否出现了拥塞呢?

其实只要「发送方」没有在规定时间内接收到 ACK 应答报文,也就是发生了超时重传,就会认为网络出现了拥塞。

拥塞控制有哪些控制算法?

拥塞控制主要是四个算法:慢开始、拥塞避免、快重传、快恢复

(a)慢开始和拥塞避免
  1. 慢开始拥塞窗口从1开始,根据应答报文大小来扩大拥塞窗口,如发送方窗口2,应答大小2,则下次发送大小为4是指数性的增长
  2. 拥塞避免拥塞窗口每次只扩大1,而不是向慢开始那样根据发送方的返回窗口进行增加。
图例-慢开始和拥塞避免
图例-慢开始和拥塞避免
(b)快重传和快恢复
  1. 快重传:使发送方尽快进行重传,而不是等待超时重传计时器超时再重传
    • 要求接收方不用等待自己发送数据时才进行捎带确认,而是要立即发送确认
    • 即使收到了失序的报文段(说明有一段丢失了)也要立即发出对已收到的报文段的重复确认
    • 发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传,而不是等该报文段的超时重传计时器超时再重传
    • 对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞。使用快重传可以使整个网络的吞吐量提高约20%
  2. 快恢复:发送方一旦收到3个重复确认,就知道现在只是丢失了个别报文段。也是不启动慢开始算法,而执行快恢复算法
    • 发送方将慢开始门限ssthresh值和拥塞窗口cwnd值调整为当前窗口的一半,开始执行拥塞避免算法
    • 也有的快恢复实现是把快恢复开始时的拥塞窗口cwnd值再增大一些,即等于新的ssthresh+3
      • 既然发送方收到3个重复的确认,就表明有3个数据报文段已经离开了网络
      • 这三个报文段不再消耗网络资源而是停留在接收方的接收缓存中
      • 可见现在网络中不是堆积了报文段而是减少了3个报文段。因此可以适当把拥塞窗口扩大些
图例-快重传和快恢复
图例-快重传和快恢复

总结:

  1. cwnd < ssthresh时,使用慢开始算法
  2. cwnd > ssthresh时,停止使用慢开始算法而改用拥塞避免算法
  3. cwnd = ssthresh时,既可使用慢开始算法,也可以使用拥塞避免算法

三、UDP协议

1、UDP协议的特性

UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能。

UDP的主要特点

  • UDP是无连接的:进行数据传输前是不需要建立专门的传输连接的,在数据发送结束时也无须释放连接了。

  • UDP不保证可靠交付:不需要事先建立专门的传输连接的,所以它的传输是不可靠的(但会尽最大努力进行交付)

    • 分用时,找不到对应的目的端口号,就丢弃报文,并给发送方发送ICMP“端口不可达”差错报告报文
  • UDP是面向报文的:适合一次性传输少量数据的网络应用

    • 应用层给UDP多长的报文,UDP就照样发送,即一次发一个完整报文,不做处理

    • UDP直接对应用层提交的报文进行封装、传输,但不拆分,也不合并,保留原来报文的边界。因此,UDP是报文流,而TCP是字节流。因为UDP不拆分报文,自然也就没有报文段之说,但UDP报文传输到网络层后,在网络层仍然可以根据网络的MTU值进行分割。

      图例-UDP面向报文
      图例-UDP面向报文
  • UDP无拥塞控制,适合很多实时应用:使用UDP进行数据传输时不能进行流量控制和拥塞控制,因为这类数据传输的连续性要比数据的完整性更重要,允许数据在传输过程中有部分丢失,如IP电话、流媒体通信等。

  • 支持各种交互通信方式:TCP不支持组播、广播通信方式,只支持一对一的单播方式,但UDP支持各种通信方式,即可以是一对一、一对多、多对一和多对多的方式。

  • UDP首部开销小:只包含8个字节,分布是源端口和目的端口,以及UDP长度和校验和

UDP的应用服务:

计算机网络中有许多使用UDP的应用服务,如DNS、SNMP、DHCP和RIP等。

2、UDP的报文格式

图例-UDP的报文格式
图例-UDP的报文格式

这是UDP协议头部的一些重要字段,它们承载了UDP通信过程中的关键信息。

以下是这些字段的功能和作用:

  • 首部字段
    • 源端口号(16位,2B):可选填,当需要目的主机回应时使用
    • 目的端口号(16位,2B):必要,目的进程的端口号
    • UDP长度(16位,2B):整个UDP数据报的长度(首部字段+数据字段)
    • UDP检验和(16位,2B):检测整个UDP数据报是否有错误
  • 数据字段

3、UDP的校验过程

1、伪首部

伪首部是用于计算UDP校验和的一个辅助数据结构,包含了一些关于IP头部的信息,只有在计算检验和时才出现, 不向下传送也不向上递交,用于确保UDP数据在传输过程中的完整性。

图例-伪首部
图例-伪首部

伪首部模仿的是IP数据报的首部,结构如下:

  • 源IP地址(32位)
  • 目标IP地址(32位)
  • 固定字段:0(8位)
  • 协议字段:标识上层协议,UDP的协议号为17(8位)
  • UDP数据报长度(16位),包括UDP头部和数据部分的长度,不包括伪首部

2、校验过程

  • 若不使用校验,则将校验和字段全部置0
校验过程
校验过程

UDP校验填充

下列是一种关于UDP校验和填充的过程,是对UDP数据报在发送和接收过程中进行完整性检查的方法。

这个过程包括了一些步骤,以保证数据在传输过程中的准确性和完整性:

发送方过程

发送方过程:

  1. 添加伪首部:将IP头部的一部分信息(源IP地址、目标IP地址、协议类型、UDP长度等)作为伪首部与UDP头部一起使用。
  2. 填充检验和字段:将UDP头部的检验和字段设置为全0。
  3. 填充数据部分:使整个UDP数据报的长度成为4字节的整数倍,如果数据部分长度不是4字节的整数倍,则用全0填充。
  4. 二进制反码求和:对伪首部+UDP头部+数据部分进行二进制反码求和,以16位(2字节)为一组进行求和。
  5. 填入检验和字段:将求和的结果填入UDP头部的检验和字段中。如果结果全为0,则将检验和字段全部填为1。
  6. 去掉伪首部:在发送之前,去掉添加的伪首部。
  7. 发送:将填充后的UDP数据报发送出去。