TCP如何保证传输可靠性

全网最详细的 TCP 可靠传输 前置芝士 在讲解 TCP 可靠传输之前,我们先搞清楚什么是 TCP 可靠传输? TCP 可靠传输就是保证接收方收到的字节流和发送方发出的字节流是完全一样的。 那为什么需要 TCP 的可靠传输呢? 由于网络层是没有可靠传输机制的,尽自己最大的努力进行交付。而传输层使用 TCP 实现可靠传输,TCP 保证可靠传输的机制有如下几种: 1)校验和 2)序列号和确认应答机制 3)重传机制 4)滑动窗口 5)流量控制 6)拥塞控制 校验和 所谓 TCP 的校验和(Checksum)就是说:由发送端计算待发送 TCP 报 阅读详情

TCP协议保证传输可靠的方法主要有:校验和,序列号,确认应答,超时重传,连接管理,流量控制,拥塞控制。

(一)校验和:判断传输数据是否出现了修改

   TCP在计算校验和时,会添加一个12个字节的伪首部。其内容为:32位源IP地址,32位目的IP地址,8位保留字节(置零),8位传输层协议号(TCP是6,UDP是17),16位TCP报文长度(TCP首部+数据)。伪首部的作用主要是增加TCP的校验和的检错能力:通过伪首部的目的IP地址来检查TCP报文是否收错了、通过伪首部的传输层协议号来检查传输层协议是否选对了。

检验和的计算:

   发送端将伪首部,TCP报头,TCP数据分为16位的整数,如果总长度为奇数,则在最后添加一个0。把TCP报头中的校验和字段置为0。使用反码相加法(对每16位进行二进制反码求和,结果其实相当于先求和再进行二进制)累加所有的16位整数(进位累加到低位)。最后将校验和存到TCP首部的校验和字段中。

接收端 :将所有原码相加,高位叠加到低位, 如计算结果的16位中每一位都为1,则正确,否则说明发生错误。

校验和实际上是所有16位整数相加后再进行反码,所以所有16位整数相加的结果加上校验和,所有位都是1。

 

注意:如果接收方比对校验和与发送方不一致,那么数据一定传输有误。但是如果接收方比对校验和与发送方一致,数据不一定传输成功。

(二)确认应答与序列号

TCP协议保证数据传输可靠性的机制 TCP协议保证数据传输可靠性的机制(一) 1、确认应答机制 1.1原理: 发送方与接收方传输数据时,为了保证数据一定会发送给接受方,TCP协议规定接受方接收到数据后需要给发送方一个接受到数据的通知,若是发送方没有接收到接受方的确认报文,发送方认为数据没有发送到,就会重新发送数据。 1.2序列号:TCP将每个字节的数据都进行了编号 因为网络传输数据是不能保证传送顺序的,即使是客户端有序的发送数据... 阅读详情

相关推荐

TCP协议中如何保证数据传输的可靠性和效率(上)

本章主要通过一段对话来说明 TCP协作的数据传输过程,主要内容是: 1.丢包问题,怎么知道丢包,丢包了怎么办? 2.乱序,网络不可靠,如何知道那些数据已被正确接收,那些没有? 3.如何实现最大传输效率。 client、server 和 network lient:Hi network,我想向 server 传输数据,需要什么条件? network:哦,这个简单,你只需要告诉我你的 IP 和端口号、server 的 IP 和端口号(四元组)以及你要传输的内容。 client...

H_L_S的专栏 869

TCP和UDP的传输过程以及TCP如何保障传输的可靠性

TCP和UDP都是传输层的协议,传输层的主要任务就是建立应用程序端对端的连接,并且为数据传输提供可靠或不可靠的通信服务。 TCP:提供面向连接的服务,在传送数据之前必须先建立连接,数据传送完成后要释放连接。 UDP:在传送数据前不需要先建立连接,远地的主机在收到UDP报文后也不需要给出任何确认。 TCP建立连接的过程? TCP三次握手: 1、客户端向服务器发送连接请求,请求中包含连接请求的同步序...

fight252的博客 1284

如何保证 UDP 的可靠性传输?

这类似于TCP的确认应答机制,但是在应用层内实现的。UDP传输层是一种无连接的、不可靠的传输协议,无法保证数据的可靠传输,只能通过应用层来实现可靠性传输。当接收方来不及接收发送方发来的数据时,则会提示发送方降低发送的速度,防止包丢失。

编程语言开发、框架原理、编程思想、最佳实践技巧经验分享。致力于各种编程技术的技巧经验干货分享,讲解开发避坑技巧,追踪开发前沿技术,实战展开解决难题。 程序员小迷助您在编程路上越走越好! 1016

TCP和UDP的区别(简单明了)

目录1 前言2 TCP2.1 TCP如何保证可靠传输3 UDP 你知道什么是TCP和UDP吗?你知道TCP和UDP有什么区别吗?可能大家平时总是听说过TCP和UDP,但是一直不知道它们是怎么回事。今天就给大家介绍一下。我们常用的网络通讯、软件聊天、以及大家平时所看的视屏都是通过这两种协议来进行数据传输的,那它们又是如何工作呢,又有什么区别呢。注:本篇文章也是在B占看别的博主视频总结写的TCP和UDP都是在传输层,在程序之间传输数据,TCP是基于连接的,UDP是基于非连接的。如果将进程与进程之间

