传输层协议:TCP 与 UDP

发布于:2024-05-07 ⋅ 阅读:(32) ⋅ 点赞:(0)

目录

一 .传输层协议概述

UDP(用户数据报协议)

TCP(传输控制协议)

进程之间的通信

二.TCP 段格式

TCP 首部格式

选项

验证 TCP 段格式

三.TCP 连接

TCP 连接建立

TCP 数据传输

TCP 连接关闭

TCP 连接复位

传输控制块

TCP 状态转换图

TCP 连接同时打开与同时关闭

序列号与确认号机制

SYN 泛洪攻击

四.TCP 可靠性

差错控制

流量控制

拥塞控制

五.UDP

数据报格式

UDP 伪首部与检验和计算


一 .传输层协议概述

在计算机网络中,传输层位于网络层之上,应用层之下,主要负责提供端到端的可靠数据传输服务。传输层协议可以分为两大类:无连接的传输层协议和面向连接的传输层协议。

UDP(用户数据报协议)

        UDP(用户数据报协议)是一种无连接的传输层协议,它提供一种不可靠但高效的数据传输服务。相比于面向连接的传输层协议,如TCP,UDP更为轻量级,因为它不需要在数据传输前建立连接、维护状态信息或进行确认操作。

UDP的主要特点包括:

  1. 简单性:UDP的设计非常简单,只提供了最基本的数据传输功能,没有复杂的连接管理和错误恢复机制,因此具有很高的效率。

  2. 高效性:由于不需要建立连接、维护状态信息以及进行确认,UDP的开销较小,传输效率高,适合于对实时性要求较高的应用场景。

  3. 不可靠性:UDP并不能保证数据的可靠传输,因为它没有重传机制和数据包排序功能。数据包在传输过程中可能会丢失、重复或者到达顺序错乱,因此应用程序需要自行处理这些问题。

  4. 实时性:UDP通常用于实时应用,如视频流、语音通话等,这些应用对数据的及时性要求更高,可以接受一定的数据丢失,而UDP正是因为其简单高效的特点,能够满足这些实时应用的需求。

TCP(传输控制协议)

        TCP(传输控制协议)是一种面向连接的传输层协议,它提供了可靠的数据传输服务,以确保数据从发送端准确无误地传送到接收端。TCP通过一系列复杂的机制,包括连接建立、数据分段、确认应答、重传控制等,来实现可靠的数据传输。

TCP的主要特点包括:

  1. 可靠性:TCP通过使用序号、确认应答和重传机制,能够保证数据的可靠传输。如果接收端收到了有问题的数据段,它会请求发送端重新发送,直到数据被正确接收。

  2. 面向连接:在数据传输之前,TCP需要在发送端和接收端之间建立连接。这种连接是全双工的,双方可以在同一个连接上同时发送和接收数据。

  3. 流量控制:TCP使用滑动窗口协议进行流量控制,确保发送端发送的数据不会超出接收端的处理能力范围,避免了数据的丢失和过载。

  4. 拥塞控制:TCP还具有拥塞控制机制,它可以根据网络的拥塞程度动态调整数据发送速率,以避免网络拥塞和数据丢失。

  5. 有序性:TCP能够确保数据段按照发送的顺序被接收端接收和重组,这样接收端能够准确地还原发送端发送的数据流。

进程之间的通信

        在TCP/IP协议族中,传输层协议不仅用于不同主机之间的通信,也用于同一主机中不同进程之间的通信。这种进程之间的通信通过套接字(Socket)来实现。

        套接字是一个软件抽象概念,它提供了一个标准的接口,允许程序发送或接收网络数据。通过套接字,应用程序可以与传输层协议交互,实现可靠或不可靠的数据传输。在同一主机中,不同进程通过套接字进行通信的过程通常被称为"进程间通信"(Inter-Process Communication,IPC)。

