C++面经 TCP/iP ,进程线程、堆栈

1.进程和线程关系及区别

http://blog.csdn.net/yaosiming2011/article/details/44280797

定义:
  • 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动。进程是系统进行资源分配和调度的一个独立单位。
  • 线程是进程的一个实体,是CPU调度和分派的基本单位,一个进程可以拥有多个线程,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(程序计数器,寄存器,栈),但是它可以与同属一个进程的其他的线程共享进程所拥有的全部资源。
关系:
  • 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程可以并发执行。
线程进程的区别:
  • 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响,而线程只是一个进程中的不同执行路径。
  • 线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间。
  • 对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
线程私有和共享那些资源?进程私有和共享那些资源?
  • 线程私有:线程栈,寄存器,程序计数器
  • 线程共享:堆,地址空间,全局变量,静态变量
  • 进程私有:地址空间、堆栈、寄存器、全局变量
  • 进程共享:进程目录、代码段、公共数据、进程ID
进程PCB
  • 进程id:系统中每个进程有唯一的id,在C语言中用pid_t类型表示,其实就是一个非负整数。
  • 进程的状态,有就绪、运行、挂起、停止等状态。
  • 进程切换时需要保存和恢复的一些CPU寄存器。
  • 描述虚拟地址空间的信息。
  • 描述控制终端的信息。
  • 当前工作目录
  • umask掩码
  • 文件描述符表,包含很多指向file结构体的指针。
  • 和信号相关的信息。
  • 用户id和组id。
  • 会话和进程组。
  • 进程可以使用的资源上限。

2.进程间、线程间通信方式小结

http://blog.csdn.net/Alexlee1986/article/details/21227417

进程:

  • 管道(Pipe)及有名管道(named pipe)
  • 信号(Signal)
  • 报文(Message)队列(消息队列)
  • 共享内存
  • 信号量(semaphore)
  • 套接字(Socket)


  • 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
  • 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
  • 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  • 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
  • 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
  • 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
父子进程

读时共享写时复制!!!

父子相同处:全局变量、.data、.text、堆、栈、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式。

父子不同处:1. 进程ID、 2. fork返回值 3.父进程ID 4.进程运行时间 5.闹钟(定时器) 
6.未决信号集 
这里写图片描述
线程:互斥锁,信号量,临界区

3.进程间调度算法

http://blog.csdn.net/xuzhiwangray/article/details/50564702

  • 时间片轮转调度算法.
  • 先来先服务调度算法
  • 优先级调度算法
  • 高响应比优先调度算法:根据“响应比 = (进程执行时间+进程等待时间)/进程执行时间”这个公式得到的响应比来进行调度。
  • 多级反馈队列调度算法 :将时间片轮转与优先级调度相结合,把进程按优先级分成不同的队列,先按优先级调度,优先级相同的,按时间片轮转。优点是兼顾长短作业,有较好的响应时间,可行性强,适用于各种作业环境。

4.同步与异步的区别

同步,就是实时处理(如打电话),比如服务器一接收到客户端请求,马上响应,这样客户端可以在最短时间内得到结果,但如果多个客户端,或者一个客户端发出的请求很频繁,服务器无法同步处理,就会造成涌塞。

异步,就是分时处理(如收发短信),服务器接收到客户端请求后并不是立即处理,而是等待服务器比较空局的时候加以处理,可以避免涌塞。

对于写程序,同步往往会阻塞,没有数据过来,我就等着,异步则不会阻塞,没数据来我干别的事,有数据来去处理这些数据。

5.堆栈的区别

http://blog.csdn.net/MasterFT/article/details/1711706

程序的内存分配

  • 栈区:由编译器自动分配释放,存放函数的参数值,局部变量的值等。在函数离开其作用域的时候会自动释放内存。
  • 堆区:一般由程序员进行申请内存,并释放内存,如果程序员不释放内存,程序结束的时候可能由操作系统回收。注意:它与数据结构中的堆是两回事,分配方式类似于链表。
  • 全局区:存放全局变量和静态变量,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
  • 文字常量区:常量字符串就是放在这里的。

