当前位置: 首页 > news >正文

传输控制协议(TCP)和用户数据报协议(UDP)

一、传输控制协议(TCP)

传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的 RFC 793 定义。

它通过三次握手建立连接,确保数据的可靠传输,并提供顺序控制、流量控制和拥塞控制等功能‌。

在简化的计算机网络 OSI 模型中,它完成第四层传输层所指定的功能。用户数据报协议(UDP)是同一层内另一个重要的传输协议。
在因特网协议族(Internet protocol suite)中,TCP 层是位于 IP 层之上,应用层之下的中间层。

1.TCP的特点

  1. TCP 是面向连接(虚连接)的传输层协议。
  2. 每一条 TCP 连接只能有两个端点,每一条 TCP 连接只能是点对点的。
  3. TCP 提供可靠交付的服务,无差错、不丢失、不重复、按序到达。
  4. TCP 提供全双工通信
  5. TCP 面向字节流

2.TCP报文

在这里插入图片描述

  • 源端口(Source Port):16 bits,通过一个端口号告诉 TCP 报文来自于哪个进程。
  • 目标端口(Destination Port):16 bits,通过一个端口号告诉 TCP 报文要发给哪个进程。
  • 序号(Sequence Number,seq):32 bits,在一个 TCP 连接中传送的字节流中的每一个字节都按顺序编号,本字段表示本报文段所发送数据的第一个字节的序号 。
  • 确认号(Acknowledgment Number,ack):32 bits, 期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则证明到序号N-1为止的所有数据都已正确收到。
  • 数据偏移(Data Offset,DOffset) :4 bits,TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远,以4B位单位,即1个数值是4B。
  • 保留(Reserved ,Rsrvd):6 bits,须置0。
  • 控制位(Flags):6 bits,
    • 紧急位 URG:URG=1 时,标明此报文段中有紧急数据,是高优先级的数据,应尽快传送,不用在缓存里排队,配合紧急指针字段使用。
    • 复位 RST:RST=1 时,表明 TCP 连接中出现严重差错,必须释放连接,然后再重新建立传输链接。
    • 确认位 ACK:ACK=1 时确认号有效,在连接建立后所有传送的报文段都必须把 ACK 置为 1。
    • 推送位 PSH:PSH=1 时,接收方尽快交付接收应用进程,不再等到缓存填满再向上交付。
    • 同步位 SYN:SYN=1 时,表明是一个连接请求/连接接受报文。
    • 终止位 FIN:FIN=1 时,表明此报文段发送方数据已发完,要求释放连接。
  • 窗口(Window,WIN):16 bits,指的是发送本报文段的一方的接收窗口,即现在允许对方发送的数据量。
  • 检验和(Checksum):16 bits,检验首部+数据,检验时要加上 12B 伪首部,第四个字段为6。
  • 紧急指针(Options) :16 bits,URG=1 时才有意义,指出本报文段中紧急数据的字节数。
  • 选项(Options ) :最多40 bits,最大报文段长度MSS、窗口扩大、时间戳、选择确认…

3.ACK与ack的区别

大写ACK是确认值(Acknowledgement),为1便是确认连接。
小写ack是确认编号(Acknowledgement Number),即接收到的上一次远端主机传来的seq然后+1,再发送给远端主机。提示远端主机已经成功接收上一次所有数据。

4.TCP连接过程

TCP 是面向连接的,客户端与服务器要建立连接才能进行通信,通信后需要断开连接。

(1)三次握手建立连接

假设运行在一台主机(客户)上的一个进程想与另一台主机(服务器)上的一个进程建立一条连接,客户应用进程首先通知客户 TCP,他想建立一个与服务器上某个进程之间的连接,客户中的 TCP 会用以下步骤与服务器中的 TCP 建立一条 TCP 连接:

  1. 第一次握手:客户端把 SYN 标志位置为1,随机初始化 “序列号” seq=x 的数据包到服务器,并进入 SYN-SENT 状态;服务器由 SYN=1 知道,客户端要求建立联机,此时服务器进入 LISTEN 状态;
  2. 第二次握手:服务器收到请求后,随机初始化自己的“序列号” seq=y,“确认应答号” ack=x+1,把 SYNACK 标志位置为1,把该报文发给客户端,此时服务器进入进入 SYN-RECEIVED 状态。
  3. 第三次握手:客户端收到服务端报文后,将 ACK 标志位置为1,“确认应答号” ack=y+1,“序列号” seq=x+1,最后把报文发送给服务端,这次报文可以携带客户到服务端的数据,之后客户端和服务器处于 ESTABLISHED 状态。

