HarmonyOS鸿蒙最全计算机网络基础知识(非常详细)(4),字节跳动运维工程师面试经历

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  1. TCP:Transmission Control Protocol,传输控制协议。⼀个⾯向连接的协议,提供可靠全双⼯字节流(全双工(Full Duplex)是一种通信方式,允许数据同时在两个方向上进行双向传输,即发送端和接收端可以同时发送和接收数据。),使⽤流套接字(流套接字适用于需要可靠数据传输和双向通信的场景,如文件传输、HTTP通信等)。具有消息确认、超时、重传等机制;
  2. UDP:User Datagram Protocol,⽤户数据报协议。⼀个⽆连接协议,使⽤数据报套接字(数据报套接字适用于对实时性要求较高、对数据传输顺序和可靠性要求较低的场景,如音视频传输、DNS查询等),不能保证消息递送⼀定成功;
  3. SCTP:Stream Control Transmission Protocol,流控制传输协议。提供可靠全双⼯⾯向连接的协议。SCTP是多宿的,通信的两端可以涉及多组(IP,端⼝)通信。提供消息服务;(SCTP和TCP的主要区别是SCTP提供了多流和多宿的能力)

(2)网络层协议:

  1. IPv4:Internet Protocol version 4,使⽤32位地址(可用地址有限);
  2. ICMP:Internet Control Message Protocol,⽹络控制消息协议,处理主机和路由之间的消息通信;
  3. IGMP:Internet Group Management Protocol,⽹络组管理协议,⽤于⼴播通信;
  4. ARP:Address Resolution Protocol,地址解析协议,把IPv4地址映射成⼀个硬件地址(MAC地址),⽤于⼴播⽹络;
  5. RARP:Reverse Address Resolution Protocol,反向地址解析协议,把硬件地址(MAC地址)映射成IPv4地址;
  6. IPv6:Internet Protocol version 6,使⽤64位地址(可用地址空间巨大);
  7. ICMPv6:Internet Control Message Protocol version 6,为IPv6协议提供地址解析、⽹络组管理等功能,兼具ICMPv4、IGMP、ARP协议的功能;

(3)数据链路层协议(了解即可):

  1. BPF:BSD packet filter,BSD分组过滤器。提供数据链路层的访问能⼒;(Berkeley内核);
  2. DLPI:datalink provider interface,数据链路提供者接⼝。提供数据链路层的访问能⼒;(SVR4内核);

1.4 TCP/UDP/SCTP协议

面试问题:TCP和UDP协议的区别是什么?

(1)UDP协议:无连接的传输协议,封装应用层数据到一个UDP数据报中,之后再将UDP数据报封装到IP数据报中,发送出去;

1)UDP数据报具有长度(消息长度是用来告诉客户端在读取数据报时的起始和结束),消息长度随着报文传递到对端(而非TCP的流式消息);

2)UDP协议不具备传输的可靠性:不提供确认、序列号、R1TT估算、超时、重传等机制;

  1. 不保证UDP数据报一定到达最终目的地(无对端消息确认机制、超时、重传机制);
  2. 不保证各个UDP数据报到达目的地的先后顺序(无消息序列号);
  3. 不保证UDP数据报只送达一次(无消息序列号);

3)UDP协议是无连接的协议,两端的套接字不具有绑定关系;

  1. 一个UDP客户端可以创建套接字并发送数据报给一个服务器,然后立即使用同一个套接字发送另一个数据报给另一个服务器;
  2. 一个UDP服务端可以使用同一个套接字从若干个不同的客户户端接收数据报;

4)UDP协议是全双工协议;

补充:

数据报(Datagram)和数据流(Stream)是在网络通信中常用的两种数据传输方式,它们有以下区别:

1)数据报(Datagram):

  • 数据报是一种面向无连接的传输方式,每个数据报都是独立的、自包含的数据单元。

  • 每个数据报都有自己的目标地址和源地址,可以独立地通过网络进行传输。

  • 数据报的传输是不可靠的,可能会发生丢包、重复、乱序等问题。

  • 例子:UDP(用户数据报协议)使用数据报传输方式。

2)数据流(Stream):

  • 数据流是一种面向连接的传输方式,数据在发送端和接收端之间建立一个持久的、有序的字节流。

  • 数据流是连续的、无边界的字节序列,没有明确的分割单位。

  • 数据流的传输是可靠的,确保数据的有序、完整和无错误地传输。

  • 例子:TCP(传输控制协议)使用数据流传输方式。