申请内存后系统的响应

  • 栈:只要栈的剩余空间大于申请的内存空间大小,系统就将为程序提供内存,否则将报异常提示栈溢出。申请效率快。
  • 堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,就会遍历该链表,寻找第一个空间大于申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。申请效率慢。

请求页面置换策略有哪些方式?他们的区别是什么?各自有什么算法解决?

全局和局部;

全局:在整个内存空间置换

局部:在本进程中进行置换

全局:(1)工作集算法(2)缺页率置换算法

局部:(1)最优算法(2)FIFO先进先出算法(3)LRU最近最久未使用(4)时钟算法

LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面! 
LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页!

5.TCP建立连接三次握手和释放连接四次握手

http://blog.csdn.net/guyuealian/article/details/52535294

三次握手:
  • 第一次握手,假设有主机A和主机B,主机A第一次发送请求连接SYN数据包,其中包含了主机A的序列号seq,假设为X。X表明的是传输数据时的第一个数据字节的序号。
  • 第二次握手,主机B接受到请求后,会发回连接确认SYN+ACK数据包。数据包中包括主机B的初始序列号,假设为Y,并且发送了确认好ack为x+1。
  • 第三次握手,主机A收到主机B的确认报文后,还需要继续确认ACK数据包,发送一个序列号seq为x+1,确认号ack为Y+1的报文。

三次握手各自状态: 
CLOSE         LISTEN

SYN_SENT      SYN_RCVD

ESTABLISHED    ESTABLISHED

第三次握手没有收到数据包会发生什么
  • 服务器收到SYN包后发送SYN+ACK数据包,服务器进入SYN_RECV状态。
  • 而这个时候客户端发送ACK给服务器失败了,服务器没办法进入ESTABLISH状态,这个时候肯定不能传输数据的,不论客户端主动发送数据与否,服务器都会有定时器发送第二部SYN+ACK数据包,如果客户端再次发送ACK成功,建立连接。
  • 如果一直不成功,服务器肯定会有超时设置,超时之后会给客户端发RTS报文,进入CLOSED状态这个时候客户端应该也会关闭连接。

同步SYN:

  • 连接建立时用于同步序号。当SYN=1,确认ACK=0时表示:这是一个连接请求报文。
  • 若同意连接,则在响应报文段中使得SYN=1,ACK=1。
  • 因此,SYN=1表示这是一个连接请求或者这是连接接受报文。
  • SYN这个标志位只有在TCP建立连接时才会被置为1,握手完成后就会被置为0。

PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

MTU:网络传输最大报文包。 
MSS:网络传输数据最大值,即最大分段大小。MSS就是TCP数据包每次能够传输的最大数据分段。

Nagle算法

  • 是为了减少广域网的小分组数目,从而减少网络拥塞的出现。
  • 该算法要求一个TCP连接上最多只有一个未被确认的未完成的小分组,在该分组ack达到之前不能发送其他的小分组,tcp需要收集这些少量的分组,并在ack到来时以一个分组的方式发送出去;
  • 其中小分组的定义是小于MSS的任何分组。

延迟ACK

-如果tcp对每个数据包都发送一个ack确认,那么只是一个单独的数据包为了发送一个ack代价较高,所以tcp会延迟一段时间,如果这段时间内有数据发送到对端,则捎带发送ack,如果在延迟ack定时器出发时候,发现ack尚未发送,则立即单独发送;

延迟ACK好处

  • 发送数据的时候将ack捎带发送,不必单独发送ack;
  • 如果延迟时间内有多个数据段达到,那么允许协议栈发送一个ack确认多个报文段
  • 避免糊涂窗口综合症。

当Nagle遇上延迟ACK

  • 如果发送一段数据报过去,这时这端就在等待对面端发送ack包过来,而此时有ack时延,不发送ack,而本端因为要发送的数据长度小于MSS,所以nagle算法起作用,数据并不会立即发送,而是等待对端发送之前数据确认ack;这样的情况下,需要等待对端超时发送ack,然后本段才能发送写好的数据,从而造成时延。