爪哇人的博客 1万+

tcp,udp特点,比较及 tcp可靠传输的各种机制

(1)TCP协议报头 TCP指传输控制协议,其报头格式如下: TCP协议中的六个标志分别是,URG、ACK、PSH、RST、SYN、FIN。 1)UGR(紧急):UGR=1表示紧急指针字段有效。它告诉系统此报文段有紧急数据,应当尽快传送。从报文段的开头,到紧急指针指向的地方就是紧急数据。 2)ACK(确认):ACK=1时,确认号字段才有效。 3)PSH(推送):让对方立即收到响应。与URG的区别...

Ferlan的博客 1444

传输层协议TCP简介

引言 UDP是一种简单的协议,但是也有着重要的应用,像Client-Server交互等,以及多媒体传输。但是对于大部分的互联网应用,可靠以及有序的传输是必要的。UDP不能提供这种可靠的传输模式,所以另一种协议需要来不足这个空缺,即:TCP。TCP是互联网一种主要的协议。 1. Introduction to TCP TCP(Transmission Control Protocol) 是一种可以在不可靠网络上提供可靠的端对端字节流传输的协议。单个网络与互联网是不一样的,因为不同互联的网络可能有不同的拓扑

Baron_wu的博客 1461

UDP如何实现可靠性

UDP(用户数据报协议)本身是一种无连接、面向报文的传输层协议,不保证数据包的可靠传输。这意味着在UDP协议中,数据包可能会丢失、重复或乱序,因此需要通过其他机制来实现可靠性。:发送方在发送数据包后设置一个定时器,如果在定时器超时之前没有收到确认包,则重新发送该数据包。:每个数据包被分配一个递增的序列号,接收方在接收到数据包后发送一个确认应答(ACK),发送方根据ACK来判断数据包是否成功接收。:通过滑动窗口协议来控制数据传输速率,确保网络不被过量的数据包塞满。

如无必要,勿增实体。 2901

TCP协议详解和STCP——面试·网络