在这里插入图片描述

(2)四次挥手关闭连接

参与一条TCP连接的两个进程中的任何一个都能终止该连接,连接结束后,主机中的“资源”(缓存和变量)将被释放。

  1. 第一次挥手:客户端发送一个 FIN=1,seq=u 的数据包到服务端,用来关闭客户端到服务器的数据传送。然后客户端进入 FIN-WAIT-1 状态。
  2. 第二次挥手:服务器收到这个数据包,它发送一个 ACK标志为1,ack=u+1,seq=v 的数据包到客户端 。然后服务端进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。
  3. 第三次挥手:服务端发送一个 FIN=1,ACK=1,seq=w,ack=u+1 的数据包到客户端,请求关闭连接,然后服务端进入 LAST-ACK 状态。
  4. 第四次挥手:客户端发送 ACK=1,ack=w+1 的数据包到服务端,然后客户端进入TIME-WAIT 状态,服务端在收到数据包后进入 CLOSE 状态。

此时如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了。

在这里插入图片描述

5.滑动窗口

在TCP通信中,每次发送数据都需要等待一次确认应答,如果在等待前一个数据包的确认时才发送下一个数据包,通信效率会变得很低。

为解决这个问题,TCP 引入了滑动窗口这个概念。它允许发送方在不接收确认应答的情况下持续发送数据,并根据接收方的反馈及时调整数据发送速率。即使在往返时间较长的情况下,它也不会降低网络通信的效率。

TCP 报文里有一个字段叫窗口(Window,WIN),记录着窗口大小的信息窗口大小。
这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收
端的处理能力来发送数据,而不会导致接收端处理不过来。

发送方发送的数据大小不能超过接收方的窗口大小,否则接收方就无法正常接收到数据。所以,通常窗口的大小是由接收方的窗口大小来决定的。

滑动窗口基本概念

  • SND.WND:发送窗口。
  • SND.UNA:Send Unacknowledged 指针,指向发送窗口的第一个字节。
  • SND.NXT:Send Next 指针,指向可用窗口的第一个字节。
  • 可用窗口大小 = SND.UNA + SND.WND - SND.NXT 。
(1)发送窗口的工作原理

发送窗口的工作空间,根据处理的情况分成四个部分:
已发送并收到 ACK确认的数据、已发送但未收到 ACK确认的数据、未发送但总大小在接收方处理范围内(接收方还有空间)、未发送但总大小超过接收方处理范围(接收方没有空间)

其中已发送但未收到 ACK确认的数据的部分方框是发送窗口,未发送但总大小在接收方处理范围内(接收方还有空间)的部分是可用窗口。

下面是发送窗口工作原理的示意图,在下图中,蓝色部分为已发送并收到 ACK确认的数据的子节,绿色部分为已发送但未收到 ACK确认的数据,黄色部分为未发送但总大小在接收方处理范围内的数据,白色部分为未发送但总大小超过接收方处理范围。

下图以滑动窗口大小为 8 为例子:

(a):
在这里插入图片描述
已发送并收到 ACK确认的数据:11 ~ 13字节,共3个字节;
已发送但未收到 ACK确认的数据:0个字节;
未发送但总大小在接收方处理范围内(接收方还有空间)的数据:14 ~ 21字节,共8个字节;
未发送但总大小超过接收方处理范围(接收方没有空间)的数据:22字节以后。

(b):
在这里插入图片描述
已发送并收到 ACK确认的数据:11 ~ 13字节,共3个字节;
已发送但未收到 ACK确认的数据:14 ~ 16字节,共3个字节;
未发送但总大小在接收方处理范围内(接收方还有空间)的数据:17 ~ 21字节,共5个字节;
未发送但总大小超过接收方处理范围(接收方没有空间)的数据:22字节以后。