在使用套接字进行进程间通信时,通常会有以下几个步骤:

  1. 创建套接字:首先,每个参与通信的进程都会创建一个套接字,用于与传输层协议进行交互。套接字可以通过操作系统提供的API(如BSD Socket API)来创建。

  2. 绑定地址:在通信之前,每个套接字通常需要绑定一个唯一的地址,以便其他进程能够找到它。这个地址可以是IP地址和端口号的组合。

  3. 监听连接:如果一个进程需要接受其他进程的连接请求,它可以将套接字设置为监听状态,等待其他进程的连接请求。

  4. 建立连接:当一个进程需要与另一个进程建立连接时,它可以通过套接字向目标进程发送连接请求。如果目标进程接受连接请求,连接就建立成功了。

  5. 发送和接收数据:一旦连接建立成功,参与通信的进程就可以通过套接字进行数据的发送和接收。发送数据时,进程将数据写入套接字;接收数据时,进程从套接字中读取数据。

  6. 关闭连接:通信结束后,参与通信的进程可以关闭套接字,释放资源。

        通过套接字,进程可以实现各种形式的进程间通信,包括基于TCP的可靠通信,也包括基于UDP的不可靠通信。这种灵活的通信机制使得不同进程能够在同一主机上进行有效的数据交换和协作。

二.TCP 段格式

TCP 是一种面向连接的协议,在传输数据之前,需要先建立连接。TCP 使用“三次握手”机制来建立连接,并使用“四次挥手”机制来释放连接。在连接建立后,TCP 就可以传输数据了。

TCP 首部格式

TCP 段的首部格式如下图所示:

 0      7 8     15 16    23 24    31
+--------+--------+--------+--------+
|        |        |        |        |
| 源端口 | 目的端口|              |
+--------+--------+--------+--------+
|                序号               |
+--------+--------+--------+--------+
|              确认号               |
+--------+--------+--------+--------+
|数据  |保留|C|E|U|A|P|R|S|F|
|偏移 |    |W|C|R|S|S|Y|I|N|
|      |    |R|K|G|H|T|T|N| |
+--------+--------+--------+--------+
|              窗口大小             |
+--------+--------+--------+--------+
|         检验和(Checksum)        |
+--------+--------+--------+--------+
|          紧急指针(Urgent Pointer)          |
+--------+--------+--------+--------+
|          选项(Options)(可选)            |
+--------+--------+--------+--------+
|                                     |
|            数据(Data)             |
|                                     |
+--------+--------+--------+--------+

TCP首部的长度通常为20字节,但可选项的存在可能使得首部的长度变化。

  • 源端口和目的端口:分别标识发送端和接收端的端口号,用于确定数据的源和目的地。
  • 序号:标识从发送端到接收端的数据字节流,用于实现可靠传输和数据的顺序重组。
  • 确认号:表示接收端期望接收的下一个数据段的序号,用于实现确认应答机制。
  • 数据偏移:表示TCP首部的长度,以32位字为单位,用于确定TCP首部的结束位置。
  • 保留:目前未使用,必须置为0。
  • 控制位:包括SYN(同步序列号)、ACK(确认应答)、FIN(结束标志)等,用于实现TCP的各种功能和状态转换。
  • 窗口大小:表示接收端愿意接收的字节数,用于实现流量控制。
  • 检验和:用于检测数据在传输过程中的错误,保证数据的可靠性。
  • 紧急指针:用于通知接收端有紧急数据需要优先处理。
  • 选项:可选字段,用于实现一些附加功能,如最大报文长度、时间戳等。
  • 数据:TCP段携带的数据部分。

选项

TCP 首部的选项字段可以包含多个选项,每个选项都有一个类型和长度,常见的选项包括:

  • 最大报文长度(Maximum Segment Size, MSS):用于协商 TCP 段的最大长度。发送端和接收端在建立连接时可以交换最大报文长度选项,以确定可以发送的最大数据量,避免分段导致的性能下降。

  • 窗口扩大因子(Window Scale Factor):用于扩大 TCP 窗口的大小,以支持大带宽和高延迟的网络。TCP 窗口是控制流量的关键机制之一,窗口扩大因子选项可以使得窗口大小增加到更大的值,以适应高速网络环境。

  • 选择确认(Selective Acknowledgement, SACK):用于实现选择性确认应答,发送端可以只重传丢失的数据段,而不是重传所有数据。SACK选项允许接收端指示出成功接收的数据段范围,从而提高了数据传输的效率。

  • 时间戳(Timestamps):用于计算往返时间(RTT),以实现更准确的拥塞控制。时间戳选项允许发送端在发送数据段时附加时间戳信息,接收端在接收到数据段时可以使用时间戳信息计算出往返时间,从而更准确地调整数据传输速率。

