【嵌入式面试】2022年嵌入式经典面试题汇总(网络编程)

2023-05-16

📜作者:不想脱发的基兄

📺专栏:《嵌入式面试》

📣格言:天空黑暗到一定程度 星辰就会熠熠生辉。
请添加图片描述

前言

2022年秋招我面试嵌入式MCU开发方向,经过了多场的笔试与面试,在准备的过程中看了非常多的资料,我的汇总的笔记一直写在有道云笔记中,没有分享出来。现在已经到了23年春招了,特此整理后分享出来。资料看过了觉得不错就保存下来了,如果有不对的地方,欢迎批评指正,侵权联删!

1、TCP的三次握手

发生在服务器的 accept —— 客户端的 connect,建立连接自动完成。
(1)第一次握手:客户端主动发送SYN包到服务器,进入SYN_SEND状态,等待服务器确认
(2)第二次握手:服务器接收到SYN包,从LISTEN进入SYN_RCVD状态,给客户端发一条SYN+ACK
(3)第三次握手:客户端收到SYN+ACK包,给服务器回发一条ACK包,这个包发送和接收完,服务器和客户端都处于 ESTAB_LISHED,三次握手完成。
TCP三次握手

TCP三次握手

2、TCP的 四次挥手

发生在 shutdown/close 阶段,主动关闭方(A)是服务器或是客户端,被动关闭方为(B)。
(1)第一次挥手:A发送FIN,用来关闭A->B的数据传输
(2)第二次挥手:B发送ACK,表示关闭确认
(3)第三次挥手:B发送一个FIN,用来关闭B->A的数据传输
(4)第四次挥手:A发送一个ACK,表示确认关闭
TCP四次握手

TCP四次握手

3、以太网Ethernet最大的数据帧是多少字节?

答:1518字节。
1518=14(以太网帧帧头)+4(以太网帧帧尾的CRC校验【循环冗余码校验】)+1500(Data域)。
注:Windows系统中,默认MTU(Maximum transmission unit 最大传输单元)值也是1500字节,但是“不同的接入方式、不同地区的网络运营商、不同的路由器”有着不同的MTU设置。
Data是承载上层协议的数据域,一般最大占1500字节,这个值也称为MTU(最大传输单元 )。

4、TCP数据包每次传输的最大报文长度(MSS)是多少字节?

答:1460字节。
1460(MSS)=1500(MTU)-20(IP头)-20(TCP头)。

5、TCP传输的单个报文最大字节是多少?

答:1448字节。
1448=1500(MTU)-20(IP头)-32(20字节TCP头和12字节TCP选项时间戳)。

6、UDP收包率低/丢包率高的原因?

6.1 缓存太小,不能及时接收数据

在网络编程中,如果连续多个UDP包超过了UDP接收缓冲区大小,就会产生收包率低/丢包率高。具体原因如下:

  • UDP包过大;
  • UDP发包速率过快,突发大数据流量超过了缓冲区上限。

6.2 接收到数据之后处理速度太慢

UDP recvfrom()接收到数据之后处理速度太慢。如果数据接收和处理/渲染是连续进行的,那么可能由于数据处理过慢,就会两次recvfrom调用的时间间隔里发过来的包丢失。

7、UDP由于具用不稳定性质,那么UDP大文件传输丢包解决办法。

答:加延迟接收/发送。

8、谈谈对粘包/拆包的理解。

粘包/拆包发生在TCP传输的数据阶段,TCP协议的底层,不需要考虑上层业务的具体定义,所以数据传输时根据TCP缓冲区的实际情况进行包的划分。在业务层面认为一个完整的包(发送数据包大于缓冲区时),可能会被TCP拆分成多个小包进行发送,也可能把多个小的包封装成一个大的数据包进行发送(短时间发送多个小于缓冲区的小数据包)。

8.1 粘包/拆包解决办法