(c):
在这里插入图片描述
已发送并收到 ACK确认的数据:11 ~ 15字节,共5个字节;
已发送但未收到 ACK确认的数据:26 ~ 23字节,共8个字节;
未发送但总大小在接收方处理范围内(接收方还有空间)的数据:0个字节;
未发送但总大小超过接收方处理范围(接收方没有空间)的数据:28字节以后。

(d):

在这里插入图片描述
已发送并收到 ACK确认的数据:11 ~ 19字节,共9个字节;
已发送但未收到 ACK确认的数据:20 ~ 23字节,共4个字节;
未发送但总大小在接收方处理范围内(接收方还有空间)的数据:24 ~ 27字节,共4个字节;
未发送但总大小超过接收方处理范围(接收方没有空间)的数据:28字节以后。

(2)接收窗口的工作原理

接收窗口根据处理的情况划分成三个部分: 已成功接收并确认的数据(等待应用进程读取)、 未收到数据但可以接收的数据、未收到数据并不可以接收的数据;

上面发送窗口的图d情况中,接收窗口的示意图如下:
在这里插入图片描述
已成功接收并确认等待应用进程读取)数据:11 ~ 19字节,共9个字节;
未收到数据但可以接收的数据:20 ~ 27字节,共8个字节;
未收到数据并不可以接收的数据:28字节以后。

二、TCP 保证可靠性机制

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

前文提到 TCP 是可靠的,那么 TCP 靠着哪些机制保证了可靠性呢?

TCP 主要通过连接管理、序列号、确认应答、重传机制、流量控制、拥塞控制四个机制来保证可靠性的。

1.序列号与确认应答机制

在TCP中,通过序列号与确认应答来实现数据的可靠传输。

TCP将每个字节的数据都进行了编号,这就是序列号,序列号能够保证可靠性和有序性。

接收方接收数据之后,会回传ACK报文,报文中带有此次确认的序列号,用于告知发送方此次接收数据的情况这就是确认应答

序列号与确认应答机制就是,在发送端将数据传输到接收主机时,接收主机会根据收到消息的序列号,发送一个确认应答消息以表示已成功接收到数据。
在这里插入图片描述

2. 重传机制

在错综复杂的网络,数据在传输过程中是有可能丢失的,所以 TCP 针对数据包丢失的情况,会用重传机制解决。

(1)超时重传

发送方在发送数据时,设定一个定时器,使用一个保守估计的时间作为收到 ACK 确认应答报文的超时上限。如果超过这个上限仍未收到对方的 ACK 确认应答报文,发送方将重传这个数据包。每当发送方收到确认包后,会重置这个重传定时器。
在这里插入图片描述
TCP 会在以下两种情况发生超时重传:数据包丢失、确认应答丢失。

超时重传时间怎么确定

  • RTT(Round Trip Time):往返时间,指的是数据发送时刻到接收到确认的时刻的差值,也就是包的往返时间。
  • RTO(Retransmission Time Out):重传超时时间,即从数据发送时刻算起,超过这个时间便执行重传。

RTO 的确定是一个关键问题,因为它直接影响到 TCP 的性能和效率。当超时时间 RTO 较大时,重发就慢,丢了老半天才重发,没有效率,性能差; 当超时时间 RTO 较小时,会导致可能并没有丢就重发,于是重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。
因此,RTO 应该根据网络的实际状况,动态地进行调整。

TCP采用了一种自适应算法,它记录一个报文段发出的时间,以及收到相应的确认的时间。这两个时间之差就是报文段的往返时间 RTT 。TCP保留了 RTT 的一个加权平均往返时间 RTTS(这又称为平滑的往返时间,S表示 Smoothed。因为进行的是加权平均,因此得出的结果更加平滑)。每当第一次测量到 RTT 样本时,RTT值就取为所测量到的 RTT 样本值。但以后每测量到一个新的 RTT样本,就按下式重新计算一次 RTTS:
(1)首次计算RTO时:

R T T S = R 1 RTT_S=R1 RTTS=R1

R T T d e v = R 1 / 2 RTT_{dev}=R1/2 RTTdev=R1/2

R T O = μ × R T T S + ∂ × R T T d e v = μ × R 1 + ∂ × R 1 / 2 RTO = μ \times RTT_S+∂ \times RTT_{dev}=μ \times R1+∂ \times R1/2 RTO=μ×RTTS+×RTTdev=μ×R1+×R1/2

其中:R1 是第一次测量的 RTT

