嵌入式面试专题—通信协议

目录

3.1 TCP/UDP

3.1.1 TCP、UDP的区别 ⭐⭐⭐⭐⭐

3.1.2 TCP、UDP的优缺点⭐⭐⭐

3.1.3 TCP UDP适用场景⭐⭐⭐

3.1.4 TCP为什么是可靠连接⭐⭐⭐⭐

3.1.5典型网络模型,简单说说有哪些;⭐⭐⭐

3.2 三次握手、四次挥手

3.2.1什么是三次握手⭐⭐⭐⭐⭐

3.2.2为什么三次握手中客户端还要发送一次确认呢?可以二次握手吗?⭐⭐⭐⭐

3.2.3什么是四次挥手⭐⭐⭐⭐⭐

3.2.4为什么客户端四次挥手的最后还要等待2MSL?⭐⭐⭐⭐

3.2.5为什么服务端易受到SYN攻击?⭐⭐⭐⭐

3.2.6 为什么建立连接是三次握手,关闭连接确是四次挥手呢?

网络通信补充:

1、I2C总线通信协议⭐⭐⭐⭐⭐

2、UART通信协议(TTL电平)

3、SPI通信协议

4、CAN通信协议

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

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


3.1 TCP/UDP

1UDP协议:用户数据报协议,是一个简单的面向数据报的运输层通信协议UDP是直接发送数据包,这使得 UDP 在发送数据方面更快但是不可靠。

UDP协议的特点:

1无连接、只知道对端的IP和端口号就可以发送,不需要实现建立连接。

2、不可靠:没有确认机制, 没有重传机制。如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息。

3、面向数据报: 应用层交给UDP多长的报文, UDP原样发送既不会拆分,也不会合并。如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个 字节,而不能循环调用10次recvfrom, 每次接收10个字节。所以UDP不能够灵活的控制读写数据的次数和数量。

4、UDP的缓冲区:UDP存在接收缓冲区,但不存在发送缓冲区

2TCP协议:传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立TCP连接,之后才能传输数据。要经过三次握手建立连接,四次挥手断开连接。TCP优点:可靠稳定。缺点:慢、效率低、占用系统资源高,易被攻击。

3.1.1 TCPUDP的区别 ⭐⭐⭐⭐⭐

TCP面向连接UDP是无连接的(发送数据之前是否需要建立连接)

TCP要求的系统资源较多UDP较少

TCP提供可靠的服务。UDP尽最大努力交付,不保证可靠交付

TCP面向字节流UDP是面向数据报文的

TCP连接只能是一对一的通信;UDP支持一对一,一对多,多对一和多对多的交互通信

TCP首部开销20字节;UDP的首部开销小,只有8个字节

3.1.2 TCPUDP的优缺点⭐⭐⭐

TCP优点:稳定可靠,因为有三次握手建立连接,有确认和重传、拥塞控制等机制。

TCP缺点:慢,效率低,占用系统资源高,易被攻击。建立和维护连接需要占用系统CPI、内存等硬件资源,有多种机制消耗大量时间,同时导致TCP容易被人利用。

UDP优点:传输速度快。没有各项可靠的机制。

UDP缺点:不可靠,不稳定。网络传输质量不好,容易丢包

3.1.3 TCP UDP适用场景⭐⭐⭐

TCP应用场景:适合通信质量较高的场景,如http传输、文件传输、电子邮件等,

UDP应用场景:适合通信质量要求不高,速度要求尽量快的场景,如QQ语音,实时视频会议等。

3.1.4 TCP为什么是可靠连接⭐⭐⭐⭐

因为TCP传输具有:

1)确认和重传机制:建立连接时三次握手会同步双方的序列号 + 确认号 + 窗口大小信息,是确认重传、流控的基础。传输过程中,如果Checksum校验失败、丢包或延时,发送端会重传

2)数据排序:TCP有专门的序列号SN字段,可提供数据re-order

3)流量控制:窗口和计时器的使用。TCP窗口中会指明双方能够发送接收的最大数据量

4)拥塞控制:TCP的拥塞控制由4个核心算法组成。

慢启动Slow Start

拥塞避免Congestion avoidance

快速重传Fast Retransmit

快速恢复Fast Recovery

3.1.5典型网络模型,简单说说有哪些;⭐⭐⭐

3.1.6 URI(统一资源标识符)和URL(统一资源定位符)之间的区别⭐⭐

URL 统一资源定位符(Uniform Resource Locator):其实就是我们访问web页面时需要输入的网页地址网址,比如:https://www.google.com/ 就是URL。

URI 统一资源标识符(Uniform Resource Identifier):就是某个网络协议方案表示的资源的定位标识符,比如:https://www.google.com/ 也同样可以说是,在https网络协议下的一个URI。

区别:URL是一个具体的概念,而 URI是一个抽象的概念。URL是 URI的子集。

3.2 三次握手、四次挥手

3.2.1什么是三次握手⭐⭐⭐⭐⭐

TCP三次握手机制

1TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态

2TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。(第一次握手让服务器知道客户端的发送没问题)

3TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该ACK=1SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。(第二次握手让客户端知道服务器的收发都没问题)

4TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。(第三次握手让服务器知道客户端的接收没问题)

5当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

3.2.2为什么三次握手中客户端还要发送一次确认呢?可以二次握手吗?⭐⭐⭐⭐

答:主要是防止已过期或失效的连接请求报文再次传送到服务器,从而产生错误。

比如第二次握手时,经过第一次握手,服务器认为连接已经建立,发送同步确认报文,但是若客户端没有接收到同步确认报文,会认为没连接好。此时客户端会重传连接请求报文,再次建立连接。依次循环导致服务器会有大量无效连接,消耗大量资源,服务器崩溃。三次握手才能确保双向连接不出错。

3.2.3什么是四次挥手⭐⭐⭐⭐⭐

TCP四次挥手机制

1、客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

2、服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

3、客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

4、服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认

5、客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

6、服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

3.2.4为什么客户端四次挥手的最后还要等待2MSL⭐⭐⭐⭐

答:① 为了保证客户端发送的最后一个ACK报文段能够到达服务器,因为这个ACK有可能丢失,从而导致服务器收不到FIN-ACK的确认报文。服务器会超时重传FIN-ACK,接着客户端再重传一次确认,重新启动时间等待计时器。最后客户端和服务器就都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭,一旦这个ACK丢失的话,服务器就无法正常的进入关闭连接状态

② 可以防止已失效的报文段滞留。客户端在发送最后一个ACK之后,再经过2MSL,就可以使本链接持续时间内所产生的所有报文段都从网络中消失。从保证在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器

3.2.5为什么服务端易受到SYN攻击?⭐⭐⭐⭐

答:SYN攻击:即客户端在短时间内伪造大量不存在的IP地址,并向服务器不断发送SYN包(三次握手第一个报文),服务器收到请求进行回复确认,并等待客户端确认,由于源地址不存在,服务器需要不断重发直到超时。伪造的SYN包会长时间占用未连接队列,导致正常的SYN请求因队列满了而被丢弃,进而发生网络拥塞。

3.2.6 为什么建立连接是三次握手,关闭连接确是四次挥手呢?

三次握手时,服务器在LISTEN监听状态下,收到建立连接请求的SYN报文后,二次握手时,服务器会把ACKSYN放在一个报文发送给客户端

但是关闭连接时,服务器收到对方的FIN报文时,仅仅表示客户端不再发送数据,但是服务器还是能接收数据的,而且服务器数据未必发送完了。因此,二次挥手时,服务器将ACKFIN分开发送,先发送确认报文ACK表示请求收到,接着服务器可以立即关闭,也可以发送一些数据后,再发送FIN报文+ACK报文给对方来表示同意关闭连接和释放服务器->客户端的连接,所以多了一次。

网络通信补充:

串行:简单来说就是一次只能做一件事情,而且还得按照顺序依次执行,后面的代码段必须等到前面代码段的任务执行完毕后才能执行。

并行:指的是在同一时刻,任务可以同时开始进行,彼此之间没有依赖关系。整个周期的总耗时取决于耗时最长的那件事情所需的时间。

1I2C总线通信协议⭐⭐⭐⭐⭐

I2C即集成电路总线,是一种两线式串行同步半双工总线。用于连接微控制器及其外围设备。多用于主机和从机在数据量不大且传输距离短的场合下的主从通信。

       I2C总线串行数据线SDA时钟线SCL构成通信线路,既可用于发送数据,也可接收数据。只有一根数据线,属于半双工通信方式。SCL和 SDA均接上拉电阻。因此,当总线空闲时,这两条线路都处于高电平状态。

平常时刻:IIC起始信号SCL是高电平的时候,SDA由高到低的变化。IIC停止信号:SCL是高电平的时候,SDA由低到高的变化。

在发送、接收数据时:当SCL为高电平时,SDA线不允许变化;当SCL线为低电平时,SDA可以任意0,1变化;

起始信号之后,主机开始发送传输的数据,在串行时钟线 SCL 为低电平状态时,SDA 允许改变传输的数据位(1为高电平,0为低电平),在 SCL 为高电平状态时,SDA 要求保持稳定,相当于一个时钟周期传输 1bit 数据。经过 8 个时钟周期后,传输了 8bit 数据,即一个字节。第 8 个时钟周期末,主机释放 SDA 以使从机应答,在第 9 个时钟周期,从机将 SDA 拉低以应答;如果第 9 个时钟周期,SCL 为高电平时,SDA 未被检测到为低电平,视为非应答,表明此次数据传输失败。第 9 个时钟周期末,从机释放 SDA 以使主机继续传输数据,如果主机发送停止信号,此次传输结束。我们要注意的是数据以 8bit 即一个字节为单位串行发出,其最先发送的是字节的最高位。

2UART通信协议(TTL电平)

