【嵌入式八股19】嵌入式通信协议
一、TCP/IP 模型
TCP/IP 模型是网络通信的基础架构,它将网络通信分为多个层次,不同层次实现不同的功能,且对应着不同的协议和网络设备。以下是 OSI 模型、Linux TCP/IP 模型的对比,以及各层常用协议和相关网络设备的介绍:
| 应用层(application) | 应用层:该层主要为用户提供应用程序接口,实现用户与网络的交互,处理应用程序的逻辑和数据处理。 | telnet、DHCP、TFTP、FTP、MQTT、NFS、DNS、FTP、SNMP 等。这些协议在不同的应用场景中发挥着重要作用,如 FTP 用于文件传输,DNS 用于域名解析。 | - |
| 表示层(presentation) | - | - | - |
| 会话层(session) | - | - | - |
| 传输层(transport) | 传输层:负责在源主机和目的主机的应用进程之间建立端到端的逻辑连接,实现数据的可靠传输或高效传输。 | TCP(传输控制协议):提供面向连接的、可靠的数据传输服务,适用于对数据准确性要求高的场景,如文件传输、网页浏览等。UDP(用户数据报协议):提供无连接的、不可靠的数据传输服务,但传输效率高,适用于对实时性要求高的场景,如视频流、音频流传输等。 | 四层交换机:可以根据传输层的端口号等信息进行数据转发,实现负载均衡等功能。 |
| 网络层 | 网络层(Network):主要功能是实现不同网络之间的互联,为数据包选择合适的路由路径。 | IP(网际协议):是网络层的核心协议,负责数据包的寻址和路由。ICMP(网际控制报文协议):用于在 IP 主机、路由器之间传递控制消息,如差错报告、网络状态查询等。IGMP(网际组管理协议):用于管理 IP 组播成员,实现组播通信。ARP(地址解析协议):用于将 IP 地址解析为 MAC 地址。 | 路由器:能够根据网络层的 IP 地址信息,将数据包从一个网络转发到另一个网络。三层交换机:在二层交换机的基础上,增加了网络层的路由功能,可以根据 IP 地址进行数据转发。 |
| 数据链路层(Datalink) | 网络接口层:负责将网络层的数据包封装成数据帧,并通过物理链路进行传输,同时处理物理层的错误检测和纠正。 | Ethernet(以太网协议):是目前应用最广泛的局域网协议,定义了数据帧的格式和传输规则。PPP(点到点协议):用于在两个节点之间建立直接的链路连接,常用于拨号上网等场景。PPPoE(以太网上的点对点协议):结合了 PPP 和 Ethernet 的优点,用于在以太网上实现 PPP 连接。 | 交换机(二层交换机):根据数据链路层的 MAC 地址进行数据帧的转发,实现局域网内设备之间的通信。网桥:用于连接两个或多个局域网,实现不同局域网之间的数据转发。网卡(一半物理层,一半链路层):是计算机与网络之间的接口设备,负责将计算机的数据转换为网络信号进行传输,并接收网络信号转换为计算机可识别的数据。 |
| 物理层(physcial) | - | - | 中继器:用于放大和再生物理信号,延长信号的传输距离。集线器:是一种多端口的中继器,将多个设备连接在一起,共享带宽。 |
二、以太网协议
以太网协议是局域网中常用的通信协议,它定义了数据帧的格式,具体如下:
| 前导码 | 7 字节 | 由 10101010 这样的位序列组成,用于使接收端的物理层与发送端的物理层实现时钟同步,不能算是以太网数据帧,是以太网在物理层上发送以太网数据时添加上去的。 |
| SFD(帧起始定界符) | 1 字节 | 固定为 10101011,标志着一个以太网数据帧的开始,同样是物理层添加的内容。 |
| 目标地址 | 6 字节 | 表示数据帧的接收方的 MAC 地址。 |
| 源地址 | 6 字节 | 表示数据帧的发送方的 MAC 地址。 |
| 长度/类型 | 2 字节 | 当值大于 1518 时,表示该以太网帧中的数据属于哪个上层协议。例如,0x0800 表示 IP 数据包,0x0806 表示 ARP 数据包;当值小于等于 1518 时,表示数据字段的长度。 |
| 数据 | 46~1500 字节 | 存放上层协议的数据,如 IP 数据包等。如果数据长度小于 46 字节,需要填充字节以达到最小长度要求。 |
| CRC 校验 | 4 字节 | 用于对数据帧进行循环冗余校验,检测数据在传输过程中是否发生错误。 |
补充说明:
- 前导码和 SFD 主要用于物理层的同步和帧起始标识,不属于真正的数据帧内容。
- 长度/类型字段的取值决定了其具体含义,是区分上层协议还是表示数据长度的关键。
- 单播地址、组播地址:目标地址的第一个字节的 bit0 为 0 代表单播地址,即数据帧只发送给一个特定的接收方;为 1 代表组播地址,数据帧会发送给一组接收方。
三、ARP 地址解析协议
ARP(地址解析协议)用于将 IP 地址解析为 MAC 地址,其数据报格式如下:
| 以太网首部 | 14 字节 | 包含目标 MAC 地址、源 MAC 地址和类型字段,与以太网帧的首部格式一致,用于在以太网中传输 ARP 数据报。 |
| 硬件类型 | 2 字节 | 表示硬件地址的类型,如以太网的硬件类型为 1。 |
| 协议类型 | 2 字节 | 表示要解析的协议地址类型,如 IP 协议的类型为 0x0800。 |
| MAC 地址长度 | 1 字节 | 表示 MAC 地址的长度,通常为 6 字节。 |
| 协议地址长度 | 1 字节 | 表示协议地址(如 IP 地址)的长度,通常为 4 字节。 |
| OP(操作码) | 2 字节 | 表示 ARP 操作的类型,1 代表 ARP 请求,即发送方请求获取目标 IP 地址对应的 MAC 地址;2 代表 ARP 应答,即接收方回复发送方其 IP 地址对应的 MAC 地址。 |
| 源 MAC 地址 | 6 字节 | 发送方的 MAC 地址。 |
| 源 IP 地址 | 4 字节 | 发送方的 IP 地址。 |
| 目标 MAC 地址 | 6 字节 | 目标的 MAC 地址,在 ARP 请求中可能为全 0(表示未知),在 ARP 应答中为正确的目标 MAC 地址。 |
| 目标 IP 地址 | 4 字节 | 要解析的目标 IP 地址。 |
补充说明:
- MAC 地址长度和 IP 地址长度通常分别为 6 和 4 字节,这是根据常见的以太网和 IP 协议的地址格式确定的。
- OP 字段明确了 ARP 操作的具体类型,是 ARP 请求还是 ARP 应答,决定了数据报的处理方式。
四、IP 地址分类
IP 地址由网络地址和主机地址两部分组成,根据其开头和取值范围,可以分为以下几类:
| A 类 | 0 | 1~126 | 1.0.0.0 - 126.255.255.255 | 255.0.0.0 | 给规模特别大的网络使用,网络数量较少,但每个网络可容纳的主机数量很多。 |
| B 类 | 10 | 128~191 | 128.0.0.0 - 191.255.255.255 | 255.255.0.0 | 给一般的中型网络,网络数量适中,每个网络可容纳的主机数量也适中。 |
| C 类 | 110 | 192~223 | 192.0.0.0 - 223.255.255.255 | 255.255.255.0 | 给小型网络,网络数量较多,但每个网络可容纳的主机数量相对较少。 |
| D 类 | 1110 | 224~239 | 224.0.0.0 - 239.255.255.255 | - | 用于多点广播(组播),可以将数据发送给一组特定的主机。 |
| E 类 | 11110 | 240~255 | 240.0.0.0 - 255.255.255.255 | - | 保留用于实验和研究,目前尚未广泛使用,也可用于广播地址。 |
其他相关说明:
- 主机号全为 0 表示本网络本身,例如对于 A 类网络 1.0.0.0,这里的主机号全为 0,代表整个 1 号网络。主机号全为 1 表示本网络广播地址,如 1.255.255.255 就是 1 号网络的广播地址,该地址的数据包会发送给网络中的所有主机。
- 127.0.0.0 是环路自检地址,表示任意主机本身,用于本地主机的自我测试和通信,如 ping 127.0.0.1 可以测试本地网络协议栈是否正常。
- 0.0.0.0 表示本网络的本主机,常用于主机在启动时还未获取到具体 IP 地址的情况,作为临时的源地址。
- 专用地址:A 类:10.0.0.0—10.255.255.255,B 类:172.16.0.0—172.31.255.255,C 类:192.168.0.0—192.168.255.255。这些专用地址在局域网中使用,不会在公网中路由,避免了 IP 地址冲突和安全问题。
- IP 地址与子网掩码相与得到网络号,通过子网掩码可以确定 IP 地址中哪些位是网络地址,哪些位是主机地址,从而实现子网划分和网络管理。
五、TCP 与 UDP 的区别
TCP(传输控制协议)和 UDP(用户数据报协议)是传输层的两种重要协议,它们在多个方面存在明显差异:
| 面向连接,需要三次握手建立连接,四次挥手关闭连接,确保连接的可靠性和稳定性。 | 不需要建立连接,直接发送数据报,适用于对实时性要求高、对数据可靠性要求相对较低的场景。 |
| 提供无差错、不丢失、不重复,且按序到达的数据传输服务,通过序列号、确认应答、重传机制等保证数据的准确性。 | 不保证数据可靠、按序到达,可能会出现数据丢失、重复或乱序的情况,但传输效率高,延迟低。 |
| 面向字节流,将应用层的数据看作连续的字节流进行传输,适合传输大量数据,如文件传输。 | 面向报文,每个 UDP 数据报都是独立的报文,不考虑数据的连续性,适合传输少量数据,如 DNS 查询请求。 |
| 有拥塞控制机制,通过慢开始、拥塞避免、快重传、快恢复等算法,根据网络拥塞情况调整发送速率,不会使源主机的发送速率过高导致网络拥塞。 | 没有拥塞控制机制,发送方以固定的速率发送数据,可能会在网络拥塞时加剧网络负担。 |
| 连接只能是点到点的,即一个发送方对应一个接收方,适用于一对一的通信场景。 | 支持一对一,一对多,多对一和多对多的交互通信,如组播和广播通信可以使用 UDP 协议。 |
| 首部开销 20 字节,包含源端口号、目的端口号、序列号、确认号、控制位等信息,用于实现可靠传输和连接管理。 | 首部开销小,只有 8 个字节,包含源端口号、目的端口号、长度、校验和等信息,减少了数据传输的额外开销。 |
| 常见应用协议有 ftp、telnet、http、https、SMTP、POP3 等,这些应用对数据的可靠性要求较高。 | 常见应用协议有 DNS、DHCP、tftp、IGMP、RTP 等,这些应用更注重实时性和传输效率。 |
六、ICMP 协议
ICMP(网际控制报文协议)是因特网的标准协议,属于 IP 层的协议,其主要作用是允许主机或路由报告差错情况和提供有关异常情况的信息。
Ping 包的工作过程(以同一个局域网中为例)
- 应用层发起请求:Pc1 在应用层发起一个目标 IP 为 IP2 的 Ping 请求。Ping 命令是基于 ICMP 协议的,用于测试网络的连通性。
- 传输层处理:传输层接到上层请求的数据,将数据分段并加上 UDP 报头(实际上 Ping 使用的是 ICMP 协议,这里表述可能有误,应为添加 ICMP 报头)。然后下传到 Internet 层(网络层)。
- 网际层封装:网际层接收来自上层的数据后,根据 ICMP 协议进行封装,添加 PC1 的 IP 为源 IP 和 PC2 的 IP 为目标 IP 后封装成数据包。接着下传到网络接口层。
- 网络接口层处理:网络接口层接收数据包后,进行封装,源 MAC 地址为 PC1 的 MAC 地址,目标 MAC 地址则查询自己的 ARP 缓存表获取。如果 PC1 的 arp 缓存表中没有目标 IP 对应的 MAC 地址,则 PC1 发出一个 ARP 广播报文。ARP 报文中源 MAC 地址为 Pc1 的 mac 地址,源 IP 地址为 pc1 的 IP,所要请求的是 PC2 的 IP 对应的 mac 地址。
- 目标主机响应 ARP 广播:PC2 收到 ARP 广播后,进行解封装,发现所请求的 MAC 地址是自己的。则 PC2 将 PC1 的 mac 地址写入 arp 缓存表中。然后向 PC1 发送一个 ARP 应答单播。该单播消息包括目标 IP 为 PC1 的 ip,目标 Mac 为 pc1 的 mac 地址,源 IP 为 PC2 的 IP,源 Mac 为 pc2 的 Mac。
- 发送方获取 MAC 地址并封装数据帧:Pc1 接收到 PC2 的 arp 应答报文后,将 Pc2 的 MAC 地址存入 arp 缓存中,并将 Pc2 的 Mac 地址作为目标地址封装到数据帧中。发给下层进行网络传输。
- 目标主机接收和处理数据帧:PC2 接收这个帧后,在网络接口层查看目标 mac 地址是否指向自己。如果是,PC2 则将帧头去掉,向上层传输。
- 网际层处理数据包:Pc2 网际层接收到这个信息包,查看包头,发现目标 IP 和自己匹配,则解封装,将数据向上层传输。
- 传输层处理 UDP 报文(应为 ICMP 报文):传输层接收来自下层的 Ping 请求的 UDP 报文(应为 ICMP 报文),则去掉 UDP 报头(应为 ICMP 报头),向应用层传送。
- 应用层响应:应用层收到 ping 请求后,发送一个 Ping 回应报文给 PC1,完成一次 Ping 操作的往返过程。
七、TCP 的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT 的作用
(一)三次握手
- 第一次握手:客户机首先向服务器的 TCP 发送一个连接请求报文段,这个特殊的报文段不含应用层数据,其首部中同步位 SYN 被设置为 1。另外,客户机会随机选择一个起始序号 seq = x(连接请求报文不携带数据,但要消耗一个序号)。此时客户机进入 SYN_SENT 状态,表示已发送连接请求,等待服务器的确认。
- 第二次握手:服务器的 TCP 收到连接请求报文段后,如果同意建立连接,就向客户机发回确认,并为该 TCP 连接分配 TCP 缓存和变量。在确认报文段中,SYN 和 ACK 位都被设置为 1,确认号字段值为 ack = x + 1,并且服务器随机产生起始序号 seq = y。确认包同样不包含应用层数据。此时服务器进入 SYN_RCVD 状态,表示已收到客户机的连接请求并发送了确认,等待客户机的再次确认。
- 第三次握手:当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量。这个报文段的确认为 ACK 被设置为 1,序号段被设置为 seq = x + 1,确认号字段 ack = y + 1。该报文段可以携带数据,如果不携带数据则不消耗序号 。此时客户机进入 ESTABLISHED 状态,服务器在收到客户机的确认后也进入 ESTABLISHED 状态。理想状态下,TCP 连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。因为 TCP 提供全双工通信,因此双方任何时候都可以发送数据。
(二)四次挥手
- 第一次挥手:客户机打算关闭连接,就向其 TCP 发送一个连接释放报文,并停止再发送数据,主动关闭 TCP 连接。该报文段的 FIN 标志位被设置为 1,seq = u,它等于前面已经发送过的数据的最后一个字节的序号加 1。此时客户机进入 FIN_WAIT_1 状态,表示已主动发起连接释放请求,等待服务器的确认。
- 第二次挥手:服务器收到连接释放报文段后即发出确认,确认号是 ack = u + 1,序号为 v,等于它前面已经发送过的数据的最后一个字节序号加 1。此时客户机到服务器这个方向的连接就释放了,TCP 处于半关闭状态。该确认报文 ACK = 1,seq = v,ack = u + 1。客户机收到这个确认后,进入 FIN_WAIT_2 状态,等待服务器发送连接释放报文;服务器此时仍可以向客户机发送数据。
- 第三次挥手:若服务器已经没有要向客户机发送的数据,就通知 TCP 释放连接,此时发出 FIN = 1,确认号 ack = u + 1,序号 seq = w,为已经发送过的数据最后一个字节加 1。确认为 ACK = 1,即 (FIN = 1, ACK = 1, seq = w, ack = u + 1) 。此时服务器进入 LAST_ACK 状态,等待客户机的最后确认。
- 第四次挥手:客户机收到连接释放报文段后,必须发出确认。在确认报文段中,确认位 ACK = 1,序号 seq = u + 1,确认号 ack = w + 1 。此时连接还没有释放掉,必须经过时间等待计时器设置的时间 2MSL(Max Segment Lifetime)后,客户机才进入连接关闭状态,即 CLOSED 状态。服务器在收到客户机的确认后,立即进入 CLOSED 状态。(ACK = 1, seq = u + 1, ack = w + 1)
(此处可插入 tcp 协议图解,如: ,直观展示三次握手和四次挥手的过程及状态变化)
(三)TIMEWAIT 的作用
- 保证 TCP 协议的全双工连接能够可靠关闭:主要是为了确保对方能收到 ACK 信息。如果 Client 直接 CLOSED 了,那么由于 IP 协议的不可靠性或者是其它网络原因,导致 Server 没有收到 Client 最后回复的 ACK。那么 Server 就会在超时之后继续发送 FIN,此时由于 Client 已经 CLOSED 了,就找不到与重发的 FIN 对应的连接,最后 Server 就会收到 RST 而不是 ACK,Server 就会以为是连接错误把问题报告给高层。所以,Client 不是直接进入 CLOSED,而是要保持 2MSL,如果在这个时间内又收到了 server 的关闭请求时可以进行重传,否则说明 server 已经收到确认包则可以关闭。
- 防止已失效的连接请求报文段出现在本连接中:在网络中,可能存在一些延迟的连接请求报文段。如果 Client 不经过 TIMEWAIT 状态直接关闭连接,当新的连接建立时,这些延迟的旧连接请求报文段可能会干扰新连接的正常建立和通信。而经过 2MSL 时间后,旧连接请求报文段在网络中基本已经消失,从而避免了这种干扰。
八、为什么会采用三次握手,若采用二次握手可以吗?
采用三次握手是为了防止失效的连接请求报文段再次传到服务器,因而产生错误。如果由于网络不稳定,虽然客户端以前发送的连接请求已到达服务方,但服务方的同意连接的应答未能到达客户端。则客户方要重新发送连接请求,若采用二次握手,服务方收到客户端重传的请求连接后,会以为是新的请求,就会发送同意连接报文,并新开进程提供服务,这样会造成服务方资源的无谓浪费。
如果只采用一次握手,客户端不知道服务端是否已经收到自己发送的数据,则会不断地发送数据。为了保证服务端能接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。三次握手确保了双方都能确认对方的接收和发送能力,建立起可靠的连接,避免了资源的浪费和连接的错误建立。
九、TCP 拥塞控制
为了更好地对 TCP 进行拥塞控制,因特网建议标准定义了以下四种算法:慢开始,拥塞避免,快重传,快恢复。 首先在 TCP 要求发送端维护两个窗口:
- 接收窗口 rwnd:接收方根据当前缓存大小所许诺的最新窗口值。它反映了接收方的接收能力,发送方发送的数据不能超过接收窗口的大小,否则接收方无法处理。
- 拥塞窗口 cwnd:发送方根据自己估算的网络拥塞程度而设置的窗口值。发送方会根据网络的拥塞情况动态调整拥塞窗口的大小,以控制发送数据的速率。
发送窗口的上限是取这两者的最小值,即发送窗口大小 = min(rwnd, cwnd)。
- 慢开始:TCP 刚连接好时,先令拥塞窗口 cwnd = 1 ,在每次收到一个对新报文段的确认时将 cwnd 加 1。 Cwnd 的大小呈指数增长。例如,初始 cwnd = 1,收到一个确认后 cwnd = 2,再收到一个确认后 cwnd = 4,以此类推。这样可以在连接建立初期,以较小的速率发送数据,避免一下子给网络带来过大的负担。
- 拥塞避免算法:当 cwnd 大于等于慢开始门限 ssthresh 时,cwnd 窗口每次加 1 而不是加倍。当发送方检测到超时事件的发生时,就将慢开始门限设置为当前 cwnd 的一半,同时将 cwnd 设置为 1。 这样的目的是迅速减少主机发送到网络的分组数,使得发生拥塞的路由器有足够的时间把队列中积压的分组处理完毕。例如,当 cwnd 增长到 ssthresh 时,开始进入拥塞避免阶段,cwnd 缓慢增加,若发生超时,则降低发送速率,重新开始慢开始过程。
- 快重传:当发送方连续收到三个重复的 ACK 报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。这样可以更快地恢复丢失的数据,提高传输效率,减少网络拥塞的持续时间。
- 快恢复:当发送端收到连续三个冗余的 ACK 时,就执行“乘法减小”算法,把慢开始门限 ssthresh 减半,cwnd 设置为慢开始门限减半后的数值(与慢开始不同)。然后开始执行拥塞避免算法,使 cwnd 缓慢增加。快恢复算法避免了慢开始时的指数增长,在网络拥塞不太严重的情况下,能够更快地恢复到正常的传输速率。
十、TCP 滑动窗口与回退 N 帧协议
- 滑动窗口:发送方都维持一组连续的允许发送的帧的序号称为发送窗口。同时接收方也维持一组连续的允许接收的帧序号,称为接收窗口。发送窗口是用来对发送方进行流量控制,接收窗口是用来控制接收哪些数据帧、不可以接收哪些帧。
- 在发送端,收到一个确认帧,发送窗口就向前滑动一个帧位置,当发送窗口没有可以发送的帧时,发送方就停止发送。直到接收方发送的确认帧使发送窗口向前移动。例如,发送方初始发送窗口包含帧 1、2、3、4,当收到帧 1 的确认后,发送窗口向前滑动,变为包含帧 2、3、4、5。
- 在接收端,只有收到数据帧的序号落在接收窗口内才将该帧收下,否则一律丢弃。每收到一个帧后就发送回确认帧。如果收到的帧序号不在接收窗口内,接收方会发送重复的确认帧,指示发送方重发相应的帧。
- 后退 N 帧协议:发送窗口大于 1,接收窗口等于 1。在后退 N 帧中,发送方不需要收到上一帧的 ACK 后才能发送下一帧,而是可以连续发送帧。当接收方检测出失序信息帧后,要求发送方重发最后一个正确接收的帧之后的所有未被确认的帧。源站每发完一帧就要为该帧设置超时计时器,如果在超时时间内没有收到确认帧则进行重发。服务端会采用累积确认的方式,不是每个帧都发确认,可以连续收到好几个正确帧后发回一个确认信息。接收方因为窗口为 1,所以必须按序接收数据帧,如果某个序大于当前所期望的序号时就会连续发送 3 个 ACK 确认帧,要求客户端重传失序帧。例如,发送方发送了帧 1、2、3、4、5,接收方正确收到了帧 1、2,但帧 3 丢失,当收到帧 4 时,由于帧 3 未收到,接收方会连续发送 3 个对帧 2 的 ACK 确认帧,指示发送方重发从帧 3 开始的所有帧。
十一、TCP 的可靠性如何保证
在 TCP 的连接中,数据流必须以正确的顺序送达对方。TCP 的可靠性是通过以下多种机制来实现的:
- 顺序编号和确认(ACK):TCP 在开始传送一个段时,为准备重传而首先将该段插入到发送队列之中,同时启动时钟。其后,如果收到了接受端对该段的 ACK 信息,就将该段从队列中删去。如果在时钟规定的时间内,ACK 未返回,那么就从发送队列中再次送出这个段。通过为每个数据段分配唯一的序号,并要求接收方返回确认信息,发送方可以确保数据段被正确接收,并且可以重发丢失或未确认的数据段。
- 握手与断开机制:TCP 通过三次握手建立可靠的连接,确保双方都准备好进行数据传输,并且能够同步序列号等信息。在连接关闭时,通过四次挥手过程,确保双方都完成数据传输并安全地关闭连接,避免数据丢失或混乱。
- 分包、重组:TCP 将应用层的数据分割成合适大小的段进行传输,并在接收端将这些段重新组装成原始的数据。在分包和重组过程中,通过序号和确认机制保证数据的完整性和顺序性。
- 重传机制:除了超时重传(在规定时间内未收到确认则重传),还有快重传机制。当发送方连续收到三个重复的 ACK 报文时,直接重传对方尚未收到的报文段,加快了丢失数据的恢复速度,提高了可靠性。
- 流量控制:通过接收窗口(rwnd)机制,接收方可以告诉发送方自己当前能够接收的数据量,发送方根据接收窗口的大小调整发送速率,避免发送过快导致接收方缓冲区溢出,从而保证数据的可靠接收。
- 拥塞控制:如前面所述的慢开始、拥塞避免、快重传、快恢复算法,TCP 能够根据网络的拥塞情况动态调整发送速率,避免网络拥塞导致的数据丢失和传输延迟,保证了在不同网络条件下的数据可靠传输。
而 UDP 主要是面向不可靠连接的,不能保证数据正确到达目的地,它没有这些复杂的可靠性保证机制,适用于对实时性要求高但对数据准确性要求相对较低的场景。
#牛客激励计划#一些八股模拟拷打Point,万一有点用呢

查看4道真题和解析