嵌入式网络编程面试题(更新中)

目录

1.项目中如何实现TCP的并发?

2.TCP通信中的三次握手

3. 四次挥手的过程

4.tcp\IP协议分几层?tcp\IP是哪一层?

5.UDP为什么丢包,怎样处理?丢包发生在哪一层?为什么?

6.TCP是同步还是异步?谈谈你对同步异步的理解?

 7.什么是TCP的沾包现象,如何解决?

 8.组播和广播的区别?

 9.阻塞IO和非阻塞IO的区别?

 10.并发和并行的区别?

11. IO复用的原理

12.实现IO多路复用可以使用哪些函数完成

13.select和poll的区别

14.在UDP通信过程中,能否使用connect函数?为什么?有什么好处?

15.OSI7层网络体系结构有哪些?

16.四层网络体系结构?

17.ARP、HTTP、TFTP、IP、UDP、TCP说出全程和所在层?

 18.进程和线程的区别?

19.网络体系架构分层的好处 

20.端口号 


1.项目中如何实现TCP的并发?

答:
在项目中实现 TCP 的并发通常涉及创建多个独立的执行流程来处理同时发起的多个 TCP 连接。常用的方法有以下几种:

1. **多进程**:服务端为每个新的客户端连接创建一个新的进程。这种方法的优点是简单易理解,每个进程独立运行,容错性好。但缺点是进程创建和切换的开销较大,不适合大量并发连接。

2. **多线程**:服务端为每个新的客户端连接创建一个新的线程。相比多进程,多线程的开销较小,因为线程间切换的成本低于进程间切换,共享资源的管理也比较方便。但多线程程序设计相对复杂,需要妥善处理同步和并发问题。

3. **I/O 多路复用**:通过选择性地阻塞在多个 I/O 上,例如使用 select、poll 或 epoll(在 Linux 上)等系统调用,服务器可以在单线程或少量线程中管理多个客户端连接。当某个 I/O 流准备好进行读写操作时,系统会通知服务器程序,从而进行相应的处理。

在实现 TCP 并发时,还需要考虑到负载均衡、资源管理、错误处理等问题,以确保服务器的稳定和性能。选择哪一种方法取决于具体的应用需求、性能要求和开发资源。

2.TCP通信中的三次握手

答:
TCP的三次握手应用于建立连接:
第一次握手:客户端向服务器发送一个SYN包(同步包),其中包含客户端的初始序列号。此时,客户端进入SYN_SEND状态,等待服务器的确认。
第二次握手:服务器收到SYN包后,会确认客户端的SYN(通过发送一个ACK包,其中ack=客户端的序列号+1),同时服务器也会发送一个自己的SYN包,其中包含服务器的初始序列号。这个包通常被称为SYN+ACK包。此时,服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的SYN+ACK包后,会再次发送一个ACK包以确认收到服务器的SYN包(ack=服务器的序列号+1)。发送完这个ACK包后,客户端和服务器都进入ESTABLISHED状态,表示连接已建立成功。
简记:同步包→同步包+应答包→应答包

3. 四次挥手的过程

答:
TCP的四次挥手应用于释放连接,需要进行的四个步骤,具体步骤如下:
第一次挥手:当一方(假设为客户端)决定关闭连接时,它会发送一个FIN(Finish)报文段给对方。
第二次挥手:服务器收到FIN报文段后,会对这个FIN报文段进行确认,然后自己也发送一个ACK报文段。
第三次挥手:服务器在发送完ACK报文段后,会等待所有的数据传输完成,然后发送一个FIN报文。
第四次挥手:客户端收到服务器的FIN报文段后,会对其进行确认,并发送一个ACK报文段给服务器。
简记:FIN包→应答包→FIN包→应答包

4.tcp\IP协议分几层?tcp\IP是哪一层?

答:
TCP/IP 协议模型通常分为四层,这些层次分别是:

1. **网络接口层**:也称为链接层或网络访问层,它负责通过网络媒体发送和接收数据包,包括定义电缆的物理和电气标准。

2. **互联网层**:它主要负责数据包在网络中的传输,确保数据包能够跨越多个网络从源到达目的地。互联网协议(IP)就处在这一层。

3. **传输层**:这一层提供端到端的通信服务,确保数据的成功传输。TCP(传输控制协议)和 UDP(用户数据报协议)都处于这一层。