数据报和数据流是两种不同的数据传输方式。数据报是独立的、自包含的数据单元,每个数据报都有自己的目标地址和源地址,传输是不可靠的。数据流是建立在连接上的持久字节流,传输是可靠的,确保数据的有序、完整和无错误传输。选择使用哪种方式取决于具体的应用需求和通信方式的特点。

(2)TCP协议:有连接协议,基于数据流,会将上层消息封装为多个个分节,每个分节以一个IP数据报发送;

1)TCP协议基于数据流传输,本身没有消息长度;

2)TCP协议保证传输的可靠性(更加可靠,而非100%可靠);

  1. 提供对端消息确认机制:消息发出后等待对端确认,才视作成功;
  2. 提供超时和重传机制:消息发送后,超过一定时间未收到确认,则重发消息;直至成功或者超过指定重试时间;
  3. 提供RTT估算:提供动态估算客户端与服务器之间的RTT(round-triptime)算法,以便知道一次RTT大概耗时;
  4. 提供消息序列号:对个分节提供一个序列号(字节偏移量),以便对端在收到消息时,根据序列号进行消息的排序和去重;
  5. 提供流量控制:提供通告窗口(advertised window)告知对端,当前能够接收多少数据;从而确保发送端发送的数据量不会使接收缓冲区溢出;通告窗口随着消息的接收动态变化,当为0时,表示接收缓冲区已满,需要等待应用从缓冲区读取数据后,才能再次从对端接收数据;即TCP负反馈机制,通过接收端的速率限制发送端的速率;

注:TCP协议并不能保证100%的可靠性,而是在尽可能保证可靠性的前提下,能够让上层感知消息传递的异常;

3)TCP协议是有连接协议,两端必须先建立连接才可以通信;

4)TCP协议是全双工(full-duplex)协议,给定连接上应用可以在任何时刻即发送数据又接收数据;

(3)SCTP协议:有连接协议,提供可靠性、排序、流控、全双工的为数据传送;通过关联(association)表示两端的通信方式,一个连接只涉及两个IP地址间的通信;而一个关联指代两端的第一次通信,但不一定是两个IP地址间的通信;

1)SCTP是面向消息的,有消息长度,各个消息按顺序送达对端(TCP不具有消息长度,依靠上层应用自行设计应用层协议的长度);

2)每个关联包含多个流(连接),单个流上消息丢失,不会阻塞其它流上消息的传输(TCP只具有单个流,会阻塞);

3)SCTP提供多宿特性,即两端能够支持多个IP地址,一个端点可以有多个冗余连接,走不同的基础设施,从而增强应对网络故障的健壮性;

补充

在SCTP(流控制传输协议)中,多流(Multi-Stream)和多宿(Multi-Homing)是其特性之一,提供了更灵活和高效的数据传输能力。

1)多流(Multi-Stream):

  • 多流是指在单个SCTP连接中可以同时传输多个独立的数据流。

  • SCTP允许应用程序在同一个SCTP连接上创建多个逻辑流,每个流都有自己的序列号和传输控制。

  • 多流特性使得应用程序可以将不同类型的数据分组到不同的流中,实现并行传输和优化网络资源利用。

  • 应用程序可以根据需要创建、选择和管理多个流,以满足不同数据流的需求。

2)多宿(Multi-Homing):

  • 多宿是指在SCTP连接中可以同时使用多个网络接口或IP地址进行通信。

  • SCTP允许一个端点(主机)在多个网络接口上绑定多个IP地址,并在通信过程中根据网络状况选择合适的地址进行数据传输。

  • 多宿特性提供了冗余和负载均衡的能力,当一个网络接口或IP地址不可用时,可以自动切换到其他可用的接口或地址。

  • 应用程序可以利用多宿特性提高连接的可靠性和可用性,适应多网络环境下的数据传输需求。

1.5 TCP协议

1.5.1 TCP建链:三次握手

面试问题:什么是TCP的三次握手?过程是怎样的?

TCP建链的⼤致过程如下:

1)被动打开(passive open:服务端调⽤socket、bind、listen 3 个函数,启动监听;

2)主动打开(active open:客户端调⽤connect函数连接服务端:客户端发送SYN分节,告知客户端发送初始序列号;SYN分节不携带数据,故其所在的IP数据报只包含⼀个IP头、⼀个TCP头和可选的TCP选项;

3)服务端发送ACK,确认客户端发来的SYN,同时发送⾃⼰的SYN给客户端,告知服务端发送初始序列号;

4)客户端发送ACK,确认服务端发来的SYN;

注1:服务端在同⼀个分节中发送ACK和SYN;

注2:服务端的初始序列化序列号和客户端的初始化序列号是2个独⽴字段,分别代表各⾃发送的消息序列号;

注3:每次发送SYN,都会携带当前的序列号;每次回复ACK,都会携带下⼀次消息的序列号,即当前序列号+1;

场景举例:好像两个⼈开始电话前,先确认对⽅是否可以听到

Client:你好,可以听到吗?(SYN)

Server:我可以听到,你可以听到吗?(ACK + SYN)

Client:可以听到(ACK)

… …(开始后续谈话)

什么是TCP选项?

TCP建链时,携带的连接控制参数。

TCP_MAXSEG:设置MSS(Max Segment Size),发送SYN时,告知对端可以接受的最⼤分节⼤⼩;即在当前连接中每个TCP分节中可以接受的最⼤数据量,接收SYN的⼀端会据此设置发送分节的 最⼤⼤⼩。通过TCP_MAXSEG设置;

SO_RCVBUF:设置接收缓冲区⼤⼩,据此告知对端通告窗⼝的⼤⼩;

SO_SNDBUF:设置发送缓冲区⼤⼩;

1.5.2 TCP关闭连接:四次挥⼿

⾯试问题:什么是TCP的四次挥⼿?过程是怎样的?

TCP关闭连接的过程:

1)主动关闭(active close):A端调⽤close函数,发送⼀个FIN分节,带序列号,告知B端数据发送完毕;

2)被动关闭(passive close):B端收到FIN后,回复ACK分节给A端;同时将接收数据作为⼀个

EOF(⽂件结束符)传递给上层应⽤,通知上层应⽤数据发送完毕;

3)B端上层应⽤收到EOF后,调⽤close函数,同样发送⼀个FIN分节,告知A端数据发送完毕;

4)A端收到FIN分节后,回复⼀个ACK分节给B端;⾄此两端都已关闭;

注1:之所以要两端都发送FIN,是因为TCP是全双⼯,两端都可能发送数据,因此需要两端都发送FIN,告知对端发送完毕;

注2:每次发送FIN,都会携带当前的序列号;每次回复ACK,都会携带下⼀次消息的序列号,即当前序列号+1;

注3:执⾏完1),2)两步后,被动关闭的⼀端(B端)仍然可以向主动关闭的⼀端(A端)发送数据,此时称为半关闭(half-close);

注4:当⼀个Unix进程⽆论⾃愿的终⽌(调⽤exit或者从main返回)还是⾮⾃愿的终⽌(收到⼀个进程终⽌信号),所有打开的⽂件句柄都会被关闭,这也会导致任何打开的TCP连接上也发送⼀个FIN分     节,告知对端关闭;(内核⾏为,这也是进程挂掉,⽽操作系统未宕机时,对端能够⻢上感知到断链     的原因)

注5:⽆论客户端还是服务端,都可以主动关闭连接(调⽤close函数);

场景举例:好像两个⼈结束电话前,彼此告别

A:我这边没事了,挂电话了(FIN)

B:好的(ACK)

B:我这边也没事了,可以挂电话了(FIN)

A:好的(ACK,谈话结束)

问:为什么三次握⼿时,服务端可以在⼀个分节同时回复ACKSYN。⽽在四次挥⼿中,被动关闭的

⼀端要分两个分节发送ACKFIN

因为TCP是全双⼯的,四次挥⼿时,两端的关闭是独⽴动作,可以各⾃控制是否关闭⾃⼰发送消息的  通道。因⽽分为2组消息(⼀条FIN和⼀条ACK);

补充

1)三次握手在第二步中,服务端可以将ACK和SYN的响应合并在一个分节中发送。这是因为服务端在收到客户端的SYN分节后,已经知道了客户端的初始序列号(ISN),并且服务端也需要发送自己的初始序列号(ISN)给客户端。因此,服务端可以将ACK和SYN的响应合并在一个分节中发送,以减少通信的往返时间(RTT)。