为什么需要三次握手?

  • 因为如果主机A发送了请求连接,但是这个请求报文在某个节点滞留了,延误到达,本来这个报文算是失效的,但是如果此时A发送了第二个请求报文给B,而且B也跟A建立了连接,这个时候B又收到了一个请求报文,就会返回确认连接的报文,假如没有三次握手,这个时候连接就算建立了。
  • 此时,A收到B的确认,但是A知道自己并没有发送建立连接的请求,不会理睬B的这个确认,于是,A就不会发送任何数据,而B这时却以为新的连接建立起来了,一直等待A发送数据过来,此时B的资源就被白白浪费了。但是如果有三次握手的话,B没收到A的确认,就可以知道连接没有建立起来。所以这就是为什么需要三次握手。
  • 为了防止服务器不知道客户端发送过失效的请求连接。
释放连接四次握手:

四次握手过程

  • 第一次握手,假设主机A为客户端,主机B为服务器。关闭客户端到服务器的连接:首先客户端A发送一个FIN,用来关闭客户到服务器的数据传输,然后等待服务器的确认。其中终止标志位FIN=1,序列号seq假设为u。
  • 第二次握手,服务器接收到这个FIN,它发回一个ACK,确认号ack为收到的序号加1,即u+1。
  • 第三次握手,关闭服务器到客户端的连接,也是发送一个FIN给客户端。
  • 第四次握手,客户端收到FIN后,并发回一个ACK确认报文,确认序号ack设置为收到序号加1。这时候就完成四次握手。
  • TCP的一端发起主动关闭,发出最后一个ACK包后,即第三次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,为2MSL,MSL是最大报文生存时间。

四次握手各自状态: 
主动关闭端             被动关闭端口 
FIN_WAIT1 FIN数据包 
                   发送ACK包 进入CLOSE_WAIT 
进入FIN_WAIT2           发送FIN+ACK包 进入LAST_ACK 
进入TIME_WAIT CLOSE 
CLOSE 
          
为什么要等待2MSL

  • 主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重新发送第三次握手的FIN包,主动关闭端接到重发的FIN包就可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才能继续使用。
  • 当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。

为什么TCP释放连接需要四次?

  • 这是由于TCP的半关闭造成的。因为TCP连接是全双工的,即数据可以两个方向上同时传递,所以进行关闭的时候每个方向上都要单独进行关闭。这个单方向的关闭就叫半关闭。当一方完成它的数据发送任务,就发送一个FIN来向另一方通告将要终止这个方向的连接。
  • 注意:发送了FIN只是表示这端不能继续发送数据(应用层不能再调用send发送),但是可以接收数据。
TCP如果两次握手会出什么问题?那三次握手又会造成什么问题?有什么好的解决方法没?

两次握手:客户端发送的连接请求可能在网络中滞留了,如果没有三次握手,可能会再次创建一个连接。

三次握手:引起SYN flood

不断发送同步报文段会因为传输控制模块TCB【处于半连接状态】从而消耗服务器资源

(1)【处理连接和半连接】定时释放监控系中无效的连接

(2)Syn cache技术【处理半连接状态】,接受到的SYN先不创建TCB,而是用一个hash表来表示,当前连接,如果接收到ACK然后再创建TCB

(3)Syn cookie技术【处理连接】通过一个cookie值来确定当前连接是否合法,合法就连接,一般的验证方法是,服务器接受到一个syn包,服务器通过syn产生一个cookie数据作为初始化序列,接收到ACK包时,序列-1就是得到的cookie,然后进行相应的验证。

TCP四次挥手为什么要有TIME_WAIT状态?为什么?

有两个原因:

(1)保证TCP协议全双工连接能够可靠关闭,直接关闭的话,如果服务器没有收到ACK,会重复发FIN。

(2)保证这次连接的重复数据从网络中消失,如果上次的socket和这次的socket处理的程序一样,就会导致这次连接把上次的数据加进来了。

拥塞控制

拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。

对比流量控制:拥塞控制是一个全局的过程,涉及到所有的主机、路由器、以及降低网络相关的所有因素。流量控制往往指点对点通信量的控制。是端对端的问题。

