嵌入式之计算机网络篇(七)

七、计算机网络

1.说说计算机网络五层体系结构

计算机网络的五层架构包括应用层、传输层、网络层、数据链路层和物理层。

  1. 应用层:是网络结构中的最高层,负责向用户提供网络服务,如文件传输、电子邮件、远程登录等。常见的应用层协议有HTTP、FTP、SMTP等,这些协议规定了应用程序接收的数据格式,使应用程序能够解析数据并呈现到页面上供用户观看。
  2. 传输层:负责在源主机和目的主机之间提供端到端的数据传输服务,并解决诸如主机地址、端口号、数据传输状态等问题。常见的传输层协议有TCP和UDP。
  3. 网络层:负责在多个主机之间传送数据包,并为分组交换提供路由选择功能。网络层协议能够确保数据包在网络中正确传输,并选择合适的路径到达目的地。
  4. 数据链路层:负责在物理层的传输介质上传送数据帧,并在源主机和目的主机之间建立逻辑链路。数据链路层通过帧的形式来传输数据,确保数据在传输过程中的完整性和可靠性。
  5. 物理层:负责传输比特流的硬件部分,包括各种传输介质(如铜线、光纤、无线信道)和传输设备(如集线器、交换机、路由器)。物理层为数据传输提供物质基础,确保数据能够在不同的网络设备之间顺利传输。

2.请说一下socket网络编程中客户端和服务端用到哪些函数?

1)服务器端函数:

(1)socket创建一个套接字

(2)bind绑定ip和port

(3)listen使套接字变为可以被动链接

(4)accept等待客户端的链接

(5)write/read接收发送数据

(6)close关闭连接

2)客户端函数:

(1)创建一个socket,用函数socket()

(2)bind绑定ip和port

(3)连接服务器,用函数connect()

(4)收发数据,用函数send()和recv(),或read()和write()

(5)close关闭连接

3.网络四层模型

  • 应用层 HTTP/TFTP

  • 传输层 TCP/UDP

  • 网络层 IP/ICMP

  • 网络接口层

4.TCP如何保证可靠性?

(1) 检验和:

通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢弃TCP段,重新发送,TCP在计算检验和时,会在TCP首部加上一个12字节的伪首部。检验和总共计算三个部分:TCP首部、TCP数据、TCP伪首部;

(2) 序列号/确认应答、超时重传:

数据到达接收方之后,接收方会发送一个确认应答,表示已经收到数据段,并且确认序号会说明它下一次需要接收的数据序列号,如果发送方没收到确认应答,那么发送方会进行重发,这个等待时间一般是2 * RTT(往返时间)+一个偏差值,如果一个包多次重发没有收到接收端的确认包,就会强制关闭连接;

(3) 窗口控制与重发控制/快速重传(重复确认应答)

TCP会利用窗口控制来提高传输速度,意思是在一个窗口大小内,不用一定等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值,如果不使用窗口控制,每一个没收到应答的数据都要重发。

5.简述 TCP 滑动窗口以及重传机制

1)滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。滑动可以理解为缓冲区的大小,告诉发送方,自己还能接受多少数据

TCP的滑动窗口解决了端到端的流量控制问题,允许接受方对传输进行限制,直到它拥有足够的缓冲空间来容纳更多的数据。

2)TCP在发送数据时会设置一个计时器,若到计时器超时仍未收到数据确认信息,则会引发相应的超时或基于计时器的重传操作,计时器超时称为重传超时(RTO) 。另一种方式的重传称为快速重传,通常发生在没有延时的情况下。若TCP累积确认无法返回新的ACK,或者当ACK包含的选择确认信息(SACK)表明出现失序报文时,快速重传会推断出现丢包,需要重传。

6.简述 TCP 慢启动

TCP慢启动是传输控制协议(TCP)使用的一种阻塞控制机制,也被称为指数增长期。慢启动机制通过以指数增加的速率增加发送窗口的大小来实现流量控制,旨在避免在建立连接初期因发送大量数据而导致的网络拥塞。

在慢启动过程中,发送方将初始的拥塞窗口大小设置为一个较小的值,例如2个数据包大小。每当发送方成功接收到一个确认,拥塞窗口大小就会加倍,这意味着发送方可以发送更多的数据。然而,当拥塞窗口大小达到一个阈值(通常是网络的带宽延迟乘积)时,发送方将进入拥塞避免阶段,此时发送方将以一个较慢的速率递增拥塞窗口大小,通常是每次收到一个确认就增加一个数据包大小。如果在慢启动或拥塞避免阶段,发送方检测到网络拥塞,例如发生丢包,它将减少拥塞窗口的大小,并重新开始慢启动过程。