2)因为主动断开连接方在断开连接后能收数据但不能发送数据,此时被动断开连接方还没有断开连接,既能接收数据又能发送数据。被动断开连接方和主动断开连接方可能还有别的需求,因此需要单独执行ACK和SYN

1.6 TCP状态机

⾯试问题:TCP连接有哪些状态?分别有哪些含义?

服务端建链状态机

CLOSED -> LISTEN:服务端调⽤listen函数,被动打开;

LISTEN -> SYN_RCVD:服务端接收SYN,发送SYN + ACK;

SYN_RCVD -> ESTABLISHED:服务端收到ACK,完成建链;

客户端建链状态机

CLOSED -> SYN_SENT:客户端发送SYN;

SYN_SENT -> CLOSED:客户端等待超时,未收到ACK + SYN;

SYN_SENT -> ESTABLISHED:客户端收到ACK + SYN,发送ACK;

主动关闭状态机

ESTABLISHED -> FIN_WAIT_1:A端调⽤close函数,发送FIN,主动关闭连接;

FIN_WAIT_1 -> FIN_WAIT_2:A端收到ACK;

FIN_WAIT_1 -> CLOSING:A端收到FIN,可能是B端同时调⽤了close函数,同时关闭连接;

FIN_WAIT_1 -> TIME_WAIT:A端收到SYN + ACK,回复ACK,表示B端主动建链;

FIN_WAIT_2 -> TIME_WAIT:A端收到FIN,回复ACK;

CLOSING-> TIME_WAIT:A 端 收 到 ACK;

TIME_WAIT-> CLOSED:A端等待2MSL超时;

被动关闭状态机

ESTABLISHED -> CLOSE_WAIT:A端收到FIN,恢复ACK,表示关闭B端到A端连接;

CLOSE_WAIT -> LAST_ACK:A端发送FIN,表示关闭A端到B端连接;

LAST_ACK -> CLOSED:A端收到ACK;

TCP****完整数据收发过程如下:

注1:建链后,服务端对客户端请求的ACK是随着要写的数据⼀起发送的,该过程减少⼀次IO交互,称为捎带发送(piggybacking);捎带发送有时间窗⼝,如果超过该窗⼝,则独⽴发送ACK分组;

注2:关闭连接时,主动关闭的⼀端会经历TIME_WAIT状态,⽽被动关闭的⼀端会经历CLOSE_WAIT   状态;

补充

时间窗口的意思是说,如果当时没有要发送的数据,ACK的发送不会等待太长时间(如果等待时间太长,客户端收不到ACK会超市重传),则独立发送ACK;

如果单独发送和接收⼀个分组,使⽤TCP协议需要⾄少8个分组(3次握⼿+4次挥⼿+1次发送),⽽使⽤UDP协议只需要2个分组(1个请求分组+1个应答分组)。可以看到使⽤UDP⽐使⽤TCP协议,交互过程数据量较少,故⽽性能更好,但也牺牲了可靠性;

1.7 TIME_WAIT状态

⾯试问题:TCP协议中的TIME_WAIT是什么状态?为什么要有该状态?

主动关闭连接的⼀端会经历TIME_WAIT状态,该状态会持续2MSL时⻓后,才变为CLOSED状态; TIME_WAIT建议值为2min,但通常为1~4min;

MSL(Maximum Segment Lifetime):最⻓分节⽣命周期,表示IP数据报能够在⽹络中存活的最⻓时间,超过该时间的IP数据报将被忽略;

跳限(hop limit):每个IP数据报中包含⼀个跳数限制,即该数据报在链路中最⼤可跨过的路由器数,超过该数量,IP数据报会被忽略;跳限字段为8位,故最⼤值为255;

迷途重复分组(lost duplicate)/ 漫游重复分组(wandering duplicate):由于路由异常,⽽徘徊在⽹络中的TCP分节,导致超时后,⼜重复发送了该分节,造成重复;

TIME_WAIT****状态存在的意义:

1)实现可靠的TCP全双⼯连接终⽌:最后⼀个ACK丢失后,可能需要重传,因⽽需要TIME_WAIT状态进⾏中转;