验证 TCP 段格式

接收端验证TCP段格式的过程通常包括以下步骤:

  1. 检查首部长度是否合法:TCP段的首部长度字段指定了首部的长度,以32位字为单位。接收端首先会检查首部长度字段的值是否合法,即在合理的范围内,并且是否至少包含20个字节(TCP首部的最小长度)。如果首部长度不合法,表明TCP段格式错误,接收端会丢弃该段。

  2. 验证选项字段是否正确:如果TCP段包含选项字段,接收端会根据选项字段的类型和长度来验证选项的合法性。接收端可能会检查选项的格式、内容以及是否符合TCP协议的规范要求。如果发现选项字段不正确或不符合预期,接收端可能会丢弃该段。

  3. 检查校验和是否正确:TCP段的校验和字段用于检测数据在传输过程中的错误。接收端会计算接收到的TCP段的校验和,并与校验和字段中的值进行比较。如果校验和不匹配,表明TCP段可能在传输过程中发生了错误,接收端会丢弃该段。

  4. 其他验证:接收端还可能进行其他针对TCP段格式的验证,例如确认号是否合理、控制位是否正确等。如果发现任何格式错误或不合法的地方,接收端都会丢弃该段。

        通过对TCP段格式的验证,接收端可以确保接收到的数据是正确和可靠的,提高了数据传输的可靠性和安全性。

三.TCP 连接

TCP 连接是 TCP 协议的基本概念,它表示两个端点(socket)之间的虚拟电路。TCP 连接的建立和释放过程分别称为“三次握手”和“四次挥手”。

TCP 连接建立

TCP 连接的建立需要进行“三次握手”,具体过程如下:

  1. 客户端发送SYN报文:客户端向服务器端发送一个特殊的TCP报文段,其中设置SYN标志位,表示请求建立连接,并选择一个初始序列号。此时客户端进入SYN_SENT状态,等待服务器端的确认。

  2. 服务器端收到SYN报文:服务器端收到客户端的连接请求后,会发送一个带有SYN和ACK标志位的TCP报文段作为确认,并选择自己的初始序列号。这个报文段包含了客户端发送的序列号加一作为确认号。此时服务器端进入SYN_RCVD状态。

  3. 客户端收到SYN/ACK报文:客户端收到服务器端的确认后,会发送一个带有ACK标志位的TCP报文段作为确认。这个报文段的序列号是服务器端发送的SYN报文段中的确认号加一。此时连接建立成功,客户端和服务器端均进入ESTABLISHED状态,可以开始传输数据。

TCP 数据传输

        在TCP连接建立之后,客户端和服务器就可以开始进行数据的可靠传输。TCP提供了一种可靠的数据传输服务,主要通过以下机制来确保数据准确无误地从发送端传送到接收端:

  1. 确认应答(Acknowledgment, ACK):接收端在成功接收到数据后,会发送确认应答给发送端,告知发送端数据已经正确接收。发送端收到确认应答后,就知道这部分数据已经安全到达,可以继续发送下一部分数据。

  2. 超时重传(Timeout and Retransmission):如果发送端发送了数据但未收到接收端的确认应答,就会启动超时计时器。一旦超时计时器超过设定的阈值,发送端会认为数据丢失,会重新发送丢失的数据段,确保数据的可靠传输。

  3. 流量控制(Flow Control):TCP使用滑动窗口机制进行流量控制,确保发送端发送的数据不会超出接收端的处理能力范围。接收端通过窗口大小字段告知发送端自己的接收窗口大小,发送端根据接收端的接收能力调整发送速率,避免数据的丢失和过载。

  4. 拥塞控制(Congestion Control):TCP使用拥塞窗口机制进行拥塞控制,避免网络拥塞和数据丢失。发送端根据网络拥塞程度动态调整发送速率,以避免过多的数据堵塞网络。TCP还通过慢启动、拥塞避免、快速重传等算法来应对网络拥塞情况。