(1)消息定长,发送方和接收方规定固定大小的消息长度,例如每个报文大小固定为200字节,如果不够,空位补空格
(2)在包围增加特殊字符进行分割,例如FTP协议
(3)自定义协议,将消息分为消息头和消息体,消息头中包含消息总长度,这样服务端就可以知道每个数据包的具体长度了,知道了发送数据包的具体边界后,就可以解决粘包和拆包问题了;

8.2 为什么UDP不会发生粘包/拆包问题?

  • UDP是无连接的,面向消息的,提供高效率服务。不会使用块的合并优化算法(TCP使用了Nagle算法)。
  • UDP支持的是一对多的模式,所以接收端的缓冲区采用了链式结构来缓存每一个到达的数据包,在每个UDP包中就有了消息头(消息来源地址,端口等信息),对于接收端来说,就容易进行区分处理了。
  • 面向消息的通信是有消息边界的。所以udp根本不会粘包,但是会丢数据,不可靠

8.3 TCP粘包/拆包发生的原因

TCP数据流最终发到目的地,需要通过以太网协议封装成一个个的以太网帧发送出去,以太网数据帧大小最小64字节,最大1518字节,除去header部分,其数据payload为46到1500字节。所以如果以太网帧的payload大于MTU(默认1500字节)就需要进行拆包。

9、TCP和UDP适用用于什么场景?

描述TCPUDP
参数数据完整性和准确性较高通信响应度高(实时通信)、安全性和完整性要求较低
场景文件传输、邮件发送与接收、重要状态的更新等网络电话、网络视频、实时通信等

10、TCP和UDP的区别?

10.1 一图胜前言

描述TCPUDP
连接面向连接无连接
阻塞拥塞阻塞
可靠性可靠不可靠‘
数据流字节流报文’
优点可靠的传输方式高效的传输效率

10.2 能说会道

(1)TCP面向连接,通过三次握手建立连接,四次挥手接除连接;UDP是无连接的,即发送数据之前不需要建立连接,这种方式为UDP带来了高效的传输效率,但也导致无法确保数据的发送成功。
(2)TCP是可靠的通信方式。通过TCP连接传送的数据,TCP通过超时重传、 数据校验等方式来确保数据无差错,不丢失,不重复,且按序到达;而UDP由于无需连接的原因,将会以最大速度进行传输,但不保证可靠交付,也就是会出现丢失、重复等等问题。
(3)TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流,由于连接的问题,当网络出现波动时,连接可能出现响应问题;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低。
(4)每一条TCP连接只能是点到点的;而UDP不建立连接,所以可以支持一对一,一对多,多对一和多对多的交互通信,也就是可以同时接受多个人的包。
(5)TCP需要建立连接,首部开销20字节相比8个字节的UDP显得比较大。
(6)TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。

11、UNIX域套接字和网络套接字的区别?

(1)域套接字实现本地进程间通信,域套接字不经过底层网络。
(2)网络套接字是用于不同机器间的进程通信,需要经过底层网络。

12、Linux系统中64位和32位的默认发送缓冲区是多少?(不重要)

获取套接字发送缓冲区与设置套接字发送缓冲区。
(1)64位最小发送缓冲区设置为4608,设置64位系统的发送缓冲区时,输入小于4608/2的会将的发送缓冲区变更为4608,大于4608/2的会将发送缓冲区变更为输入的两倍。
(2)32位最小发送缓冲区设置为4480,设置32位系统的发送缓冲区结论同上。
结论:具体设置的最小发送缓冲区的大小根据不同的系统,最小缓冲区有所区别。

13、什么是带外数据?是TCP还是UDP才能使用带外数据。

(1)带外数据:突破服务器缓冲区下限,紧急信息处理的数据。
(2)只有TCP才有带外缓冲区。

14、带外数据怎么接收?

接收带外数据的方式是带有MSG_OOB的recv接收,可以通过sockfd套接字判断下一个数据是否含有带外数据,可以通过select的返回判断带外数据的到来,也可以通过SIG_URG判断。

15、怎么判断UDP是否是广播?

判断广播地址和接收地址是否一致,从而判断广播。

16、ip+port有什么作用?