拥塞窗口:

  • 发送方一个动态变化的窗口叫拥塞窗口,拥塞窗口的大小取决于网络的拥塞程度。发送方让自己的发送窗口=拥塞窗口,但是发送窗口不是一直等于拥塞窗口的,在网络情况好的时候,拥塞窗口不断的增加,发送方的窗口自然也随着增加,但是接收方的接受能力有限,在发送方的窗口达到某个大小时就不再发生变化了。

几种拥塞控制的方法: 
慢开始,拥塞避免,快重传,快恢复。

慢开始:

  • 主机开发发送数据报时,如果立即将大量的数据注入到网络中,可能会出现网络的拥塞。慢启动算法就是在主机刚开始发送数据报的时候先探测一下网络的状况,如果网络状况良好,发送方每发送一次文段都能正确的接受确认报文段。那么就从小到大的增加拥塞窗口的大小,即增加发送窗口的大小。

拥塞避免:

  • 是让cwnd缓慢的增加而不是加倍的增长,每经历过一次往返时间就使cwnd增加1,而不是加倍,这样使cwnd缓慢的增长,比慢启动要慢的多。

快重传:

  • 快重传算法要求首先接收方收到一个失序的报文段后立刻发出重复确认,而不要等待自己发送数据时才进行捎带确认。

快恢复:

  • 当发送方连续接到三个确认时,就执行乘法减小算法,把慢开始门限减半,但是接下来并不执行慢开始算法。而是把cwnd设置为ssthresh的一半,然后执行拥塞避免算法,使拥塞窗口缓慢增大。

6.OSI七层协议,TCP/IP四层概念模型

https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E4%B8%83%E5%B1%82%E5%8D%8F%E8%AE%AE/6056879?fr=aladdin

http://blog.csdn.net/guoguo527/article/details/52078962

OSI七层网络层:

  1. 应用层:它是对应应用程序的通信服务的。
  2. 表示层:这一层的主要功能是定义数据格式及加密。
  3. 会话层:它定义了如何开始、控制和结束一个会话,包括对多个双向消息的控制和管理。
  4. 传输层:这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。
  5. 网络层:这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。
  6. 数据链路层:它定义了在单个链路上如何传输数据。
  7. 物理层 :OSI的物理层规范是有关传输介质的特这些规范通常也参考了其他组织制定的标准。连接头、帧、帧的使用、电流、编码及光调制等都属于各种物理层规范中的内容。
OSI七层网络模型TCP/IP四层概念模型对应网络协议
应用层应用层HTTP、TFTP, FTP, NFS, WAIS、SMTP
表示层应用层Telnet, Rlogin, SNMP, Gopher
会话层应用层SMTP、DNS
传输层传输层TCP、UDP
网络层网络层IP、ICMP、ARP、RARP、AKP、UUCP
数据链路层数据链路层FDDI, Ethernet, Arpanet, PDN, SLIP, PPP
物理层数据链路层IEEE 802.1A, IEEE 802.2到IEEE 802.11

7.TCP SYN洪泛攻击的原理及防御方法

http://lib.csdn.net/article/computernetworks/16914?knId=1023

TCB(TCP 传输控制块)是一种包含一个连接所有信息的传输协议数据结构(实际上在许多操作系统中它是用于处理进站(inbound)连接请求的一个队列,该队列保存那些处于半开放(half-open)状态的TCP连接项目,和已建立完整连接但仍未由应用程序通过accept()调用提取的项目)。

一个单一的TCB所占内存大小取决于连接中所用的TCP选项和其他一些功能的实现。通常一个TCB至少280字节,在某些操作系统中已经超过了1300字节。

TCP的SYN-RECEIVED状态用于指出这个连接仅仅是半开连接,请求是否合法仍被质疑。这里值得注意的一个重要方面就是TCB分配空间的大小取决于接收的SYN包——在连接被完全建立或者说连接发起人的返回可达性被证实之前。

处理办法: 
(1)【处理连接和半连接】定时释放监控系中无效的连接

(2)增加TCP backlog队列

(3)减少SYN-RECEIVED的时间