TCP 连接的释放需要进行“四次挥手”,具体过程如下:

  1. 客户端发送FIN报文:当客户端的数据发送完毕后,它会发送一个带有FIN标志位的TCP报文段,表示数据发送完毕,请求关闭连接。此时客户端进入FIN_WAIT_1状态,等待服务器端的确认。

  2. 服务器收到FIN报文:服务器收到客户端发送的FIN报文后,会发送一个带有ACK标志位的TCP报文段作为确认,表示已经接受了关闭连接的请求。此时服务器端进入CLOSE_WAIT状态,表明服务器端已经准备好关闭连接。

  3. 服务器发送自己的FIN报文:当服务器端的数据也发送完毕后,它会发送一个带有FIN标志位的TCP报文段,请求关闭连接。此时服务器端进入LAST_ACK状态。

  4. 客户端收到服务器的FIN报文:客户端收到服务器发送的FIN报文后,会发送一个带有ACK标志位的TCP报文段作为确认。此时客户端进入TIME_WAIT状态,等待2MSL(最大报文生存时间)后释放连接。2MSL是为了确保客户端发送的最后一个ACK报文段能够被服务器端正确接收,同时也为了处理网络中可能存在的延迟报文。

  5. 服务器收到ACK报文:服务器收到客户端发送的ACK报文后,连接释放成功。此时服务器端也释放连接,完成“四次挥手”。

TCP 连接关闭

        在实际的TCP实现中,除了完全关闭连接外,还存在一种“半关闭”状态,即一方关闭了自己的发送方向,但仍然可以接收对方的数据。这种状态通常用于以下场景:

  1. 客户端向服务器发送数据后等待响应:在某些情况下,客户端需要向服务器发送数据,然后等待服务器的响应。一旦客户端发送完数据,它可能会关闭发送方向,以防止继续发送数据。但是客户端仍然需要保持接收方向打开,以便接收服务器的响应数据。

  2. 服务器向客户端发送数据后等待客户端的响应:类似地,服务器可能需要向客户端发送数据,然后等待客户端的响应。一旦服务器发送完数据,它可能会关闭发送方向,但仍然保持接收方向打开,以便接收客户端的响应数据。

        在这种“半关闭”状态下,关闭发送方向的一方发送一个带有FIN标志位的TCP报文段,表示自己不再发送数据。而接收方向仍然保持打开,可以继续接收对方发送的数据。接收到FIN报文后,另一方可以发送一个ACK报文作为确认,并进入CLOSE_WAIT状态(如果是服务器端)或FIN_WAIT_2状态(如果是客户端)。

        在实际的TCP连接关闭过程中,半关闭状态的使用使得连接的关闭更加灵活,允许一方在不影响另一方接收数据的情况下主动关闭发送方向,从而更好地控制数据流。        

TCP 连接复位

        在TCP连接中,如果一方出现异常情况,可以发送RST(复位)报文来立即关闭连接。接收到RST报文的一方会立即关闭连接,并丢弃所有未确认的数据。具体过程如下:

  1. 发送RST报文:当一方(发送端或接收端)出现异常情况时,它会发送一个带有RST标志位的TCP报文段,用于立即终止连接。RST报文不需要等待对方的确认,直接发送到对方,表示强制关闭连接。

  2. 接收到RST报文:另一方在接收到RST报文后,会立即关闭连接,并丢弃所有未确认的数据。无需进行任何进一步的处理,直接进入CLOSED状态。

        发送RST报文可以用于快速关闭连接,并清理连接的资源,适用于一方出现严重错误或攻击时的情况。由于RST报文是一种紧急情况下的处理机制,因此不需要等待对方的确认,可以立即发送,以减少连接的持续时间和减轻连接的负载。