4. **应用层**:它负责处理特定的应用程序细节,提供了网络服务与最终用户应用程序之间的接口。例如,HTTP、FTP、SMTP 等协议都工作在这一层上。

从协议的名称“TCP/IP”来看,“TCP”指的是传输控制协议,位于传输层;“IP”指的是互联网协议,位于互联网层。因此,“TCP/IP”实际上涉及到模型中的两个不同层次:传输层和互联网层。

5.UDP为什么丢包,怎样处理?丢包发生在哪一层?为什么?

答:
UDP(用户数据报协议)丢包的原因包括:

1. **无连接性**:UDP 是一种无连接的协议,不像 TCP 那样在数据传输之前建立连接。这意味着UDP不保证可靠传输,数据包可能会在传输过程中丢失。

2. **无拥塞控制**:UDP 本身不进行拥塞控制。当网络拥塞时,UDP 继续以相同的速率发送数据包,这可能导致网络设备(如路由器)的缓冲区溢出,从而丢包。

3. **无序传输**:UDP 不保证数据包的顺序,所以数据包到达顺序可能与发送顺序不同,接收方需要处理可能的乱序问题。

4. **无错误校验重传机制**:TCP 有检验和及确认应答机制,并会重传损坏的数据包。而 UDP 只有基本的检验和功能,但不会重传损坏或丢失的数据包。

处理 UDP 丢包的方法包括:

- **应用层重传机制**:在需要可靠性的应用中,可以在应用层实现重传机制。如果在预定的时间内没有收到数据包的应答,发送方可以重发数据包。

- **序列号**:在数据包中引入序列号,以便接收方能够检测到丢包事件,并且能够将乱序到达的数据包重新排列成正确的顺序。

- **冗余数据**:使用前向错误校正(FEC)等技术,在传输数据中加入额外的冗余数据,这样即使某些数据包丢失,接收方也可能恢复出原始数据。

- **调节发送速率**:根据网络的实时状况调整数据的发送速率,避免因网络拥塞造成丢包。

- **使用其他协议**:对于需要高可靠性的应用,可以考虑使用更可靠的协议,如 TCP,或者更先进的协议,例如 QUIC。

- **应用选择重传(Selective Acknowledgment, SACK)**:这是一种在接收端告知发送端只重传丢失的数据包,而不是所有后续数据的机制。

丢包发生在网络层原因:

网络拥堵:当网络中的数据流量超过了网络设备(如路由器或交换机)的处理能力时,这些设备的缓冲区可能会满,导致无法继续接收新的数据包。当缓冲区满时,新到达的数据包将被丢弃。网络拥堵是导致丢包最常见的原因之一。
路由问题:数据包在网络层按照路由算法确定的路径从源头路由到目标。如果路由配置错误或是动态路由算法遇到问题,可能导致数据包被错误地发送到不存在或无法到达的目的地,从而导致丢包。
硬件故障:网络设备的物理损坏或故障也可能导致丢包。例如,路由器的接口损坏,导线问题,或其他硬件故障都可能阻止数据包的正确传输。
链路质量差:无线网络或长距离传输中的信号衰减、干扰、噪声等问题也是导致丢包的常见原因。在这些情况下,数据包在传输过程中可能会变得不完整或损坏,接收端设备无法正确解析这些数据包,导致丢包。
包过大:如果数据包的大小超过了网络中间设备的最大传输单元(MTU),而且数据包没有设定允许分片或者路径上的某个设备不支持分片,那么这个数据包会被丢弃。
安全策略:为了安全考虑,一些网络设备可能配置了包过滤或防火墙规则,用于阻止特定类型的流量。符合这些规则的数据包将被丢弃。

6.TCP是同步还是异步?谈谈你对同步异步的理解?

答:
TCP(传输控制协议)本身在底层是同步的,因为它需要建立连接,在发送方和接收方之间传输数据,并确认数据包已接收。TCP确保数据准确无误地从一个网络端点传递到另一个网络端点。

对于**同步**(Synchronous)来说,它通常指的是操作的发起者必须等待这个操作完成才能继续进行后续的操作。在同步操作中,任务按照它们发生的顺序依次执行,每个任务的完成是下一个任务开始的前提。例如,当你进行网络请求,在得到响应之前,程序将不会执行后续代码,这是同步操作的特点。