UART是通用异步收发传输器UART负责处理数据总线和串行口之间的串/并、并/串转换,并规定了帧格式;通信双方只要采用相同的帧格式和波特率,就能在无需时钟信号的情况下,仅用两根信号线(RX TX)就可以完成通信过程,实现全双工传输和接收,因此也称为异步串行通信。UART使用标准的TTL/CMOS逻辑电平(0-5v,0-3.3v,0-2.5v或0-1.8v)来表示数据,1表示高电平,0表示低电平。数据传输速率使用波特率来表示主从机波特率需要设置一致。波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示;

起始位:起始位必须是持续一个比特时间的逻辑0电平,标志传输一个字符的开始,接收方可用起始位使自己的接收波特率与发送方的数据同步。

数据位:可以选择的位数有5678这四个值,这个参数最好为8(一个字节/ASCII字符值)先发送最低位,最后发送最高位

奇偶检验位:奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。

停止位:它一定是逻辑1电平是一个字符数据的结束标志。停止位个数越多,数据传输越稳定,但是数据传输速度也越慢。

空闲位:指从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,必须由高电平来填充。

UART优点:

1、通信只需要两条数据线。

2、无需时钟信号。

3、有奇偶校验位,方便通信的差错检查。

4、只需要接收端和发送端设置好数据包结构,即可稳定通信。

UART缺点:

1、传输速率较低。

2、接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱

3、传输距离有限,数据帧最大支持9位数据。

3SPI通信协议

SPI是全双工同步通信总线可以在同一时间发送和接收数据,通常由一个主模块和一个或多个从模块组成SPI不支持多主机),主模块选择一个从模块进行同步通信,从而完成数据的交换。提供时钟的为主设备(Master),接收时钟的设备为从设备(Slave),SPI接口的读写操作,都是由主设备发起,当存在多个从设备时,通过各自的片选信号进行管理。

       SPI需要4根线:MISO(主设备数据输入,从设备数据输出)、MOSI(主设备数据输出,从设备数据输入)、SCLK时钟信号)和CS/SS从设备使能信号、片选信号)。

其中CS/SS是从芯片是否被主芯片选中的控制信号,只有片选信号为预先规定的使能信号时(低电位),主芯片对此从芯片的操作才有效

SPI主设备和从设备都有一个串行移位寄存器,主设备通过向它的SPI串行寄存器写入一个字节来发起一次传输。SPI数据通信流程可以分为以下几步:

1)主设备发起信号,CS/SS拉低,启动通信

2)主设备通过发送时钟信号,来告诉从设备进行写数据或者读数据操作(采集时机可能是时钟信号的上升沿或下降沿,因为SPI有四种模式,后面会讲到),它将立即读取数据线上的信号,这样就得到了一位数据(1bit)。

3)主机(Master)将要发送的数据写到发送数据缓存区,缓存区经过串行移位寄存器和MOSI信号线将字节一位一位传送给从机,同时主机通过MISO接口将接收到的数据经过移位寄存器一位一位的移到接收缓存区

4)从机(Slave)也将自己的串行移位寄存器中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。

例如,下图主机拉低NSS片选信号,启动通信,并且产生时钟信号,上升沿触发边沿信号,主机在MOSI线路一位一位发送数据0X53,在MISO线路一位一位接收数据0X46。(传输数据与显示数据相反,先低位、后高位。如0X53=0101 0011

SPI优缺点

优点:

(1)无起始位和停止位,因此数据位可以连续传输而不会被中断;

(2)没有像I2C这样复杂的从设备寻址系统

(3)数据传输速率比I2C更高(几乎快两倍);

(4)分离的MISO和MOSI信号线,因此可以同时发送和接收数据;

(5)极其灵活的数据传输,不限于8位,它可以是任意大小的字;

(6)非常简单的硬件结构。从机不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。

缺点:

(1)使用四根信号线(I2C和UART使用两根信号线);

(2)无法确认是否已成功接收数据(I2C拥有此功能);

(3)没有任何形式的错误检查,(如UART中的奇偶校验位);

(4)只允许一个主设备;

(5)没有硬件从机应答信号(主机可能在不知情的情况下无处发送);

(6)没有定义硬件级别的错误检查协议;

(7)与RS-232和CAN总线相比,只能支持非常短的距离

4CAN通信协议

       CAN是半双工异步通信协议,没有时钟信号线来保持信号接收同步。它由CAN_HIGH与CAN_LOW两条信号线组成。在CAN协议中,我们可以挂载多个节点,通过总线来实现节点通讯,与其他协议不同的是,不对节点的地址进行编码,而是对节点的数据内容进行编码。其中节点由一个CAN控制器和一个CAN收发器组成。控制器发送一个信号(01),收发器将这个信号变成差分信号CAN_High-CAN_Low=差分信号)传送到总线中。如果是接收数据:收发器将差分信号转化为01的二进制编码;由于CAN通讯协议并没有时钟信号线,所以各个节点之间要约定好特定的波特率进行通讯,特别的时候我们还需要使用位同步!位同步有两种方式:硬同步和重新同步。

5、面向连接的套接字【TCPSocket通信工作流程

套接字( 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 连接。

6、面向无连接的套接字【UDPSocket通信工作流程

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值