传输控制块

        在TCP的实现中,每个TCP连接都会对应一个传输控制块(Transmission Control Block, TCB),用于存储连接相关的信息。TCB可以看作是连接的上下文,它保存在系统的内存中,直到连接释放。TCB中包含了许多与连接相关的重要信息,主要包括:

  1. 连接状态:记录TCP连接的当前状态,如CLOSED、LISTEN、SYN_SENT、SYN_RCVD、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、LAST_ACK、TIME_WAIT等。

  2. 端口信息:记录本地端口和远程端口号。

  3. 序号和确认号:记录TCP数据段的序列号和确认号,用于实现数据的可靠传输和有序接收。

  4. 定时器:用于实现超时重传机制和拥塞控制,包括重传定时器、持续定时器等。

  5. 窗口大小:记录接收端愿意接收的字节数,用于实现流量控制。

  6. 选项参数:记录TCP连接的各种选项参数,如最大报文长度(MSS)、窗口扩大因子、时间戳等。

  7. 连接缓冲区:用于临时存储发送和接收的数据,以及存储未确认的数据。

  8. 连接控制信息:记录TCP连接的一些控制信息,如连接建立时间、最后活动时间等。

        TCB的创建和管理由操作系统的TCP协议栈负责,每个TCP连接都会分配一个TCB,并在连接建立时初始化。TCB会在连接释放后被释放,并释放相关的资源。通过TCB,TCP协议栈可以有效地管理和控制TCP连接,保证连接的可靠性、稳定性和性能。

TCP 状态转换图

TCP 连接的状态转换图如下图所示:

      +---------+          +---------+
      |  CLOSED |          | LISTEN  |
      +----+----+          +----+----+
           |                    |
           |                    |
           |       +----+       |
           |       | SYN|<------+
           +------>|SENT|
           |       +----+
           |          |
           |          |
           |          |
           |          v
           |       +----+
           |       | SYN|------------+
           |       |RCVD|            |
           |       +----+            |
           |         |               |
           |         |               |
           |         |               |
           |         v               |
           |      +----+             |
           |      | EST|             |
           |      +----+             |
           |         |               |
           |         |               |
           |         |               |
           |         v               |
           |       +----+             |
           |       |FIN |<------------+
           +------>|WAIT|
                   +----+
                      |
                      |
                      v
                  +-----+
                  |CLOSE|
                  +-----+

状态说明:

  • CLOSED:初始状态,表示连接未打开或已关闭。
  • LISTEN:服务器等待连接请求的状态。
  • SYN_SENT:客户端发送了连接请求,等待服务器的确认。
  • SYN_RCVD:服务器收到连接请求,等待客户端的确认。
  • ESTABLISHED:连接已经建立,双方可以传输数据。
  • FIN_WAIT_1:客户端发送了连接释放请求,等待服务器的确认。
  • FIN_WAIT_2:服务器收到了客户端的连接释放请求,等待自己的连接释放请求。
  • CLOSE_WAIT:服务器端关闭发送方向,等待客户端关闭连接。
  • LAST_ACK:服务器端发送连接释放请求,等待客户端的确认。
  • TIME_WAIT:连接已经关闭,等待2MSL后释放连接。
  • CLOSED:连接完全关闭,无法再传输数据。

TCP 连接同时打开与同时关闭

        在实际的TCP实现中,还存在一种优化机制,即“同时打开”和“同时关闭”。这种机制允许TCP连接在一方发送特定报文的同时,另一方直接进入目标状态,而不需要等待对方的确认。具体情况如下:

  1. 同时打开(Simultaneous Open):当服务器处于LISTEN状态时,如果收到客户端的SYN报文,它可以直接进入ESTABLISHED状态,而不需要等待客户端的ACK报文。这样可以减少连接建立的延迟,提高连接建立的效率。

  2. 同时关闭(Simultaneous Close):当一方发送FIN报文表示关闭连接时,另一方可以直接进入CLOSED状态,而不需要等待对方的ACK报文。例如,当服务器在LAST_ACK状态下收到客户端的FIN报文时,可以直接进入CLOSED状态,而不需要等待客户端的ACK报文。这样可以加快连接的释放过程,减少连接的持续时间。