7.TCP建立连接和断开连接过程?

三次握手和四次挥手

三次握手目的:是为了确认客户端和服务器都能收发

  1. 客户端向服务器发送一个SYN包,请求建立连接,并包含自身的初始序列号,等待服务器确认;
  2. 服务器收到SYN包后,回复一个ACK应答包表示确认,同时发送一个SYN包,即SYN+ACK包,也包含自身的初始序列号。此时,服务器进入SYN_RECV状态,等待客户端的确认;
  3. 客户端收到服务器的SYN+ACK包后,再次向服务器发送一个ACK确认包,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

在三次握手过程中,客户端和服务器通过交换SYN和ACK包来确认对方的存在和初始序列号,从而建立TCP连接。注意,握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。

四次挥手目的:是为了确认客户端和服务器都结束收发

  1. 客户端向服务器发送一个FIN数据包,提出断开连接的请求,并指定一个序列号。此时,客户端进入FIN_WAIT1状态,等待服务器的确认;
  2. 服务器收到FIN包后,发送一个ACK应答包给客户端,表示已经收到并同意断开连接。此时,客户端进入FIN_WAIT2状态,等待服务器完成数据传输并断开连接;
  3. 服务器在完成数据传输后,向客户端发送一个FIN包,提出自己的断开连接请求;
  4. 客户端收到服务器的FIN包后,回复一个ACK确认包给服务器,然后进入TIME_WAIT状态,等待一段时间后最终关闭连接。而服务器在收到客户端的ACK确认包后,直接关闭连接。

在四次挥手过程中,客户端和服务器通过交换FIN和ACK包来逐步断开连接。这种机制确保了双方都能有序地关闭连接,并释放相关资源,

需要注意的是,在断开连接的过程中,客户端需要等待一段时间(通常是2MSL,即最长报文段寿命的两倍)才能最终关闭连接。这是为了防止已失效的连接请求报文段出现在新连接中,确保TCP连接的可靠关闭。

8.说说 TCP 2次握手行不行?为什么要3次

TCP的二次握手是不足以建立可靠连接的。TCP协议中采用三次握手而非二次握手来建立连接,主要是因为二次握手无法解决以下问题:

  1. 确认双方的通信能力:在二次握手中,只有发起方的序列号得到了确认,而服务器端的序列号得不到确认,因此,二次握手只能确定客户端和服务器之间的连接是单向的,即客户端可以向服务器发送数据,但服务器无法向客户端发送数据。为了确保双方的通信能力正常,需要引入第三次握手,使得客户端能够发送确认信息给服务器,从而确保双方都可以正常发送和接收数据。
  2. 避免历史连接的干扰:二次握手无法防止历史连接的干扰。在网络中,可能存在旧的、失效的连接请求,如果仅采用二次握手,这些旧的请求可能会被错误地认为是新的连接请求,从而导致资源浪费和数据混乱。通过引入第三次握手,可以确保服务器在收到连接请求时能够正确处理,避免重复连接的建立。
  3. 确保数据包的传输和完整性:三次握手通过交换三个不同的数据包来确认双方的序列号和窗口大小,从而确保后续的数据传输是可靠和完整的。如果只有二次握手,那么可能在某些情况下,数据传输的可靠性和完整性无法得到保障。

因此,TCP协议选择使用三次握手来建立连接,以确保数据传输的可靠性、完整性和稳定性。这种设计使得TCP成为一种高度可靠和广泛应用的传输协议。

9.TCP只进行3次挥手可以吗?

如果采用三次挥手来断开TCP连接,可能会导致以下问题:

  • 服务器在发送完ACK应答报文后直接关闭连接,但此时可能还有未处理完的数据或延迟的数据包,这些数据将会丢失。
  • 客户端在发送FIN报文后,没有收到服务器的确认就直接关闭连接,无法保证服务器已经正确接收到关闭请求。

因此,四次挥手是为了更可靠地关闭TCP连接,确保双方都能有序地释放资源并关闭连接。

10.TCP连接和关闭的状态转移