2)允许⽼的重复分节在⽹络中消逝:如果TCP连接断链后,⻢上⼜使⽤相同的IP和端⼝建⽴⼀个连 接,则新建连接有可能收到旧连接的报;为了防⽌这种情况的发⽣,需要在TIME_WAIT状态等待2MSL时⻓,以保证上⼀个连接的包全部消逝后,再启⽤新的连接;

1.8 连接端⼝号

TCP、UDP、SCTP协议,均有端⼝号的概念,都使⽤16位整数表示端⼝号范围;

不同协议之间的端⼝号不存在冲突,故可以同时开启TCP、UDP、SCTP的相同端⼝号;

与服务端指定端⼝建链时,客户端同样需要使⽤⼀个临时端⼝与服务端进⾏通信,该临时端⼝由协议    栈⾃动分配;

套接字对:⼀个TCP的通信链路,包含⼀对套接字(IP+端⼝),是定义两个连接端点的四元组(本地IP地址,本地TCP端⼝号,外地IP地址,外地TCP端⼝号);

常⽤端⼝号范围:

1)0~1023,公共服务的端⼝号,⽐如ssh的端⼝号22;

2)1024~49151,⽤于登记开启的监听端⼝号,⽐如web服务的8080端⼝;

3)49152~65535,⽤于开启临时端⼝号,与服务端进⾏通信;

注:端⼝号的范围根据不同的OS可能不同,⼀般约定1024之前的端⼝为预留端口,不可以⾃由使⽤;

问:⼀个服务端能够承载多少连接,是由什么决定的?

对于客户端⽽⾔在物理层面,由于⼀个Socket连接也被视作⼀个⽂件,故会占⽤⼀个⽂件句柄(客户端侧机器);

逻辑层面,使⽤(协议,源IP,源端⼝,⽬标IP,⽬标端⼝)这个五元组来唯⼀标识⼀个连接,故能够开启的连接多少,取决于五元组中的组合有多少种。

理解误区:由于机器可以开启的端⼝范围总是⼩于65535的,因⽽容易理解为⼀台客户端机器上能够

建⽴到服务器的连接上限,即为可以开启的端⼝数。实际上,端⼝是逻辑概念,建⽴连接的数量,取 决于上述五元组中各个元素取值的组合。

问:假设有固定数量的客户端机器,想要发起上百万个连接,到同⼀个服务器,如何突破端⼝限制?

由于机器数量固定,故(协议,源IP,源端口,⽬标IP,目标端口)五元组中,协议、源IP、⽬标IP即已 固定。而对于同⼀个目标端口(服务器端口),同⼀个客户端机器能够开启的最⼤端口数不会超过65535个,因而想要发起上百万的连接,需要提供多个目标端口(服务器端口),每个端口承担6w多 个客户端连接,突破端口限制。

1.9 TCP数据发送过程(了解)

每个TCP套接字有⼀个发送缓冲区(只有发送缓冲区满了,才会发送数据(如果一个字节一个字节的发送数据,效率较低);就好像往池子里灌水,一瓢一瓢的灌比一滴一滴的灌效率更高),通过SO_SNDBUF选项设置;数据的发送过程如下:

1)TCP层:当应⽤调⽤write时,内核从该应⽤进程的缓冲区中复制所有数据写到套接字的发送缓冲区  中;

2)TCP层:若发送缓冲区⽆法存放全部数据时,则将应⽤进程置于休眠状态,对于阻塞IO,内核将不 从write系统调⽤中返回,直到发送缓冲区腾出空间,应⽤进程所有数据都拷⻉到发送缓冲区中;

注:仅当收到对端的ACK之后,才能够不断清理发送缓冲区中已确认的数据;

3)TCP层:本端TCP以MSS⼤⼩或者更⼩的块,把数据传递给IP层;每个数据块上有⼀个TCP头(20字节);(MSS值由对端MSS选项传递)

4)IP层:给TCP分节安装⼀个IP头,组成IP数据报,并按照⽬的IP地址查找路由表,确定外出接⼝; 之后把数据发送给相应的数据链路,期间IP层可能会对IP数据报分为多个分⽚发送;

5)数据链路层:每个数据链路维护⼀个输出队列,如果队列已满,则新到分组会被丢弃,并沿着协议  栈向上返回错误;TCP层捕获该错误,并尝试重传相应分节;该过程并不会被上层应⽤感知;