序列号与确认号机制

        TCP使用序列号(Sequence Number)和确认号(Acknowledgment Number)机制来实现可靠传输。这两个机制是TCP中保证数据可靠性的核心。

  1. 序列号(Sequence Number):TCP中的每个数据字节都会被编号,序列号就是用来表示数据字节的编号。发送端将每个数据字节赋予一个唯一的序列号,序列号按字节递增。接收端通过检查序列号,可以确定接收到的数据是否按顺序到达,以及是否有丢失或乱序的数据。

  2. 确认号(Acknowledgment Number):确认号表示期望接收的下一个数据字节的序列号。接收端会在确认报文中指定确认号,告知发送端接收到了哪些数据字节,以及期望接收哪个序列号的数据字节。发送端根据确认号可以确定哪些数据字节已经成功接收,哪些数据字节需要进行重传或重新排序。

        通过序列号和确认号机制,TCP可以实现可靠的数据传输。发送端在发送数据时会附加序列号,接收端在接收到数据后会发送确认报文,确认号表示期望接收的下一个序列号。如果发送端没有收到确认报文或收到了重复的确认报文,就会进行重传。这样可以确保数据的正确、有序和可靠地传输。

SYN 泛洪攻击

        SYN泛洪攻击利用了TCP连接建立过程中的三次握手特性。攻击者向目标服务器发送大量的SYN报文,但不完成三次握手过程,即不发送第三次握手的ACK报文,导致服务器一直处于等待状态,消耗大量的资源,最终可能导致服务不可用。

为了防御SYN泛洪攻击,常见的方法包括:

  1. SYN Cookie(SYN Cookie Defense):这种防御方法的核心思想是,在服务器接收到SYN报文时,并不立即分配资源创建连接,而是根据接收到的SYN报文信息计算一个加密的Cookie,并将该Cookie发送给客户端。只有当客户端发送第三次握手时,服务器才根据Cookie信息恢复连接状态,完成连接的建立。这样可以防止服务器资源被耗尽。

  2. SYN Proxy(SYN代理):SYN代理是一种位于防火墙或负载均衡器前面的中间设备。它负责接收外部的SYN报文,并为其创建连接。只有在收到客户端的ACK报文后,才将连接请求转发给后端的服务器,完成连接的建立。这样可以有效地过滤掉恶意的SYN报文,保护后端服务器。

  3. TCP SYN Flood防火墙:使用专门设计的TCP SYN Flood防火墙设备或软件,可以识别并过滤掉大量的恶意SYN报文,保护服务器免受攻击。

四.TCP 可靠性

TCP 提供了一种可靠的数据传输服务,它通过多种机制来保证数据准确无误地从发送端传送到接收端。

差错控制

        TCP使用序号和确认号机制来实现差错控制,确保数据的可靠传输。具体来说,差错控制机制包括以下几个方面:

  1. 序号机制:发送端为每个TCP数据段分配一个唯一的序列号。序列号用于标识数据段的顺序和范围,以便接收端按序接收数据并检查数据的完整性。

  2. 确认号机制:接收端在收到数据段后,会发送确认报文给发送端,确认号字段表示接收到了期望接收的下一个数据段的序号。发送端收到确认报文后,就知道哪些数据段已经成功接收,哪些数据段需要进行重传或重新排序。

  3. 重传机制:如果发送端在超时之前没有收到接收端的确认报文,或者收到了重复的确认报文(duplicate ACK),就会触发重传机制,重新发送未确认或丢失的数据段。接收端可以通过发送重复确认报文来提示发送端进行重传。

  4. 超时机制:TCP使用超时机制来检测丢失的数据段。如果发送端在一定时间内没有收到确认报文,就会认为数据段丢失,触发重传操作。超时时间可以根据网络条件和拥塞情况动态调整。

  5. 流量控制机制:TCP使用滑动窗口机制进行流量控制,确保发送端发送的数据不会超出接收端的处理能力范围。接收端通过窗口大小字段告知发送端自己的接收窗口大小,发送端根据接收端的接收能力调整发送速率,避免数据的丢失和过载。