(2)迭代计算RTO时:

R T T S = R T T S + α × ( R T T − R T T S ) = R T T S + α × ( R 2 − R 1 ) RTT_S=RTT_S+ α \times(RTT-RTT_S)=RTT_S+ α \times(R2 - R1) RTTS=RTTS+α×(RTTRTTS)=RTTS+α×(R2R1)

R T T d e v = ( 1 − β ) × R T T d e v + β × ( R T T − R T T S ) RTT_{dev}=(1-β) \times RTT_{dev}+β \times (RTT-RTT_S) RTTdev=(1β)×RTTdev+β×(RTTRTTS)

R T O = μ × R T T S + ∂ × R T T d e v RTO = μ \times RTT_S+∂ \times RTT_{dev} RTO=μ×RTTS+×RTTdev

其中:R2 是新测量的 RTT
RTTS 是计算平滑的 RTTRTTdev 是计算平滑的 RTT 与 最新 RTT 的差距。
在 Linux 下, α = 0.125 α = 0.125 α=0.125 β = 0.25 β = 0.25 β=0.25 μ = 1 μ = 1 μ=1 ∂ = 4 ∂ = 4 =4。是大量实验中调出来的。

(2)快速重传(Fast Retransmit)

TCP 还有另外⼀种快速重传(Fast Retransmit)机制,它基于接收端的反馈信息来引发重传,而非重传计时器超时

换言之,当数据包未连续到达时,接收方会针对可能丢失的最后一个包发送 ack 确认。若发送方连续3次接收到相同的ack,便会触发重传机制。快速重传的优势在于,它无需等待超时即可进行重传,从而提高了数据传输的效率。

在这里插入图片描述

如上图的例子,发送方发出了 1,2,3,4,5 份数据:

当发送方依次发送了seq序号为1、2、3、4、5的数据包后,接收方首先成功接收了seq1并返回了确认(ack=2)请求下一个包(即seq2)。然而,由于某些原因,seq2未能到达接收方。随后,seq3、seq4、seq5号包均成功送达,但接收方依然只能回复ack=2,因为它仍然期待seq2的到达。发送方在连续三次收到ack=2的反馈后,识别出2号包可能丢失,于是立即重传2号包。在接收方最终收到seq2后,鉴于seq3、seq4、seq5号包均已成功接收,它随即发送ack=6,请求下一个期望的包(若存在)。

快速重传机制解决了超时时间的问题,但是它依然面临着另外一个问题。就是重传的时候,是重传一个,还是重传所有的问题。

(3)选择确认重传 (Selective Acknowledgment,SACK)

改进的方法就是选择确认重传 (Selective Acknowledgment,SACK)。

在TCP头部的选项(Options) 字段中,添加了选择性确认(SACK)选项。通过SACK,接收方可以返回最近收到的报文段的序列号范围,使发送方能够准确知道哪些数据包已经成功接收,哪些数据包尚未到达。

有了这些信息,发送端只需重传丢失的数据包,而不是整个数据流,从而提高了重传的精确性和效率。
在这里插入图片描述
如上图的例子:
现在先后发送了5个数据包的数据,如果此时发送第2个数据包时数据丢失,而其余4个数据包都收到了接收方的确认信息,那么此时根据SACK可以判断出只有第二个数据包丢失,而第1个、第3个、第4个、第5个数据包已被接收,此时可以只重新发送第2个数据包。

(4)DSACK

DSACK,即重复 SACK(Duplicate Selective Acknowledgment),这个机制是在 SACK 的基础上,额外携带信息,告知发送方有哪些数据包自己重复接收了。DSACK 的目的是帮助发送方判断,是否发生了包失序、ACK 丢失、包重复或伪重传。让 TCP 可以更好的做网络流控。

3. 流量控制

为避免触发重发机制和避免网络流量浪费,发送方需要考虑接收方的处理能力。如果发送方持续发送数据给接收方而后者无法及时处理,将导致重发机制触发,进而浪费网络资源。为此,TCP引入了流量控制机制。

通过流量控制,发送方可以根据接收方当前的接收能力来动态调整发送的数据量,避免过载接收方而导致数据丢失或延迟,从而优化整个网络通信的效率和可靠性。

一句话总结一下,流量控制就是:让发送方慢点 ,要让接收方来得及接收。