注:⼀次write系统调⽤成功返回,仅表示发送缓冲区可以复⽤,并不表示对端已经接收到发送的数据;

1.10 超时重传和快速重传

超时重传(Timeout Retransmission)和快速重传(Fast Retransmission)是在计算机⽹络中⽤于处

理丢失数据包和⽹络拥塞的两种重传机制。

1**)超时重传**

超时重传(Timeout Retransmission)是指发送⽅在发送数据包后设置⼀个定时器,如果在规定的时间内没有收到确认(ACK)或者重复确认(Duplicate ACK),发送⽅会认为该数据包丢失,然后重新发送该数据包。这种机制基于超时的假设,即数据包丢失的原因可能是⽹络拥塞、传输延迟等。超时重传的缺点是它需要等待超时时间才能重传数据包,这会导致⽹络传输效率低下。

行为:如果在超时时间内没有接收到确认,发送⽅会假设该数据包丢失,然后重新发送该数据包。

触发条件:超时重传通常发⽣在⽹络拥塞或传输延迟导致数据包丢失的情况下。

2**)快速重传**

快速重传(Fast Retransmission)是⼀种基于接收⽅的反馈机制的重传机制。当发送⽅发送⼀个数据包后,接收⽅会发送确认(ACK)给发送⽅,表示已经成功接收到该数据包。但是,如果接收⽅收到了⼀个不按顺序的数据包(例如,接收⽅已经收到了数据包5,但是却未收到数据包3,此时会重复确认数据包4,连发3次数据包4后,发送端重传数据包3),接收⽅会发送⼀个重复确认(Duplicate ACK)给发送⽅,指示发送⽅某个数据包丢失。当发送⽅连续收到3次重复确认时,它会⽴即重传相应的数据包,⽽不必等待超时时间。这样可以快速恢复丢失的数据包,提⾼⽹络传输效率。

原理:接收⽅在收到⼀个乱序的数据包后,会发送重复确认(Duplicate ACK)给发送⽅。

行为:发送⽅在连续收到⼀定数量的重复确认时(通常是3个),⽴即重传对应的数据包,⽽不必等待超时。

触发条件:快速重传通常发⽣在⽹络丢包引起数据包乱序的情况下。接收⽅通过发送重复确认来指示发送⽅某个数据包丢失。

总结来说,超时重传是在发送⽅设置的定时器超时后重新发送数据包,⽽快速重传是在接收⽅发送重复确认后⽴即重传数据包。这两种重传机制在不同的情况下使⽤,以提⾼数据传输的可靠性和效率。

1.11 TCP Header结构

技巧:数据传输时间估算

使⽤ping()估算TCP数据传输时间,⼀次ping()使⽤84字节的IP数据报;

假设30次ping()测量的平均RTT时⻓为175ms,且要发送2000字节数据,每次发送40字节,则⼀共发送50次;

每次发送时,除了40字节数据,还包含 20字节的IP Header,20字节的TCP Header,⼀共80字节; 则可以估算发送这2000字节的⼤概耗时为:175ms * 50次 = 8750ms;

1.12 TCP可靠传输

(1)什么是可靠传输?

对于⽹络中的两个节点通信,中间要经过很⻓的链路,期间可能存在很多问题,因⽽我们认为直接在⽹络中传输数据是不可靠的。

所谓可靠,就是数据能够正常、完整、有序的被对端收到。TCP协议依靠如下机制,实现可靠通信:

  1. ACK机制
  2. 序列号机制
  3. 重排机制
  4. 窗⼝机制

补充

在TCP(传输控制协议)的可靠传输中,有两个重要的机制:重排(reordering)和窗口(window)。

1)重排机制:

重排指的是网络中的数据包可能以非顺序的方式到达接收方。这可能是由于网络拓扑、路由选择、拥塞等原因造成的。TCP使用序列号来标识发送的数据包,接收方根据序列号来恢复数据的正确顺序。

当接收方收到乱序的数据包时,它会将这些数据包缓存起来,然后按照序列号对它们进行排序,以确保数据包按正确的顺序交付给上层应用程序。TCP使用接收窗口来管理乱序数据包的缓存和排序。

2)窗口机制:

窗口机制是TCP中的流量控制和拥塞控制的基础。发送方和接收方都有一个窗口大小(window size)的概念。