在连接建立阶段,状态转移如下:

  1. CLOSED:这是TCP连接的初始状态,表示尚未开始任何连接;
  2. LISTEN:当服务器端调用listen()系统调用后,它进入LISTEN状态,等待客户端的连接请求;
  3. SYN_SENT:当客户端想要建立连接时,它会发送一个带有SYN标志的TCP报文到服务器,并进入SYN_SENT状态,等待服务器的确认;
  4. SYN_RECEIVED:服务器一旦收到客户端的SYN报文,会发送一个带有SYN和ACK标志的响应报文给客户端,并进入SYN_RCVD状态;
  5. ESTABLISHED:一旦客户端收到服务器的SYN+ACK响应并发送ACK确认报文给服务器,双方都进入ESTABLISHED状态,这时连接已经建立,可以进行数据传输。

在连接关闭阶段,状态转移如下:

  1. FIN_WAIT_1:当一方想要关闭连接时,它会发送一个FIN报文给另一方,并进入FIN_WAIT_1状态,等待对方的确认;
  2. CLOSE_WAIT:当另一方收到FIN报文后,它会发送一个ACK报文进行确认,并进入CLOSE_WAIT状态,等待本地应用层关闭连接;
  3. LAST_ACK:当本地应用层决定关闭连接时,它会发送一个FIN报文给对方,并进入LAST_ACK状态,等待对方对FIN报文的最终确认;
  4. FIN_WAIT_2:发送FIN报文的一方在收到对方的ACK报文后,会进入FIN_WAIT_2状态,等待对方发送FIN报文来关闭连接;
  5. TIME_WAIT:当发送最后一个ACK报文的一方,在发送完报文后会进入TIME_WAIT状态,等待一段时间(通常是2MSL,即两倍的最大段生命周期)以确保对方收到了ACK报文,然后最终进入CLOSED状态;
  6. CLOSED:当连接的所有过程都完成后,双方最终都会进入CLOSED状态,表示连接已经关闭。

11.滑动窗口过小怎么办?

当滑动窗口过小时,可以通过以下方式进行调整:

在TCP协议中,滑动窗口的大小是根据网络拥塞情况动态调整的。当网络出现拥塞时,发送方会减小窗口大小以降低数据发送速率,避免进一步加剧拥塞。相反,当网络负载较轻时,发送方可以增大窗口大小以提高数据传输速率;

具体的调整过程包括慢启动、拥塞避免、快重传与快恢复等机制。慢启动阶段,TCP协议初始设置较小的滑动窗口大小,并随着传输的成功确认逐渐增大窗口大小。拥塞避免阶段,滑动窗口以一定的速率增长,但增长速率更缓慢,以避免引发网络拥塞。当接收方收到失序的数据时,会发送冗余的确认信息给发送方,触发快重传和快恢复机制,在此过程中,发送方将减小滑动窗口大小,以便重新发送丢失的数据,并恢复正常的发送速率。

12.说说三次握手中每次握手信息对方没有收到会怎样?

如果第一次握手消息丢失,那么请求方不会得到ack消息,超时后进行重传,

如果第二次握手消息丢失,那么请求方不会得到ack消息,超时后进行重传,

如果第三次握手消息丢失,那么Server 端该TCP连接的状态为SYN_RECV,并且会根据 TCP的超时重传机制,会等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包,如果重发指定次数之后,仍然未收到 client 的ACK应答,那么一段时间后,Server自动关闭这个连接。

13.简述 TCP 和 UDP 的区别,它们的头部结构是什么样的

TCP协议是有连接的,有连接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束之后也要结束连接,而UDP是无连接的,

TCP首部需20个字节(不算可选项),UDP首部字段只需8个字节,

TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送速率,

TCP是一对一的连接,而UDP则可以支持一对一,多对多,一对多的通信,

TCP面向的是字节流的服务,UDP面向的是报文的服务。

14.简述域名解析过程,本机如何干预域名解析

域名解析的基本过程如下:

  1. 客户机提出域名解析请求,并将该请求发送给本地的域名服务器;
  2. 当本地的域名服务器收到请求后,先查询本地的缓存。如果有该记录项,则直接把查询的结果返回给客户机;
  3. 如果本地的缓存中没有该记录,则本地域名服务器直接把请求发给根域名服务器,根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址;
  4. 本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该记录,则返回相关的下级的域名服务器的地址;
  5. 重复上一步骤,直到找到正确的记录;
  6. 本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。