(1)流量控制

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

在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,即接收窗口rwnd(接收方设置确认报文段的窗口字段来将rwnd通知给发送方) ,发送方的发送窗口接收窗口 rwnd 和拥塞窗口cwnd 的最小值。

例子如下:

A向B发送数据,连接建立时,B告诉A:“我的rwnd=400(字节)”,设每一个报文段100B,报文段序号初始值为1
在这里插入图片描述

(2)窗口关闭

TCP 通过让接收方指明滑动窗口的大小来进行流量控制。如果窗口大小为 0 时,就会阻止发送方给接收方传递数据,直到窗口变为非 0 为止,这就是窗口关闭。

当窗口关闭时,接收方在处理完数据后会发送一个非0窗口大小的ACK报文通知发送方。然而,如果这个通告窗口的ACK报文在网络中丢失,可能会导致问题。发送方会继续等待ACK确认,无法发送新的数据。如不采取措施,这种相互等待的过程,会造成了死锁的现象。

为了解决上述的死锁问题,TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器
若持续计时器设置的时间到期,就发送一个**零窗口探测 ( Window probe )**报文段 。接收方收到探测报文段时给出现在的窗口值。

若窗口仍然是0,那么发送方就重新设置持续计时器;如果不是0,则发送方可以根据窗口的大小继续发送数据,死锁的局面就被打破了。

这样通过定时地进行探测,就可以避免死锁的产生。

4. 拥塞控制

在网络拥堵时,若持续发送大量数据包,可能导致数据包时延和丢失。TCP会进行重传,然而重传会增加网络负担,导致更大的延迟和丢包。这会形成恶性循环,不断放大问题。

为了解决此问题,就有了拥塞控制的概念,拥塞控制是指防止过多的数据注入网络,保证网络中的路由器或链路不致过载。

拥塞控制是通过拥塞拥塞窗口实现的。

拥塞窗口(cwnd)是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。只要网络中没有出现拥塞,cwnd 就会增大; 但网络中出现了拥塞,cwnd 就减少。

常见的拥塞控制算法有慢启动拥塞避免快速恢复

(1)慢启动(Slow Start)

在 TCP 刚刚连接好并开始发送TCP报文段时,先令拥塞窗口 cwnd=1,即一个最大报文段长度 MSS。每收到一个对新报文段的确认后,将 cwnd 加1,即增大一个 MSS。用这样的方法逐步增大发送方的拥塞窗口 cwnd,可使分组注入网络的速率更加合理。

例如:
A 向 B发送数据,发送时 A的拥塞窗口为 1,那么A一次可以发送1个 TCP 报文段,经过一个RTT后(也称一个传输轮次),A收到B对刚才1个报文的确认,于是把拥塞窗口调整为 2,下一次发送时就可一次发送2个报文段。
第二轮数据发送时,发送时 A的拥塞窗口为 2,那么A一次可以发送2个 TCP 报文段,经过一个RTT后(也称一个传输轮次),A收到B对刚才2个报文的确认,于是把拥塞窗口调整为 4,下一次发送时就可一次发送4个报文段。
在这里插入图片描述

(2)拥塞避免(Congestion Avoidance)

慢启动算法,发包的个数是指数性的增长,这样拥塞窗口的增长速度会过快,所以需要拥塞避免算法来降低拥塞窗口的增长速度。

拥塞避免算法的做法如下:

发送端的拥塞窗口 cwnd(Congestion Window) 每经过一个往返时延 RTT就增加1个 MSS的大小,而不是加倍,使cwnd 按线性规律缓慢增长(即加法增大)。

可以通过 慢启动门限 ssthresh(slow start threshold)状态变量,来决定慢启动算法和拥塞避免算法的使用。

  • 当 cwnd<ssthresh 时,使用慢开始算法。
  • 当 cwnd>ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
  • 当cwnd= ssthresh 时,既可使用慢开始算法,又可使用拥塞避免算法(通常做法)。

在这里插入图片描述

(3)拥塞发生的处理