流量控制

        TCP使用滑动窗口机制来实现流量控制,确保发送端和接收端之间的数据传输速率匹配,并防止发送端发送过多数据导致接收端缓冲区溢出。具体来说,滑动窗口包括发送窗口和接收窗口,每个窗口都表示可以发送或接收但尚未得到确认的数据量。

  1. 发送窗口:发送端维护一个发送窗口,表示可以发送但尚未得到确认的数据量。发送窗口的大小取决于接收端的接收窗口大小以及网络的拥塞程度。发送端只能发送发送窗口内的数据,确保不会超出接收端的接收能力范围。

  2. 接收窗口:接收端维护一个接收窗口,表示还可以接收的数据量。接收窗口的大小取决于接收端的缓冲区大小以及应用程序的处理能力。接收端通过发送窗口大小字段通知发送端自己的接收窗口大小,发送端根据接收窗口大小调整发送速率,确保不会发送超出接收端缓冲区容量的数据量。

拥塞控制

        TCP使用多种算法来实现拥塞控制,以避免网络拥塞并确保网络的稳定性和公平性。常见的拥塞控制算法包括:

  1. 慢启动(Slow Start):慢启动算法用于在连接刚建立时逐渐增加发送窗口的大小,以探测网络的带宽容量。发送端会以指数级别增加发送窗口大小,直到达到一个阈值(拥塞窗口阈值)。

  2. 拥塞避免(Congestion Avoidance):拥塞避免算法用于在网络未出现拥塞的情况下维持发送窗口的大小,以保持网络的稳定性。发送端会以线性增加的方式逐渐增加发送窗口大小,直到出现拥塞信号。

  3. 快重传(Fast Retransmit):快重传算法用于快速检测丢失的数据段并进行重传,以减少重传时间和降低网络延迟。当接收端收到乱序的数据段时,会立即发送重复确认报文,触发发送端的快速重传操作。

  4. 快恢复(Fast Recovery):快恢复算法用于在快速重传后,迅速恢复发送窗口的大小,以保持网络的吞吐量。当发送端收到重复确认报文时,会将拥塞窗口减半,并进入快速恢复状态,此时发送端不再执行慢启动算法,而是将拥塞窗口设置为拥塞避免阈值的一半。

五.UDP

UDP(用户数据报协议)是一种无连接的传输层协议,它提供了一种不可靠的数据传输服务。UDP 的特点是简单、高效,通常用于实时应用或对可靠性要求不高的场景。

数据报格式

UDP数据报的首部格式如下所示:

  1. 源端口和目的端口:源端口和目的端口字段分别标识了发送端和接收端的端口号。它们是16位长,用于将数据报正确地交付给目的地。

  2. 长度:长度字段指示了UDP数据报的总长度,包括UDP首部和数据部分。这个字段的长度是16位,所以UDP数据报的最大长度为65535字节(包括8字节的UDP首部)。

  3. 检验和:检验和字段用于检测UDP数据报在传输过程中的错误。发送端计算数据报的检验和并将其附加到数据报中,接收端在接收到数据报后也会重新计算检验和,如果发现校验和错误,则丢弃数据报。

  4. 数据:数据字段携带了UDP数据报所传输的实际数据。数据字段可以为空,或者包含从0到65535字节的数据。

UDP 伪首部与检验和计算

        在计算UDP检验和时,需要构造一个伪首部,这个伪首部包含源IP地址、目的IP地址、协议号以及UDP数据报的长度。然后,将构造的伪首部和UDP数据报的内容一起进行计算。这种方法可以帮助验证数据在传输过程中是否被篡改或损坏。

伪首部的格式如下:

  • 源IP地址:4个字节,表示UDP数据报的源IP地址。
  • 目的IP地址:4个字节,表示UDP数据报的目的IP地址。
  • 协议号:2个字节,表示UDP协议的协议号,通常为17。
  • UDP长度:2个字节,表示UDP数据报的长度,包括UDP首部和数据部分。

        构造好伪首部后,将伪首部和UDP数据报的内容一起进行计算,得到的结果就是UDP检验和。发送端在发送UDP数据报时,会计算并附加检验和到UDP数据报中;接收端在接收UDP数据报时,会重新计算检验和,并将其与接收到的检验和进行比较,以确定数据是否完整和未被篡改。