而**异步**(Asynchronous)操作则不同,异步意味着操作的发起者不必等待操作完成就可以继续执行后续的操作。在异步执行中,可以启动一个任务,并且在它完成之前就开始执行其他任务。当该任务完成时,程序会在适当的时间处理完成的操作。这种方式允许程序在等待长时间操作(如文件读写、网络请求等)的同时,继续执行其他代码,从而优化程序的整体性能。

系统中的同步和异步操作常常结合起来使用,以实现更高效、可靠的数据处理和通信。应用程序根据不同的需要,可能采用同步或异步模式来处理任务,或者结合使用二者的特点。例如,在一个TCP服务中,尽管TCP协议是同步的,但应用层可以采用异步编程模型来管理多个TCP连接,以提高系统的并发能力和性能。

 7.什么是TCP的沾包现象,如何解决?

答:
TCP的粘包现象(sticky packets phenomenon)是指在使用TCP进行通信时,由于TCP是一个面向字节流的协议,它会将应用程序的数据看作一串无结构的字节流,数据包之间的界限并不是固定的。因此,当发送方连续快速发送多个较小的消息时,TCP可能将它们合并为一个较大的数据包来提高效率,同样,接收方也可能一次性读取并合并多个数据包。这就可能导致接收端不能确定每个数据包的边界,即发生粘包。

解决粘包问题一般有以下几种方法:

1. **消息定界**:为每个消息设置边界,如使用特殊的分隔符或序列来标识消息的开始和结束。接收方在接收数据时,根据这些定界符来分割原始字节流,从而恢复出独立的消息。

2. **固定长度**:每个消息都采用固定的长度,这样接收方就可以在接收到对应长度的数据后进行处理。

3. **消息长度字段**:在消息的开始处添加一个长度字段,这个长度字段指示了整个消息的长度,接收方首先读取长度字段,然后读取相应长度的数据作为一个消息。

4. **组合方法**:在消息开始处既指定消息的长度又包含一些结束符,确保接收方能准确无误地分割消息。

5. **应用层协议设计**:设计实用的应用层协议来处理消息的封包和解包。例如,HTTP、FTP等应用层协议都有自己的处理方式来防止粘包问题。

6. **利用现成的框架和库**:许多网络编程库(如Netty、asyncio等)提供了解决粘包问题的机制,无需手动处理粘包,只需要按库的规定编写逻辑即可。

在应用层实现这些策略可以避免TCP粘包现象,确保数据能够正确、完整地在客户端和服务器之间传输。

 8.组播和广播的区别?

答:
组播(Multicast)和广播(Broadcast)是网络通信中用于发送消息给多个目的地的两种机制:

1. **广播**:
   - 广播是一对所有的通信方式,其中一台主机发送的消息将传送给同一局域网(LAN)上的所有其他主机。
   - 广播消息通常用在没有特定目标的情况下,例如,当新设备加入网络并寻址DHCP服务器以获取IP地址时,它会发送广播消息。
   - 广播地址对于所有设备都是公开和可识别的,就像把信件扔进一个房间让每个人都能拿去阅读。
   - 在广播中,网络中的每台设备即使对消息不感兴趣也会收到消息,这可能导致无用的网络流量和设备处理。

2. **组播**:
   - 组播允许将消息同时发送给一组指定的目的地(即组播组中的主机)。只有加入该组的主机才会接收组播消息。
   - 组播地址仅适用于那些已经表明愿意接收该特定组播组消息的设备。
   - 组播有效地支持了多点传输,仅将消息传递给感兴趣的监听者,这样就减少了网络的拥堵和无效流量。
   - 组播广泛用于流媒体、实时应用和网络服务中,例如视频会议和在线游戏,典型的例子有IGMP(Internet Group Management Protocol)和多播路由。

总结来说,广播是将消息发送给所有人,而组播是将消息仅发送给一组感兴趣的监听者。组播比广播更有效率,因为它减少了不必要的数据传输。

 9.阻塞IO和非阻塞IO的区别?

答:
阻塞IO(Blocking IO)和非阻塞IO(Non-blocking IO)主要区别体现在程序如何等待IO操作完成:

1. **阻塞IO**:
   - 在阻塞IO模型中,当一个IO操作(如读取或写入)开始时,如果数据没有准备好,程序会被挂起(即阻塞),直到数据准备好并且IO操作完成。
   - 在数据准备阶段,程序做不了其他事情,它会等待在那里直到整个IO操作完全完成后才会继续执行。
   - 阻塞IO简化了编程模型,因为在发起IO请求之后,你只需要等待结果,不必担心在这个过程中如何处理其他任务。

2. **非阻塞IO**:
   - 非阻塞IO模型中,IO操作不会导致程序挂起等待。如果数据没有准备好,IO调用会立即返回一个指示数据尚未准备好的状态。
   - 程序可以继续执行后续代码,它可以定期地检查IO操作是否可以进行,或者可以进行其他工作,这样很好地利用了等待时间。
   - 非阻塞IO通常与事件驱动或轮询机制一起使用,程序可以在多个IO操作之间有效地切换,提高了程序的整体效率和响应性。

非阻塞IO更适用于处理高并发情况,尤其在需要同时管理多个连接或者进行多个并行IO操作时。但这种模型编程难度较高,因为要管理和调度多个IO操作,而且可能需要额外的机制(如IO复用或事件通知)来检测IO状态。

 10.并发和并行的区别?

答:
并发(Concurrency)和并行(Parallelism)是计算机科学中两个关键概念,常常用来描述处理多个任务的能力,它们之间有着本质的区别:

1. **并发**:
   - 并发是指一个处理单元(如CPU)在同一时间段内处理多个任务的能力。它更多地关注多任务的交错执行,即任务在单个核心上通过上下文切换实现多任务的“同时”处理。
   - 并发不是真正的同时执行多个操作,而是从宏观角度看,使得每个任务都有机会按顺序执行,从而给用户一种多个任务同时处理的错觉。
   - 并发更多地应用于任务处理的组织和调度上,常用于单核或多核处理器上的任务管理,以提高资源的使用效率和系统的响应速度。

2. **并行**:
   - 并行是指多个处理单元(如多个CPU核心)同时执行多个任务或操作。在并行计算中,每个处理单元都在同一时刻独立地执行不同的任务,实现了真正的同时处理。
   - 并行计算侧重于通过增加计算资源来增加计算速度,适用于有大量计算需要分割执行的场景,如大规模科学计算、图像处理等。
   - 在多核和多处理器系统中,并行计算可以显著提高计算效率和处理速度,特别是对于可以明确分解和独立执行的任务。

简而言之,**并发是任务交错执行**(在单个核心上“同时”处理多个任务),**并行是多个核心同时执行任务**。并发的目的在于充分利用有限的计算资源以提高效率,而并行的目标是通过增加计算资源来减少计算时间。

11. IO复用的原理

 简单来说,IO复用使得一个线程可以监视多个文件描述符,一旦有一个或多个文件描述符就绪(等待读、写或者异常等),该线程即会被唤醒来进行相应的操作。这种机制有效地利用了操作系统提供的非阻塞I/O操作,避免了在等待I/O操作时产生的CPU资源浪费,使得即使是单个线程也能同时处理多个网络连接或文件操作

12.实现IO多路复用可以使用哪些函数完成

  1. select: 最初和最基本的形式。它允许程序监视多个文件描述符,等待一个或多个文件描述符准备好进行I/O操作。当程序调用select()时,操作系统内核检查所有指定的文件描述符,如果没有文件描述符准备好,该调用将阻塞直到至少有一个文件描述符准备好I/O操作或发生超时。

  2. poll: 类似于select,但提供了更丰富的事件描述和没有限制最多可以监视的文件描述符数量。

  3. epoll: 是Linux系统特有的,具有比select和poll更高的效率。它不仅支持较大数量的文件描述符,还提供了更好的扩展性。epoll通过一种称为"事件通知"的方式来跟踪哪个文件描述符已准备好进行I/O操作,与select和poll的主要区别在于,epoll在文件描述符上发生活动时,只会处理那些发生了状态改变的文件描述符,而不是像select或poll那样重新扫描所有的文件描述符。