网络出现拥塞时,无论是在慢开始阶段还是在拥塞避免阶段,只要发送方检测到超时事件的发生(未按时收到确认,重传计时器超时),就要采取激烈的应对措施。具体反应如下:

  1. 将慢启动阈值(sshthresh)设置为当前拥塞窗口(cwnd)的一半,即 sshthresh = cwnd /2。
  2. 将拥塞窗口(cwnd)重置为1,即 cwnd=1。
  3. 随后进入慢启动过程,以逐步恢复数据传输速率。
    这样做的目的是迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完。

拥塞避免并不能完全能避免拥塞。利用以上措施要完全避免网络拥塞是不可能的。拥塞避免是指在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

在这里插入图片描述

(4)快速重传(Fast Retransmit)与快速恢复(Fast Recovery)

当拥塞发生时,如果将拥塞窗口直接设置为1,并重新开始慢启动,是会突然减少数据流的。但是这种方式太激进了,反应也很强烈,会造成网络卡顿。所以提出了快速重传算法。

快速重传

如上文的重传机制,当丢包的时候,会有两种情况:超时重传和快速重传。

在拥塞发生时,使用“快速重传算法”进行重传更符合需求。当接收端检测到有中间数据包丢失时,会连续三次发送对前一个数据包的确认(ack),从而促使发送端迅速进行重传,无需等待超时。TCP协议认为这种情况下的网络拥塞并不严重,因为仅丢失了少量数据包。

在发生此类拥塞时的快速重传流程如下:

  1. 将拥塞窗口(cwnd)减半,即cwnd = cwnd/2。
  2. 将慢启动阈值(ssthresh)设置为当前的拥塞窗口值,即ssthresh = cwnd。
  3. 随后进入快速恢复算法阶段。

快速恢复

RFC5681文档中描述了快速恢复算法。快速重传与快速恢复算法常被并行运用。快速恢复算法的基本思想是,当收到三个重复的ack确认时,意味着网络状况尚可并未严重恶化,因此无需采取像RTO超时那样的严厉措施来应对。

进入快速恢复之前,cwnd 和 sshthresh在快速重传算法执行之前已被进行如下更新:

  • cwnd = cwnd /2
  • sshthresh = cwnd

快速恢复过程概述如下:

  1. 将拥塞窗口(cwnd)设置为慢启动阈值(sshthresh)加3,并确认已收到3个数据包,即cwnd = sshthresh + 3 ;
  2. 重传之前丢失的数据包;
  3. 当收到 针对重传数据包的确认(ack)时,那么拥塞窗口增加1,即(cwnd = cwnd +1);
  4. 若收到确认新数据的确认(ack),,表明所有重传的数据包均已被成功接收,此时将拥塞窗口(cwnd)重新设置为慢启动阈值(sshthresh),即cwnd = sshthresh,并结束快速恢复过程,随后进入拥塞避免阶段。

在这里插入图片描述

三、用户数据报协议(UDP)

用户数据报协议(User Datagram Protocol,UDP)又称用户数据包协议,是一个简单的是一种无连接的、不保证可靠的、面向数据包的传输层通信协议,位于OSI模型的传输层。

该协议由 David P. Reed 在1980年设计且在RFC 768中被规范。典型网络上的众多使用 UDP 协议的关键应用在一定程度上是相似的。

在 TCP/IP 模型中,UDP 为网络层以上和应用层以下提供了一个简单的接口。UDP 只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以 UDP 有时候也被认为是不可靠的数据包协议)。UDP 在 IP 数据包的头部仅仅加入了复用和数据校验字段。

1. UDP 的特点

  1. UDP是无连接的,减少开销和发送数据之前的时延。
  2. UDP使用最大努力交付,即不保证可靠交付
  3. UDP是面向报文的,适合一次性传输少量数据的网络应用。
  4. UDP无拥塞控制,适合很多实时应用。
  5. UDP首部开销小,8B,TCP20B。

2. UDP 报文

在这里插入图片描述

  • 源端口(Source Port):16 bits,通过一个端口号告诉 TCP报文来自于哪个进程。
  • 目标端口(Destination Port):16 bits,通过一个端口号告诉 TCP报文要发给哪个进程。
  • 包长度(Length):16 bits,该字段保存了 UDP 首部的长度跟数据的长度之和。
  • 校验和(Checksum):16 bits,校验和是为了提供可靠的 UDP 首部和数据而设计,防止收到在网络传输中受损的 UDP 包。

四、TCP 与 UDP 区别