发送方的窗口大小表示可以发送但尚未收到确认的数据量。发送方根据接收方发送的确认信息来动态调整窗口大小,以控制发送的速率,避免发送过多的数据导致接收方无法及时处理。

接收方的窗口大小表示它能够接收的数据量。接收方通过发送窗口大小信息给发送方,告知发送方它目前的接收能力。发送方根据接收方的窗口大小来控制发送的速率,以避免发送过多的数据导致接收方缓冲区溢出。

窗口机制使得发送方和接收方能够协调数据传输的速率,以适应网络的状况和接收方的处理能力,从而实现可靠的数据传输。

综上所述,TCP通过重排机制和窗口机制来实现可靠传输。重排机制确保接收方能够正确排序乱序的数据包,窗口机制用于流量控制和拥塞控制,确保发送方和接收方之间的数据传输能够合理、高效地进行。

(2)什么是ARQ协议?

ARQ(Automatic Repeat Request)协议是⼀种⽤于可靠数据传输的协议,位于传输层。它是在数据通信中处理和纠正传输错误和丢失数据的⼀种机制。

ARQ协议的主要⽬标是确保数据的可靠传输,通过引⼊ACK****确认超时重传机制 实现这⼀⽬标:

  1. ACK****确认:发送⽅在发送数据包后等待接收⽅的确认;
  2. 超时重传机制:如果发送⽅在⼀定时间内未收到确认,或者接收⽅通知数据包有错误,则发送⽅会重新发送数据包。

ARQ协议主要有3种模式

1)停等 ARQ(Stop-and-Wait  ARQ):发送⽅发送⼀个数据包,然后停⽌等待接收⽅的确认。只有在接收到确认后,发送⽅才发送下⼀个数据包。

2)连续 ARQ(Continuous ARQ):发送⽅连续发送多个数据包⽽不等待每个数据包的确认。接收⽅收到数据包后,发送累积确认,指示已成功接收到⼀系列数据包。如果发送⽅未收到确认或收到确认指示有错误,它将重传相应的数据包。(类似pipeline)

  1. Go-Back-N:在接收⽅发现错误或数据包丢失时,发送⽅会重新发送整个窗⼝中未确认的数据包。
  2. Selective-Repeat(选择重传):在接收⽅发现错误或数据包丢失时,发送⽅只会重传具有问题的数据包,⽽不是整个窗⼝中的所有数据包。

3)反馈 ARQ(Feedback ARQ):接收⽅会周期性地发送确认消息,以指示已成功接收到的数据包。发送⽅会根据接收到的确认信息进⾏重传处理。

注1:停等 ARQ需要逐条处理消息的请求-响应,可能产⽣性能问题,因⽽较少被采⽤;

注2:kafka在应⽤层确保消息传递⼀致性时,也使⽤了类似 Continuous ARQ 和 Feedback ARQ 的实现机制;

(3)Stop-and-Wait ARQ

停等 ARQ 的⼯作原理如下:

1)发送⽅对接收⽅发送数据包,然后等待接收⽅回复ACK并且开始计时;

2)在等待过程中,发送⽅停⽌发送新的数据包;

3)当数据包没有成功被接收⽅接收,接收⽅不会发送ACK。发送⽅在等待⼀定时间后,重新发送数据包;

缺点:⻓的等待时间导致低的数据传输速度;

(4)Go-Back-N

为了克服停等 ARQ 协议⻓时间等待ACK的缺陷,连续 ARQ 协议会连续发送⼀组数据包,然后再等待这些数据包的ACK。

什么是滑动窗⼝?

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!


img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

停等 ARQ 的⼯作原理如下:

1)发送⽅对接收⽅发送数据包,然后等待接收⽅回复ACK并且开始计时;

2)在等待过程中,发送⽅停⽌发送新的数据包;

3)当数据包没有成功被接收⽅接收,接收⽅不会发送ACK。发送⽅在等待⼀定时间后,重新发送数据包;

缺点:⻓的等待时间导致低的数据传输速度;

(4)Go-Back-N

为了克服停等 ARQ 协议⻓时间等待ACK的缺陷,连续 ARQ 协议会连续发送⼀组数据包,然后再等待这些数据包的ACK。

什么是滑动窗⼝?

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!


[外链图片转存中…(img-JbP2xWrz-1715300757656)]
[外链图片转存中…(img-8Z46a28U-1715300757656)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值