13.select和poll的区别

 select和poll都是IO多路复用的接口,但是它们在细节方面有所区别:
 

  • 文件描述符限制

    • select:有一个最大文件描述符数量的限制;在UNIX系统中通常为1024。如果需要监视更多的文件描述符,则必须修改系统定义或使用poll
    • poll:没有内置的限制,理论上可以监控更多的文件描述符。
  • 数据结构

    • select:使用三个位图(bitmaps)分别表示读、写和异常,位图的大小限制了能够监视的文件描述符的数量。
    • poll:使用一个数组来存储文件描述符及其关心的事件,每个数组元素都包含一个文件描述符和一个事件掩码。
  • 可扩展性

    • select的位图模型在文件描述符数量增加时,性能会有所下降,特别是每次调用时需要重新传递位图以及内核需要检查整个位图。
    • poll使用的结构体数组可以更灵活地处理大量文件描述符,因为它不要求修改系统设置,并且相关的结构体数组可以根据需求动态管理扩展。
  • 使用简便性

    • select的接口可能更简单一些,因为管理位图比起结构体数组来说,在逻辑上可能更直观。
    • poll由于提供了更直接控制每个文件描述符及其事件的机制,因此在处理复杂场景时通常更有优势。

14.在UDP通信过程中,能否使用connect函数?为什么?有什么好处?

在UDP通信过程中,完全可以使用connect函数。这可能会让一些人感到困惑,因为connect函数通常与TCP连接相关联,而UDP是一个无连接的协议。但实际上,在UDP中使用connect并不会建立一个真正的连接,而是在内部为指定的目标地址和端口设置一个默认的地址。这样做有几个好处:

 
  1. 简化发送过程:一旦调用了connect,之后可以使用send而不是sendto来发送数据报。这意味着不需要每次发送时都提供对方的地址和端口,因为send会自动使用之前connect设置的默认地址。

  2. 错误报告:使用了connect的UDP套接字可以接收到关于目标地址错误的异步错误(例如,目标不可达或端口不可用)。在没有使用connect的情况下,由于UDP的无连接特性,套接字通常无法得知这类错误。

  3. 过滤数据报connect调用后,该套接字只接受来自指定地址的数据报。这就自动过滤掉了其他源地址发送的数据报,提升了数据的安全性。

  4. **可以使用recv**:与send类似,connect之后也可以使用recv来代替recvfrom,不再需要在每次调用时提供地址存储空间。

 

总之,在UDP通信中使用connect主要是为了简化编程接口,以及更好地控制和管理发送和接收的数据。虽然它不建立实际的连接,但却赋予了套接字类似"伪连接"的状态,从而带来了一些实用的优势。

15.OSI7层网络体系结构有哪些?

 答:物理、数据链路层、网络层、传输层、会话层、表示层、应用层

16.四层网络体系结构?

 答:应用层、传输层、网络层、网络接口层

17.ARP、HTTP、TFTP、IP、UDP、TCP说出全程和所在层?

以下是这些缩略词的全称以及它们在OSI(开放系统互连)模型中所处的层:

 
  1. **ARP (Address Resolution Protocol)**:
    • 全称:地址解析协议
    • 所在层:数据链路层
  2. **HTTP (Hypertext Transfer Protocol)**:
    • 全称:超文本传输协议
    • 所在层:应用层
  3. **TFTP (Trivial File Transfer Protocol)**:
    • 全称:简单文件传输协议
    • 所在层:应用层
  4. **IP (Internet Protocol)**:
    • 全称:网际协议
    • 所在层:网络层
  5. **UDP (User Datagram Protocol)**:
    • 全称:用户数据报协议
    • 所在层:传输层
  6. **TCP (Transmission Control Protocol)**:
    • 全称:传输控制协议
    • 所在层:传输层

 18.进程和线程的区别?