IP+port组成你的网络地址。IP就是一个电脑节点的网络物理地址,端口是该计算机逻辑通讯接口。

17、套接字的创建流程是什么?

17.1 面向连接的套接字【TCP】Socket通信工作流程

为了实现服务器与客户机的通信,服务器和客户机都必须建立套接字。服务器与客户机的工作原理可以用下面的过程来描述。
(1)服务器先用 socket 函数来建立一个套接字,用这个套接字完成通信的监听。
(2)用 bind 函数来绑定一个端口号和 IP 地址。因为本地计算机可能有多个网址和 IP,每一个 IP 和端口有多个端口。需要指定一个 IP 和端口进行监听。
(3)服务器调用 listen 函数,使服务器的这个端口和 IP 处于监听状态,等待客户机的连接。
(4)客户机用 socket 函数建立一个套接字,设定远程 IP 和端口。
(5)客户机调用 connect 函数连接远程计算机指定的端口。
(6)服务器用 accept 函数来接受远程计算机的连接,建立起与客户机之间的通信。
(7)建立连接以后,客户机用 write 函数向 socket 中写入数据。也可以用 read 函数读取服务器发送来的数据。
(8)服务器用 read 函数读取客户机发送来的数据,也可以用 write 函数来发送数据。
(9)完成通信以后,用 close 函数关闭 socket 连接。
请添加图片描述

面向连接的套接字通信工作流程

17.2 面向无连接的套接字【UDP】Socket通信工作流程

无连接的通信不需要建立起客户机与服务器之间的连接,因此在程序中没有建立连接的过程。进行通信之前,需要建立网络套接字。服务器需要绑定一个端口,在这个端口上监听接收到的信息。客户机需要设置远程 IP 和端口,需要传递的信息需要发送到这个 IP 和端口上。

18、tcp传输过程中可能会出现什么问题?

粘包和丢包、拆包。

18.1 丢包

A服务器发送数据给B服务器频率过高时,B服务器来不及处理,造成数据丢包。(原因可能是程序逻辑问题,多线程同步问题,缓冲区溢出问题)。

18.2 如何解决丢包的问题

为了满足TCP协议不丢包。TCP协议有如下规定:
(1)数据分片:发送端对数据进行分片,接受端要对数据进行重组,由TCP确定分片的大小并控制分片和重组;
(2)到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认;
(3) 超时重发:发送方在发送分片时设置超时定时器,如果在定时器超时之后没有收到相应的确认,重发分片数据;
(4) 滑动窗口:TCP连接的每一方的接受缓冲空间大小固定,接收端只允许另一端发送接收端缓冲区所能接纳的数据,TCP在滑动窗口的基础上提供流量控制,防止较快主机致使较慢主机的缓冲区溢出;
(5) 失序处理:作为IP数据报来传输的TCP分片到达时可能会失序,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层;
(6) 重复处理:作为IP数据报来传输的TCP分片会发生重复,TCP的接收端必须丢弃重复的数据;
(7) 数据校验:TCP将保持它首部和数据的检验和,这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到分片的检验或有差错,TCP将丢弃这个分片,并不确认收到此报文段导致对端超时并重发。

参考链接

[1]TCP传输的单个报文最大字节(MSS和MTU)
[2]什么是粘包拆包
[3]TCP和UDP的区别及应用场景
[4]经典面试题 TCP和UDP有什么区别?
[5]套接字工作流程
[6]服务器传递文件丢包怎么回事,TCP传输协议中如何解决丢包问题

推荐链接

[1]40 张图带你搞懂 TCP 和 UDP

本栏前文

[1]【嵌入式面试】2022年嵌入式经典面试题汇总(C语言)
[2]【嵌入式面试】2022年嵌入式经典面试题汇总(数据结构)
[3]【嵌入式面试】2022年嵌入式经典面试题汇总(Linux | 文件IO)
[4]【嵌入式面试】2022年嵌入式经典面试题汇总(系统编程)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【嵌入式面试】2022年嵌入式经典面试题汇总(网络编程) 的相关文章

随机推荐