1.TCP 与 UDP 区别

  1. 面向连接:TCP 是面向连接的传输层协议,传输数据前先要建立连接。UDP 是不需要连接,即刻传输数据;
  2. 服务对象:TCP 是一对一的两点服务,即一条连接只有两个端点。UDP 支持一对一、一对多、多对多的交互通信;
  3. 可靠传输:TCP 是可靠交付数据的,数据可以无差错、不丢失、不重复、按序到达。UDP 是尽最大努力交付,不保证可靠交付数据,但是我们可以基于 UDP 传输协议实现一个可靠的传输协议,QUIC 协议;
  4. 拥塞控制、流量控制:TCP 有拥塞控制和流量控制机制,保证数据传输的安全性。UDP 则没有,即使网络非常拥堵了,也不会影响 UDP 的发送速率;
  5. 传输效率:由于使用 TCP 进行传输的时候多了连接、确认、重传等机制,所以 TCP 的传输效率要比 UDP 低很多;
  6. 首部开销:TCP首部开销20字节。UDP首部开销8字节;
  7. 传输方式:TCP 是流式传输,没有边界,但保证顺序和可靠。UDP 是一个包一个包的发送,是有边界的,但可能会丢包和乱序。

2.TCP 与 UDP 应用场景

  • 由于 TCP 是面向连接,能保证数据的可靠性交付,因此经常用于: FTP 文件传输; HTTP / HTTPS;
  • 由于 UDP 面向无连接,它可以随时发送数据,再加上 UDP 本身的处理既简单又高效,因此经常用于: 包总量较少的通信,如 DNS 、SNMP 等; 视频、音频等多媒体通信; 广播通信;

相关文章:

传输控制协议(TCP)和用户数据报协议(UDP)

一、传输控制协议&#xff08;TCP&#xff09; 传输控制协议&#xff08;Transmission Control Protocol&#xff0c;TCP&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;由 IETF 的 RFC 793 定义。 它通过三次握手建立连接&#xff0c;确保数…...

【Python爬虫】Scrapy框架实战---百度首页热榜新闻

如何利用Scrapy框架实战提取百度首页热榜新闻的排名、标题和链接 一、安装Scrapy库 二、创建项目&#xff08;以BaiduSpider为例&#xff09; scrapy startproject BaiduSpider生成每个文件的功能&#xff1a; 二、 创建爬虫脚本&#xff08;爬虫名&#xff1a;news&#xff…...

采用python3.12 +django5.1 结合 RabbitMQ 和发送邮件功能,实现一个简单的告警系统 前后端分离 vue-element

一、开发环境搭建和配置 #mac环境 brew install python3.12 python3.12 --version python3.12 -m pip install --upgrade pip python3.12 -m pip install Django5.1 python3.12 -m django --version #用于检索系统信息和进程管理 python3.12 -m pip install psutil #集成 pika…...

Qt 实现网络数据报文大小端数据的收发

1.大小端数据简介 大小端&#xff08;Endianness&#xff09;是计算机体系结构的一个术语&#xff0c;它描述了多字节数据在内存中的存储顺序。以下是大小端的定义和它们的特点&#xff1a; 大端&#xff08;Big-Endian&#xff09; 在大端模式中&#xff0c;一个字的最高有效…...

[译]Elasticsearch Sequence ID实现思路及用途

原文地址:https://www.elastic.co/blog/elasticsearch-sequence-ids-6-0 如果 几年前&#xff0c;在Elastic&#xff0c;我们问自己一个"如果"问题&#xff0c;我们知道这将带来有趣的见解&#xff1a; "如果我们在Elasticsearch中对索引操作进行全面排序会怎样…...

Java基于SpringBoot+Vue的藏区特产销售平台

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

12-表的约束

知识背景 表的约束&#xff0c;就是在表中的数据上加上约束&#xff0c;也被称为数据完整性约束。数据完整性约束的目的是为了不被规定的、不符合规范的数据进入数据库 在录入数据库或数据发生变化时&#xff0c;DBMS(数据库管理系统)会按照一定的约束条件对数据进行监测&…...

【人工智能】深度学习入门:用TensorFlow实现多层感知器(MLP)模型

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 多层感知器(MLP)是一种基础的神经网络结构,广泛应用于分类和回归任务。作为深度学习的重要组成部分,理解并实现MLP是学习更复杂神经网络模型的基础。本文将介绍多层感知器的核心概念、数学原理,并使用…...