内含相关面试题 TCP详解和STCPTCP报头讲解 TCP报头讲解 TCP:传输控制协议 面向连接的可靠传输协议 --在完成了传输层基本工作的基础上还需要保证传输的可靠性 面向连接:传输数据前先通过三次握手建立端到端的虚链路 可靠传输:4种可靠传输机制 排序、确认、重传、流控(滑动窗口机制 ...

站在远方看童年的博客 1840

RTSP协议之TCP/UDP问题

综上,在可靠连接和资源方面考虑,在嵌入式安防产品中采用TCP方式较多。,此方式比较灵活,它不用另外建立音视频传输的Socket,而直接使用RTSP的Socket,这样做可以节省不少资源开支。

yinshipin007的博客 3428

说说 TCP 可靠性保证

TCP 之可靠性,赖诸般精妙之法以成,其要者有检验和、序列号 / 确认应答、超时重传、最大消息长度、滑动窗口控制及拥塞控制数端。

weixin_61501031的博客 513

TCP协议------可靠性保证机制

        在这篇博客中介绍了连接管理机制,它是TCP协议保证可靠性的重要机制,除了该机制,还有许多实现可靠性得机制,本文中将一一进行介绍。1. 确认应答(ACK)机制        在TCP的协议报头中有两个字段:序列号和确认序列号。这两个字段就是来保证确认应答机制的。        发送方A将要发送的多个数据段排好序发送给接收端B。比如说A要发送序列号为1~1000的数据段。B如果将这些数...

sandmm112的博客 1852

TCP协议之如何保证传输的可靠性

一、问题 TCP协议之如何保证传输的可靠性?我们先看下TCP的头部图片和TCP头部的字段 /*TCP头定义,共20个字节*/ typedef struct _TCP_HEADER { short m_sSourPort;       // 源端口号16bit short m_sDestPort;       // 目的端口号16bit unsign...

码莎拉蒂 4414

TCP怎么保证数据可靠性传输的

TCP依赖停止等待协议和连续ARQ协议+滑动窗口协议达到可靠的目的。特点:资源利用率非常低工作原理:客户发送一次数据到服务端,必须等到服务端响应后才发第二次数据,中间的等待时间RTT占了大部分时间,中间如果出现差错(超时或确认丢失)都需要从新传输。连续ARQ协议工作原理:维持一个发送窗口(记录了当前可以发送的数据包数量n),在窗口内的数据都可以连续发送出去,服务器只在接收完一个发送窗口的数据后才回响应(累计确认),发送端接收到响应就把发送窗口移动n位,开始新一轮数据发送。TCP报文段的首部格式。

Mr.xing的博客 297

Linux C/C++ or 嵌入式面试之《网络编程系列》(11) TCP保证数据传输可靠性的方式

这个问题的要求比较高,想要答出所有的点不容易,体验了一个人的知识深度和广度。 文章目录1、检验和2、序列号3、确认应答机制(ACK)4、超时重传机制超时重传的过程5、连接管理机制TIME-WAIT存在的必要性(1)可靠地实现了TCP全双工连接的终止(2)允许老的重复分节在网络中的消逝(为什么需要2MSL)6、流量控制7、拥塞控制 TCP协议保证数据传输可靠性的方式主要有: 校验和 序列号 确认应答 超时重传 连接管理 流量控制 拥塞控制 1、检验和 TCP检验和的计算与UDP一样,在计算时要加上12byt

二进制君 1万+

计算机考研408复试题汇总

TCP连接是全双工的,两端都可以先挥手 其中一端完成数据发送任务后,发送一个FIN包来终止,另一端针对这个FIN包回复确认包, 直到另一端也发送请求终止数据包FIN,另一端作出确认应答,并且还要发送一个ACK=1表示确认号有效,如果没有收到这个就可以进行重传.

ca1m4n的博客 1万+

HBuilderX远程开发环境配置:Windows SSH连接实操

详细介绍如何在Windows系统中通过SSH连接远程服务器,配置HBuilderX进行高效远程开发,提升编码协作效率。全程实操演示,轻松掌握hbuilderx与远程环境的无缝对接。

weixin_35751194的博客 1190

Ubuntu 26.04 本地安装 GitLab CE 完整教程(非 Docker 方式)

本文详细介绍了在Ubuntu 26.04系统上通过Omnibus包安装GitLab CE的完整流程。主要内容包括:环境准备(系统要求、依赖安装)、配置清华镜像源、执行安装命令、修改配置文件、服务管理命令以及常见问题解决方法。文章特别强调了内存要求(建议4GB以上)、首次登录密码获取、HTTPS安全配置等关键点,并提供了性能优化建议和安全设置指导。相比Docker方式,Omnibus安装具有性能更好、管理方便等优势,适合需要私有化部署GitLab的场景。

1368

新手避坑指南:用镭神C32和KVH 1750 IMU做标定,为什么直接上lidar_align会失败?

本文详细解析了使用镭神C32激光雷达和KVH 1750 IMU进行标定时常见的失败原因及解决方案。从IMU的微分传感器特性到Lidar-IMU标定的数学本质,再到可行的标定方案和实操注意事项,帮助新手避开认知陷阱,掌握正确的标定方法。

weixin_30162121的博客 327

SimSwap复现指引及代码分析【2023有更新】

我的环境!!!😚😚😚 之后会遇到:还会遇到至此环境配置完毕!下面是所需要的checkpoint。至此环境准备结束。先试试环境是否有问题,图片是代码包中给的。我用的是512的checkpoint,无水印,a是源脸,b是目标脸。输出到./output/result_whole_swapsingle.jpg 如图是可以成功换脸的:(为了方便查看将图像裁剪到了128x128) 表示图像预处理,相应的改为也是一样。不加就是对已经面部对齐的图像进行简单的面部交换。 加上就是无水印。 交换一张图片中的所有面孔。

zik的博客 2045

【matlab】基于 Simulink 的空调恒温控制系统仿真建模

本文介绍了基于Simulink的空调恒温控制系统仿真建模方法。系统采用PID控制算法,通过传感器测量温度、控制器计算信号、执行器调节功率来实现恒温控制。文章详细阐述了Simulink模型搭建步骤,包括PID控制器、房间热力学特性模拟等模块的实现,并提供了测试流程和多种实际部署场景。该方法可有效验证控制算法性能,优化系统设计,适用于家用、商用、工业及汽车空调系统。未来可结合智能算法和节能优化技术进一步提升系统性能。

走向CTO的路上... 917

【Bug已解决】Claude Team Plan 购买席位报错 Payment failed 解决方案

方案适用场景推荐指数检查账单历史状态排查的第一步⭐⭐⭐⭐⭐更换支付方式类型快速尝试是否能绕开问题⭐⭐⭐联系官方支持团队最终解决问题的正规渠道⭐⭐⭐⭐⭐临时过渡方案紧急用人需求的应急处理⭐⭐⭐关注官方修复进度确认属于系统性缺陷的场景⭐⭐⭐⭐Claude Team Plan 增购席位报的问题,社区反馈和实际排查表明很大概率属于平台计费系统在处理按比例分摊费用这类复杂计算链路时的系统性缺陷,而不是用户自身的支付信息填写有误。先排除自身账单历史是否存在异常。

一键难忘的博客 4177

Virtual Hard Disk version 2 (VHDX) 文件格式详解

VHDX 镜像格式详解 0. References windows github 1. Overview Microsoft 虚拟化产品中常用的映像格式是虚拟硬盘版本 2 (VHDX) 映像格式。该规范基于可用文档,并通过分析测试数据进行了增强。 VHDX 镜像格式种类 固定硬盘镜像 动态硬盘镜像 差异硬盘镜像 VHDX 镜像文件由以下元素构成: file (type) identifier 2x image headers 2x region tables log or metadata journ

圣三一 2694

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: JVM内存分代
下一篇: 有序的Map集合
QEcode
博客等级 码龄10年 39粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值