对于本机如何干预域名解析,以下是一些建议:

  1. 清除浏览器缓存:浏览器有时会缓存域名解析结果,如果缓存的结果有误,可能导致访问问题,因此,清除浏览器缓存可能有助于解决域名解析相关的问题;
  2. 检查并更改DNS设置:用户可以检查电脑或路由器的DNS设置是否正确。如果DNS设置不正确,可能会导致域名解析错误。此时,可以尝试更改DNS设置,然后重新访问网站,看是否能够解决问题;
  3. 更换DNS服务器:如果怀疑当前的DNS服务器存在问题,可以尝试更换为其他的公共DNS服务器,如Google DNS或OpenDNS,然后重新访问网站,看是否能够解决问题;
  4. 检查域名注册信息:域名注册信息的过期或错误也可能导致域名解析问题。用户可以检查域名注册信息是否正确,是否过期,如果有问题,需要及时更新。

15.说说什么是 TCP 粘包和拆包?

TCP粘包和拆包是在网络通信中常见的问题,与数据的发送和接收方式密切相关;

TCP粘包是指发送方发送的多个小数据包被接收方一次性接收的情况,这可能是因为发送方发送数据的速度过快,接收方无法及时处理,从而多个数据包被合并成一个大的数据包一起接收。具体来说,当发送方连续发送多个数据包时,TCP协议可能会将这些数据包打包成一个TCP报文发送出去,这样,接收方在读取缓冲区时,可能会发现原本应该分开读取的数据包粘在了一起;

而TCP拆包则是指发送方发送的一个大数据包被接收方拆分成多个小的数据包接收的情况,这可能是由于网络中的路由器、交换机等设备的限制,导致大的数据包在传输过程中被分割成多个小的数据包,接收方需要能够正确地组装这些小数据包以还原原始的大数据包;

TCP粘包和拆包问题通常与网络状况、数据包大小、发送和接收方的处理速度等因素有关,为了避免这些问题,可以采取一些策略,如设置合适的数据包大小、使用应用层协议来处理数据包的边界等;

总之,TCP粘包和拆包是网络通信中需要注意和处理的问题,以确保数据的正确传输和接收。

16.如何解决粘包和拆包问题

TCP粘包和拆包问题可以通过以下几种方式来解决:

  1. 消息定长:这是一种简单的解决方案,它要求所有的数据包都是固定长度的。这样,接收方就可以按照固定长度来进行接收,从而避免了粘包和拆包问题。然而,这种方法对于不固定长度的数据无法解决粘包和拆包问题。
  2. 消息分隔符:在每个数据包的结尾加上一个特定的分隔符,接收方可以根据这个分隔符来判断每个数据包的结束位置,从而解决粘包和拆包问题。这种方法需要保证分隔符在数据包中不会出现,或者即使出现也不会引起混淆。
  3. 使用定长协议:规定每次发送的数据包都是固定长度,例如每次发送100个字节。如果发送的数据长度不足100字节,则在后面填充空格或者其他特定字符;如果超过100字节,则进行截断处理。这样可以保证每次接收到的数据都是固定长度的,从而解决了TCP粘包和拆包问题。但是,这种方法需要预先约定每次发送的数据包长度,因此不太灵活,无法适应数据长度不固定的情况。

需要注意的是,这些方法并非完美无缺,每种方法都有其适用的场景和局限性。在实际应用中,需要根据具体的需求和网络环境来选择合适的解决方案。同时,对于复杂的数据传输任务,可能需要结合使用多种方法来更好地解决TCP粘包和拆包问题。

17.TCP为什么比UDP可靠

TCP比UDP更可靠的原因主要在于TCP协议设计了一套复杂的机制来保证数据传输的可靠性,具体如下:

  1. 确认应答机制:TCP使用确认应答机制来确保数据包的正确传输。发送方每发送一个数据包,都需要等待接收方的确认应答。只有当收到确认应答后,发送方才会继续发送下一个数据包。这种机制确保了数据的可靠传输,避免了数据的丢失;
  2. 超时重传机制:如果发送方在一段时间内没有收到接收方的确认应答,它会认为数据包已经丢失,并会重新发送该数据包。这种超时重传机制进一步保证了数据的可靠性;
  3. 连接管理:TCP在数据传输前需要进行三次握手来建立连接,确保双方通信的正常。这种连接管理不仅为数据传输提供了通道,还增加了数据传输的可靠性;
  4. 流量控制和拥塞控制:TCP协议通过流量控制和拥塞控制机制,避免了数据传输过程中的丢失和拥塞。流量控制使得发送方可以根据接收方的接收能力来发送数据,避免数据过快发送导致接收方无法处理。而拥塞控制则使得发送方在网络拥塞时能够降低发送速率,从而避免数据的丢失。