【Go】-go中的锁机制

目录 一、锁的基础知识 1. 互斥量/互斥锁 2. CAS&#xff08;compare and swap&#xff09; 3. 自旋锁 4. 读写锁 5. 乐观锁 & 悲观锁 6. 死锁 二、go中锁机制 1. Mutex-互斥锁 2. RWMutex-读写锁 2.1 RWMutex流程概览 2.2 写锁饥饿问题 2.3. golang的读写锁源…...

c ++零基础可视化——vector

c 零基础可视化——vector 初始化 vector<int> v0(5); // 0 0 0 0 0 vector<int> v1(5, 1); // 1 1 1 1 1 vector<int> v2{1, 2, 3} // 1 2 3 vector<int> v3(v1); // 1 1 1 1 1 vector<vector<int>> v4(2, vect…...

Centos 7 安装 Docker 最新版本

文章目录 一、卸载旧版本二、安装最新版本docker三、问题解决3.1 启动docker报错3.2 启动容器报错 一、卸载旧版本 #如果之前安装过旧版本的Docker&#xff0c;可以使用下面命令卸载 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest …...

构建高效在线教育:SpringBoot课程管理系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理在线课程管理系统的相关信息成为必然。开发…...

二进制与网络安全的关系

二进制与网络安全的关系 声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以…...

【计算机网络】网段划分

一、为什么有网段划分 IP地址 网络号(目标网络) 主机号(目标主机) 网络号: 保证相互连接的两个网段具有不同的标识 主机号: 同一网段内&#xff0c;主机之间具有相同的网络号&#xff0c;但是必须有不同的主机号 互联网中的每一台主机&#xff0c;都要隶属于某一个子网 -&…...

VB、VBS、VBA的区别及作用

VB、VBS 和 VBA 是三种与微软 Visual Basic 相关的编程语言或环境&#xff0c;它们在功能和用途上有所不同&#xff1a; # Visual Basic (VB) Visual Basic 是一种面向对象的编程语言&#xff0c;最初由微软公司开发。它是一种高级编程语言&#xff0c;旨在简化开发过程&…...

深度学习中的循环神经网络(RNN)与时间序列预测

一、循环神经网络&#xff08;RNN&#xff09;简介 循环神经网络&#xff08;Recurrent Neural Networks&#xff0c;简称RNN&#xff09;是一种专门用于处理序列数据的神经网络架构。与传统神经网络不同&#xff0c;RNN具有内部记忆能力&#xff0c;能够捕捉数据中的时间依赖…...

Unity 设计模式-原型模式(Prototype Pattern)详解

原型模式 (Prototype Pattern) 原型模式 (Prototype Pattern) 是一种创建型设计模式&#xff0c;它允许通过复制现有的对象来创建新对象&#xff0c;而不是通过直接实例化类。这意味着你可以通过克隆原型对象来生成新的实例&#xff0c;而不必依赖类的构造函数。该模式的核心思…...

如何在 RK3568 Android 11 系统上排查以太网问题

1. 硬件连接检查 在进行软件诊断之前,首先确保所有硬件连接正常: 确认网线可靠插入设备的以太网端口。交换机、路由器中与设备连接的端口是否正常工作。若有可能,尝试更换网线或使用其他端口。2. 使用命令行工具进行基本检查 检查网络接口状态 连接设备并使用 ADB 或终端…...

如何在WPF中嵌入其它程序

在WPF中嵌入其它程序&#xff0c;这里提供两种方案 一、使用WindowsFormHost 使用步骤如下 1、添加WindowsFormsIntegration和System.Windows.Forms引用 2、在界面上放置WindowsFormHost和System.Windows.Forms.Panel 1 <Grid> 2 <WindowsFormsHost> 3…...

大模型呼入系统是什么?

大模型呼入系统是什么&#xff1f; 作者&#xff1a;开源呼叫中心系统 FreeIPCC&#xff0c;Github地址&#xff1a;https://github.com/lihaiya/freeipcc 在呼叫中心领域&#xff0c;大模型呼入是指利用大型语言模型&#xff08;如GPT等&#xff09;处理客户呼入的电话请求&a…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...