(4)SYN Cookies :Syn cookie技术【处理连接】通过一个cookie值来确定当前连接是否合法,合法就连接,一般的验证方法是,服务器接受到一个syn包,服务器通过syn产生一个cookie数据作为初始化序列,接收到ACK包时,序列-1就是得到的cookie,然后进行相应的验证。

(5)Syn cache技术【处理半连接状态】,接受到的SYN先不创建TCB,而是用一个hash表来表示,当前连接,如果接收到ACK然后再创建TCB

8.TCP/IP是如何实现可靠传输的

http://blog.csdn.net/shawjan/article/details/45117945 
1、应用数据被分割成TCP认为最适合发送的数据块。

2、超时重传:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

3、TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。

4、校验和:TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。

5、TCP的接收端会丢弃重复的数据。

6、流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的我数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP使用的流量控制协议是可变大小的滑动窗口协议。

7、拥塞控制:当网络拥塞时,减少数据的发送。

9.Tcp和udp的使用场景

http://blog.csdn.net/u013777351/article/details/49226101

UDP:面向报文

  • 面向报文的传输方式应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。
  • 因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率,若太短,会使IP太短。

TCP面向字节流

  • 面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传输的数据块太长,TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。

TCP使用场景

  • 当对网络通讯质量有要求的时候,比如整个数据要准确无误的传送给对方,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。
  • 应用:浏览器,用的HTTP
  • FlashFXP,用的FTP
  • Outlook,用的POP、SMTP
  • QQ文件传输

UDP使用场景

  • 当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快。
  • QQ语音
  • 视频
  • 游戏

10.TCP滑动窗口的原理,自己写的话要怎么实现。

11.TCP粘包

https://www.cnblogs.com/qiaoconglovelife/p/5733247.html

处理粘包现象

  • 发送方:对于发送方造成的粘包现象,我们可以通过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭Nagle算法。
  • 接收方:遗憾的是TCP并没有处理接收方粘包现象的机制,我们只能在应用层进行处理。
  • 应用层处理:解决方法就是循环处理:应用程序在处理从缓存读来的分组时,读完一条数据时,就应该循环读下一条数据,直到所有的数据都被处理。

但是如何判断每条数据的长度呢?

  • 途径一:格式化数据:每条数据有固定的格式(开始符、结束符),这种方法简单易行,但选择开始符和结束符的时候一定要注意每条数据的内部一定不能出现开始符或结束符;
  • 途径二:发送长度:发送每条数据的时候,将数据的长度一并发送,比如可以选择每条数据的前4位是数据的长度,应用层处理时可以根据长度来判断每条数据的开始和结束。

12.UDP能否跨局域网,广播,多播,单播

http://www.360doc.com/content/14/1201/16/11800748_429611026.shtml

UDP通过NAT网络地址转化能实现跨局域网。

问题分析: 
  首先,在不同网络点之间,可以分为以下几种情况。 
  1. ClientA在子网,ClientB也在同一个子网 
  2. ClientA在子网,ClientB在外网 
  3. ClientA在一个子网内,ClinetB在另一个子网内。

对于第一种情况,不需要经过路由器的转发,可以直接相互通讯。

对于第二种情况,ClientB对于CLientA是公开的,CLientA对于ClientB是透明的。
ClientA->直接相通->ClientB,ClientB->不能直接想通—>ClientA。换句话说,ClientA都能接受到包涵真正发送者IP的数据包;如果ClientA发送数据包给ClientB,CLientB接受数据包的IP来源并不是ClientA,而已中转站(路由器)的IP。

对于第三情况,两者之间都是相互透明的。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

13.常用端口号,保留端口号。

从0~65535全部是标准端口号。

保留端口号:0~1024号端口是系统端口,65535号端口也是系统保留的。

常用端口号: 
21号,服务FTP(文件传输协议) 
22号,服务SSh(安全shell协议) 
23号,服务Telnet(远程登录协议) 
25号,服务SMTP(简单邮件传输协议) 
53号,服务DNS(域名系统) 
80号,服务HTTP(超文本传输协议) 
110号,服务POP3(邮局协议3代) 
135号,服务Location Service 
161号,SNMP

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值