进程(Process)和线程(Thread)是操作系统中执行任务的基本单位,但它们之间有几个关键的区别:

 
  1. 资源独立性

    • 进程:是资源分配的独立单位,每个进程有自己独立的地址空间,包括代码、数据和系统资源。不同进程之间的资源是隔离的。
    • 线程:是进程内的一个执行流,线程间共享所属进程的地址空间和资源,如内存、文件句柄等,这使得线程之间的通信和数据交换较为容易。
  2. 通信复杂度

    • 进程:由于资源独立,进程间通信(IPC,Inter-Process Communication)需要特定的机制,如管道、消息队列、信号量等。
    • 线程:通常使用全局变量等直接方式进行通信,由于共享内存空间,这样的通信方式速度更快。
  3. 开销

    • 进程:创建和管理进程需要较大的开销,包括创建独立的内存空间、加载程序等。
    • 續帖̼線09и.创建fr和切换线程的开销较小,因为不需要额外的地址空间和资源分配。
  4. 执行和调度

    • 进程:是操作系统进行资源分配和调度的基本单位。
    • 线程:通常由所属进程进行管理,但在多线程操作系统中,线程也是调度的基本单位。
  5. 独立性

    • 进程:较为独立,一个进程崩溃通常不会直接影响到其他进程。
    • 线程:一个线程的异常通常会影响到整个进程,可能导致进程中的所有线程都无法继续执行。
  6. 系统支持

    • 进程:几乎所有操作系统都支持多进程。
    • 线程:支持真正意义上的线程的操作系统称为多线程操作系统,如Windows、Linux等。
 

总结来说,进程是资源分配和程序运行的独立单位,而线程则是在进程中实际执行计算工作的单位。线程的引入可以提高程序的并发性,降低进程创建和上下文切换的开销。

19.网络体系架构分层的好处 

分层的网络体系结构在设计和实现网络通信协议时带来了很多好处:

 
  1. 模块化设计:分层架构将整个网络通信过程分解成多个较小的部分(层),每个层解决通信过程的一部分问题。这种模块化的设计使得网络的开发、测试和维护更加容易。

  2. 互操作性:不同的网络产品或服务提供商可以专注于开发特定层次的技术。由于层次之间的接口是标准化的,不同厂商的产品可以很容易地协同工作。

  3. 灵活性和可扩展性:当某一层的技术需要更新或替换时,只需修改这一层,而不必改变整个网络架构。这使得网络可以逐渐进化,而不是一次性全面更新。

  4. 简化学习和教学:分层架构使得学习和教授网络原理更加简单。可以逐层地分析和理解网络的工作机制,而不需要一开始就面对全部复杂性。

  5. 故障隔离:当网络出现问题时,可以根据层次架构逐层检查,快速定位故障发生的位置。

  6. 重用性:一层中开发的协议和技术可以在不同类型的网络和不同的应用中重用,提高了资源的利用效率。

  7. 协议独立性:每层可以选择最适合任务的协议进行通信,而其他层可以独立工作,不受选择的协议的限制。

 

分层网络体系结构的经典例子包括OSI模型和TCP/IP模型,这两个模型通过定义清晰的层次和功能,极大促进了网络技术的发展。

20.端口号 

端口号是网络中的一个软件结构,用于帮助区分计算机上运行的不同进程或应用程序的通信。以下是一些关于端口号的关键信息:

 
  1. 用途:在同一台计算机上,不同的网络应用程序可以使用不同的端口号,以便同时接收和发送数据。比如,一个服务器可以同时使用端口80来处理HTTP请求,而使用端口443来处理HTTPS请求。

  2. 范围:端口号是一个16位的数字,其有效范围是0到65535。通常情况下,端口号分为三个区域:

    • 知名端口(Well-known ports):从0到1023,这些端口通常由系统进程或已知的网络服务使用。例如,HTTP使用端口80,HTTPS使用端口443。
    • 注册端口(Registered ports):从1024到49151,这些端口用于特定服务或应用程序,可以向IANA(Internet Assigned Numbers Authority)注册以避免冲突。
    • 动态或私有端口(Dynamic or private ports):从49152到65535,这些端口通常不为任何服务预分配,可以自由使用,通常用于客户端的临时端口。
  3. 类型

    • TCP(Transmission Control Protocol)端口:用于TCP协议的通信,确保数据的完整性和顺序。
    • UDP(User Datagram Protocol)端口:用于UDP协议的通信,传输速度快,但不保证数据的完整性或顺序。
  4. 端口映射(Port forwarding):在NAT(网络地址转换)或防火墙中,端口映射允许外部设备访问内网中特定IP地址上的特定端口服务。

  5. 端口扫描:是网络安全中的一种技术,通过扫描端口来确定哪些服务正在运行,哪些端口是开放的,可能用于安全评估或其他不良用途。

 

每个网络服务在选定端口号时都应当遵循特定的协议和约定,以确保正常的网络交互和通信安全。

  • 34
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值