相比之下,UDP协议则是一种无连接的协议,它不需要建立连接,也不进行确认应答和重传。因此,UDP在传输数据时可能会出现数据的丢失、乱序等问题,可靠性较差。然而,UDP协议由于其无连接性质和简单性,在某些对实时性要求较高或需要一对多、多对多通信的场景中仍具有优势。

18.什么是HTTP/TFTP

HTTP和TFTP都是网络传输协议。

HTTP,全称Hypertext Transfer Protocol,即超文本传输协议,是用于从WWW服务器传输超文本到本地浏览器的传送协议。它建立在TCP之上,是基于请求与响应范式的、无状态的、应用层的协议。HTTP协议以链接从一个超文本服务器传输到另一个超文本服务器、从一个链接到一个链接从一个资源到另一个资源。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

TFTP则是Trivial File Transfer Protocol的简称,即简单文件传输协议。它用于在客户机与服务器之间进行简单文件传输,提供不复杂、开销不大的文件传输服务。TFTP建立在UDP之上,提供不可靠的数据流传输服务,不提供存取授权与认证机制,使用超时重传方式来保证数据的到达。

总的来说,HTTP和TFTP在网络传输中各有其用,前者主要用于超文本传输,后者则主要用于简单的文件传输。

19.为什么客户端最后还要等待2MSL

客户端在发送最后一个ACK包后,需要等待2MSL(两倍的报文最大生存时间)的原因主要有以下几点:

  1. 确保最后一个ACK包传输成功:在TCP协议中,发送的每个数据包都有一个TTL(Time To Live)属性。当网络发生拥塞时,报文可能会被重传或丢弃。因此,客户端发送最后一个ACK包后,需要等待一段时间以确保这个ACK包已经顺利被服务器接收到并处理完毕。如果等待时间不够,可能由于网络延迟或丢包导致服务器未收到ACK,从而引发不必要的重传或其他问题。
  2. 避免“旧连接”数据混乱:在网络中,可能存在新旧连接使用相同端口和IP地址的情况。如果旧连接的某些信息没有及时清除,就可能产生数据混乱。等待2MSL可以确保旧连接的状态信息完全释放,避免新连接使用到还未完全释放的旧连接资源,从而确保数据传输的正确性和可靠性。
  3. 保证TCP协议的全双工连接可靠关闭:TCP协议要求全双工连接的可靠关闭。等待2MSL是TCP协议关闭连接过程中的一个必要步骤,它确保了连接的双方都能够正确地关闭连接,避免了因连接未完全关闭而导致的各种问题。

20.什么时候用TCP,UDP?

当需要确保数据的完整性和可靠性时,应使用TCP;而当对实时性要求较高且可以容忍少量数据丢失时,可以使用UDP,不过具体的选择应根据应用的需求和网络环境来确定。

21.什么是IP/ICMP?

IP(Internet Protocol)即网际互连协议,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性,实现大规模、异构网络的互联互通,并分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。IP为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。

ICMP(Internet Control Message Protocol)即互联网控制报文协议,是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。这些控制消息主要涉及网络通不通、主机是否可达、路由是否可用等网络本身的消息。虽然ICMP并不传输用户数据,但它对于用户数据的传递起着重要的作用。ICMP协议是一个无连接的协议,它并不提供可靠的数据传输,主要用于在IP网络上进行错误报告和诊断,以便源地址得知数据包传输失败的原因并进行相应的处理。

简而言之,IP协议负责在网络层进行数据包的传输,而ICMP协议则在网络层提供控制和诊断功能,两者共同协作以确保网络数据的正确和高效传输。

22. 什么是字节序 ?

字节序,又称端序或端模式,是字节顺序的一种。在多字节数据类型的值中,字节序用于标示存放顺序。常见的字节序有小端字节序(little-endian)和大端字节序(big-endian)。小端字节序将低序字节存储在起始地址处,即最前面的字节是最低有效字节;而大端字节序则是将高序字节存储在起始地址处,即最前面的字节是最高有效字节,这两种字节序在网络通信和数据存储中都有广泛的应用,理解字节序对于正确处理跨平台数据和网络通信中的数据交换至关重要。

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值