消息!网络流量控制(网络流量监控工具)滑动窗口
TCP流量控制主要由基于接收方确认的滑动窗口机制和基于网络情况的发送方的拥塞控制算法来实现!
TCP Traffic Control
TCP流量控制主要涉及滑动窗口,拥塞控制算法,RTT(Round-Trip Time,往返时间),RTO(Retransmission Timeout,重传超时)计算等等。
(资料图片)
滑动窗口通常认为是接收方反馈给发送方的流量和重传控制(不考虑网络);拥塞控制算法通常认为是发送方的流量控制算法(考虑网络时延丢包等);RTT计算会影响到RTO计算及影响某些拥塞算法运行结果;RTO计算会涉及到超时重传定时器设置。滑动窗口
滑动窗口(sliding window)是数据传输时接收方通告窗口给发送方,然后发送方根据窗口决定一次发送多少数据的机制,本质是ARQ(Automatic Repeat Request, 停等协议),滑动窗口一方面利用接收方确认报文反馈的窗口大小控制每次发包个数,另一方面根据接收方确认报文确认号判断数据帧重传,滑动窗口仅通过接收方反馈的信息进行流量控制,不会考虑网络带宽延迟等因素。
ARQ主要有连续ARQGo-Back-N和选择ARQSelective Repeat两种,TCP中使用Go-back-N,Selective Repeat作为可选实现。Go-back-N和Selective Repeat区别在于,Go-back-N一次发包只有一个定时器,中间出现丢包,则丢的包之后的所有包都需要重传,Selective Repeat一次发包需要和包个数一样的定时器数量,中间出现丢包则仅重传丢失的那个包,简单来说Go-back-N比较耗网络带宽,Selective Repeat比较耗计算资源。
两种ARQ滑动窗口发送过程可参考如下网站的动画:
https://www2.tkn.tu-berlin.de/teaching/rn/animations/gbn_sr/
TCP滑动机制原理可简述为:TCP发送方包含一个发送窗口,按序列号发送数据包,TCP接收方根据收到的包回复确认包,TCP发送包根据收到的确认包中通告窗口反馈来动态调节发送窗口大小、滑动窗口右移并发送后续的数据包。
如下tcpipguide网站TCP滑动窗口描述,TCP发送方发送缓存区分为4块区域:已发送已确认、已发送未确认、未发送接收方已准备好和未发送接收方未准备好,TCP接收方接收缓存区分为3块区域:已接收已确认、未接收被允许发送、未收到发生方可能未发送。
Linux内核4.x中滑动窗口代码示例,大体可以看出来和tcpipguid网站中描述一致:
/* Update our send window. * * Window update algorithm, described in RFC793/RFC1122 (used in linux-2.2 * and in FreeBSD. NetBSD"s one is even worse.) is wrong. */static int tcp_ack_update_window(struct sock *sk, const struct sk_buff *skb, u32 ack, u32 ack_seq){ struct tcp_sock *tp = tcp_sk(sk); int flag = 0; u32 nwin = ntohs(tcp_hdr(skb)->window); if (likely(!tcp_hdr(skb)->syn)) nwin <<= tp->rx_opt.snd_wscale; if (tcp_may_update_window(tp, ack, ack_seq, nwin)) { flag |= FLAG_WIN_UPDATE; tcp_update_wl(tp, ack_seq); if (tp->snd_wnd != nwin) { tp->snd_wnd = nwin; /* Note, it is the only place, where * fast path is recovered for sending TCP. */ tp->pred_flags = 0; tcp_fast_path_check(sk); if (!tcp_write_queue_empty(sk)) tcp_slow_start_after_idle_check(sk); if (nwin > tp->max_window) { tp->max_window = nwin; tcp_sync_mss(sk, inet_csk(sk)->icsk_pmtu_cookie); } } } tcp_snd_una_update(tp, ack); return flag;}
RTT&RTO计算
TCP流量控制中RTT及RTO计算是一个很重要的问题,ARQ中针对丢包都需要超时重传,超时的设置就会涉及到RTO,RTO设置过短(<2RTT)则可能导致不必要的重传(丢的包可能在传输马上能到),超时重传时间设置过长则可能影响TCP通信效率(一直在等丢的包重传过来),RTO计算需要基于RTT,RTT计算值直接影响RTO,不少拥塞算法也和RTT直接相关,TCP流端到端的RTT和RTO都不是一个固定的值,都是一段时间网络中端到端的估算值,随着时间和网络的变化而变化。
网络就像高速公路网,时而拥堵时而畅通无阻,对应在网络里就是RTT抖动,如何计算RTT和RTO直接影响重传进而影响通信效率,其计算也经过长时间的理论和实践过程。
最初Phil Karn和Craig Partridge提出SRTT(Smoothed RTT,估算重传时间)和RTO计算如下:
SRTT = (α * SRTT) + ( (1-α) *RTT)RTO = min[UBOUND, max[LBOUND,(β * SRTT)]]其中α取0.8 ~ 0.9,β取1.3 ~ 2.0, UBOUND和LBOUND分别为上限时间和下限时间
后来Jacobson 和 Karels做了一定的修正,最终形成RFC6298
https://datatracker.ietf.org/doc/html/rfc6298,SRTT,DevRTT(RTT偏差) ,RTO计算公式,具体如下:
SRTT = SRTT + α * (RTT - SRTT)DevRTT = (1-β) * DevRTT + β *(|RTT - SRTT|)RTO = μ * SRTT + δ * DevRTT其中α取0.125,β取0.25,μ取1,δ取4
Linux内核4.x中SRTT计算代码如下:
/* Called to compute a smoothed rtt estimate. The data fed to this * routine either comes from timestamps, or from segments that were * known _not_ to have been retransmitted [see Karn/Partridge * Proceedings SIGCOMM 87]. The algorithm is from the SIGCOMM 88 * piece by Van Jacobson. * NOTE: the next three routines used to be one big routine. * To save cycles in the RFC 1323 implementation it was better to break * it up into three procedures. -- erics */static void tcp_rtt_estimator(struct sock *sk, long mrtt_us){ struct tcp_sock *tp = tcp_sk(sk); long m = mrtt_us; /* RTT */ u32 srtt = tp->srtt_us; /* The following amusing code comes from Jacobson"s * article in SIGCOMM "88. Note that rtt and mdev * are scaled versions of rtt and mean deviation. * This is designed to be as fast as possible * m stands for "measurement". * * On a 1990 paper the rto value is changed to: * RTO = rtt + 4 * mdev * * Funny. This algorithm seems to be very broken. * These formulae increase RTO, when it should be decreased, increase * too slowly, when it should be increased quickly, decrease too quickly * etc. I guess in BSD RTO takes ONE value, so that it is absolutely * does not matter how to _calculate_ it. Seems, it was trap * that VJ failed to avoid. 8) */ if (srtt != 0) { m -= (srtt >> 3); /* m is now error in rtt est */ srtt += m; /* rtt = 7/8 rtt + 1/8 new */ if (m < 0) { m = -m; /* m is now abs(error) */ m -= (tp->mdev_us >> 2); /* similar update on mdev */ /* This is similar to one of Eifel findings. * Eifel blocks mdev updates when rtt decreases. * This solution is a bit different: we use finer gain * for mdev in this case (alpha*beta). * Like Eifel it also prevents growth of rto, * but also it limits too fast rto decreases, * happening in pure Eifel. */ if (m > 0) m >>= 3; } else { m -= (tp->mdev_us >> 2); /* similar update on mdev */ } tp->mdev_us += m; /* mdev = 3/4 mdev + 1/4 new */ if (tp->mdev_us > tp->mdev_max_us) { tp->mdev_max_us = tp->mdev_us; if (tp->mdev_max_us > tp->rttvar_us) tp->rttvar_us = tp->mdev_max_us; } if (after(tp->snd_una, tp->rtt_seq)) { if (tp->mdev_max_us < tp->rttvar_us) tp->rttvar_us -= (tp->rttvar_us - tp->mdev_max_us) >> 2; tp->rtt_seq = tp->snd_nxt; tp->mdev_max_us = tcp_rto_min_us(sk); } } else { /* no previous measure. */ srtt = m << 3; /* take the measured time to be rtt */ tp->mdev_us = m << 1; /* make sure rto = 3*rtt */ tp->rttvar_us = max(tp->mdev_us, tcp_rto_min_us(sk)); tp->mdev_max_us = tp->rttvar_us; tp->rtt_seq = tp->snd_nxt; } tp->srtt_us = max(1U, srtt);}
Linux内核4.x中RTO计算代码:
/* Calculate rto without backoff. This is the second half of Van Jacobson"s * routine referred to above. */void tcp_set_rto(struct sock *sk){ const struct tcp_sock *tp = tcp_sk(sk); /* Old crap is replaced with new one. 8) * * More seriously: * 1. If rtt variance happened to be less 50msec, it is hallucination. * It cannot be less due to utterly erratic ACK generation made * at least by solaris and freebsd. "Erratic ACKs" has _nothing_ * to do with delayed acks, because at cwnd>2 true delack timeout * is invisible. Actually, Linux-2.4 also generates erratic * ACKs in some circumstances. */ inet_csk(sk)->icsk_rto = __tcp_set_rto(tp); /* 2. Fixups made earlier cannot be right. * If we do not estimate RTO correctly without them, * all the algo is pure shit and should be replaced * with correct one. It is exactly, which we pretend to do. */ /* NOTE: clamping at TCP_RTO_MIN is not required, current algo * guarantees that rto is higher. */ tcp_bound_rto(sk);}static inline u32 __tcp_set_rto(const struct tcp_sock *tp){ return usecs_to_jiffies((tp->srtt_us >> 3) + tp->rttvar_us);}
拥塞控制算法
由于滑动窗口仅考虑接收方的接收能力不考虑网络因素,网络带宽是共享的,网络延时是抖动的,网络的变化带来的问题势必会造成整个系统的崩溃,这就像两个火车站运输货物,仅考虑火车站的容纳量,不考虑火车轨道的承载能力,火车车次发的再多可能也是堵在轨道上,还可能导致轨道系统瘫痪。
拥塞控制算法是发送方根据当前网络情况调整发包速率的流量控制机制,TCP中拥塞控制算法发展至今,从经典的reno到google近年来提出的bbr,期间不断有新的拥塞控制算法提出来,拥塞控制也形成了如下RFC。
RFC5681
https://datatracker.ietf.org/doc/html/rfc5681
以linux内核为例,最新的内核版本内部实现了十多种拥塞控制算法实现,包括一些比较新的算法实现(比如bbr),linux较早版本内核使用reno,linux 2.6.8以后默认采用bic算法,linux 2.6.19以后又默认使用了cubic算法,目前linux 5.x依然默认使用cubic算法, windows同样也是支持多种拥塞控制算法的,目前windows11默认也是使用cubic算法。
拥塞算法原理(reno为例)
TCP拥塞算法整体框架基本一致,以经典的TCP reno拥塞控制算法(教科书通常讲的版本)进行简要介绍,TCP拥塞控制RFC5681规定都包含慢启动、拥塞避免、快重传、快恢复阶段,这又涉及到几个基本参数(cwnd、ssthresh),cwnd指拥塞窗口的大小,决定了一次发送多少数据包,ssthresh指慢启动阈值。
慢启动慢启动阶段分为两种,一种是流刚开始cwnd<ssthresh时cwnd初始为1MSS(随着硬件更新,Linux最新内核初始为10MSS)并随着RTT呈指数增长,一种是重传超时cwnd恢复初始值重新进入慢启动,慢启动并不表示发送速率增长慢(指数级增长),个人理解是指从比较低的起始速率来试探网络能力,针对慢启动有提出了ABC(Appropriate Byte Count)算法对慢启动突发而造成超越网络承载能力进行修复,如下两篇关于ABC的RFC。
RFC3465
https://datatracker.ietf.org/doc/html/rfc3465
RFC3742
https://datatracker.ietf.org/doc/html/rfc3742
首次慢启动最初初始ssthresh都是设置为一个很大的值,这样直到丢包才会进入拥塞避免,后又出现了hystart优化(混合慢启动),比如预测出理想的ssthresh,从而让首次慢启动不至于丢包才进入拥塞避免(丢包代价太大)。
当cwnd>=ssthresh时会进入拥塞避免阶段,cwnd会随着RTT呈线性增长,这个起始是比较保守地试探最大网络能力,不至于网络崩溃。
快重传拥塞避免阶段当收到3个连续ACK,表明可能出现了丢包,表明网络出现轻微拥堵,这个时候会进入快重传阶段,ssthresh会设置为0.5 * cwnd,cwnd会设置为ssthresh+3MSS,进行数据包重传进入快恢复阶段。
快恢复快恢复阶段如果重传数据包后如果依然收不到新数据包ACK而且RTO超时了,表明网络并没有恢复,就会重新进入慢启动阶段,ssthresh会设置为0.5 * cwnd,cwnd会设置为初始值,如果收到了新数据的ACK包,表明网络已恢复,cwnd会设置为ssthresh,进入拥塞避免阶段。
reno拥塞控制算法状态图如下
reno算法iperf打流wireshark抓包io图如下:
拥塞算法对比
拥塞控制算法主要是基于网络丢包和延迟(RTT)来实现,所以有的算法丢包敏感,有的算法延迟敏感,有的结合丢包和延迟,不同的算法主要的区别可能在于拥塞避免阶段如何去拟合理想发送速率曲线又不至于丢包,如下
https://en.wikipedia.org/wiki/TCP_congestion_control关于不同拥塞算法对比。
拥塞算法 | 网络反馈 | 需要修改点 | 应用场景 | 公平性准则 |
(New) Reno | Loss | — | — | Delay |
Vegas | Delay | Sender | Less loss | Proportional |
High Speed | Loss | Sender | High bandwidth | |
BIC | Loss | Sender | High bandwidth | |
CUBIC | Loss | Sender | High bandwidth | |
C2TCP[10][11] | Loss/Delay | Sender | Ultra-low latency and high bandwidth | |
NATCP[12] | Multi-bit signal | Sender | Near Optimal Performance | |
Elastic-TCP | Loss/Delay | Sender | High bandwidth/short & long-distance | |
Agile-TCP | Loss | Sender | High bandwidth/short-distance | |
H-TCP | Loss | Sender | High bandwidth | |
FAST | Delay | Sender | High bandwidth | Proportional |
Compound TCP | Loss/Delay | Sender | High bandwidth | Proportional |
Westwood | Loss/Delay | Sender | L | |
Jersey | Loss/Delay | Sender | L | |
BBR[13] | Delay | Sender | BLVC, Bufferbloat | |
CLAMP | Multi-bit signal | Receiver, Router | V | Max-min |
TFRC | Loss | Sender, Receiver | No Retransmission | Minimum delay |
XCP | Multi-bit signal | Sender, Receiver, Router | BLFC | Max-min |
VCP | 2-bit signal | Sender, Receiver, Router | BLF | Proportional |
MaxNet | Multi-bit signal | Sender, Receiver, Router | BLFSC | Max-min |
JetMax | Multi-bit signal | Sender, Receiver, Router | High bandwidth | Max-min |
RED | Loss | Router | Reduced delay | |
ECN | Single-bit signal | Sender, Receiver, Router | Reduced loss |
这里还要提一下TCP流的公平性问题,有的拥塞算法可能会存在带宽抢占,基于延时相关的算法就很容易出现,因为是基于RTT来抢占带宽,RTT越小占用则更多,比如有两条TCP流,TCP流中延迟更小的会抢占更多的带宽,甚至完全占有所有带宽,其他流都无法正常工作。比如reno和bic都存在抢占问题,cubic是通过3次曲线来探测理想带宽,和RTT无关联,公平性做得较好。
如上图使用reno算法,使用iperf打流到两个不同服务端,stream2延时低直接抢占了大部分带宽
如上图使用cubic算法,同样使用iperf打流到两个不同服务端,steam2延时低抢占带宽则没有那么严重
Linux内核中拥塞算法
Linux 2.6.x内核版本具体可参考
https://linuxgazette.net/135/pfeiffer.html进行拥塞算法选择,最新的linux 5.x内核多支持了几种,内核代码Kconfig中也有简要描述,顺便提一下mptcp内核也包含了多路径场景的几种拥塞算法。
Linux 4.x内核中支持的tcp拥塞算法,默认使用cubic:
config DEFAULT_TCP_CONGstringdefault "bic" if DEFAULT_BICdefault "cubic" if DEFAULT_CUBICdefault "htcp" if DEFAULT_HTCPdefault "hybla" if DEFAULT_HYBLAdefault "vegas" if DEFAULT_VEGASdefault "westwood" if DEFAULT_WESTWOODdefault "veno" if DEFAULT_VENOdefault "reno" if DEFAULT_RENOdefault "dctcp" if DEFAULT_DCTCPdefault "cdg" if DEFAULT_CDGdefault "bbr" if DEFAULT_BBRdefault "cubic"
Linux mptcp v0.95内核支持的mptcp拥塞算法:
config TCP_CONG_LIAtristate "MPTCP Linked Increase"depends on MPTCPdefault n---help---MultiPath TCP Linked Increase Congestion ControlTo enable it, just put "lia" in tcp_congestion_controlconfig TCP_CONG_OLIAtristate "MPTCP Opportunistic Linked Increase"depends on MPTCPdefault n---help---MultiPath TCP Opportunistic Linked Increase Congestion ControlTo enable it, just put "olia" in tcp_congestion_controlconfig TCP_CONG_WVEGAStristate "MPTCP WVEGAS CONGESTION CONTROL"depends on MPTCPdefault n---help---wVegas congestion control for MPTCPTo enable it, just put "wvegas" in tcp_congestion_controlconfig TCP_CONG_BALIAtristate "MPTCP BALIA CONGESTION CONTROL"depends on MPTCPdefault n---help---Multipath TCP Balanced Linked Adaptation Congestion ControlTo enable it, just put "balia" in tcp_congestion_controlconfig TCP_CONG_MCTCPDESYNCtristate "DESYNCHRONIZED MCTCP CONGESTION CONTROL (EXPERIMENTAL)"depends on MPTCPdefault n---help---Desynchronized MultiChannel TCP Congestion Control. This is experimentalcode that only supports single path and must have set mptcp_ndiffportslarger than one.To enable it, just put "mctcpdesync" in tcp_congestion_controlFor further details see:http://ieeexplore.ieee.org/abstract/document/6911722/https://doi.org/10.1016/j.comcom.2015.07.010
Linux4.x内核中拥塞算法扩展时参考struct,拥塞算法主要重写里面函数来实现:
struct tcp_congestion_ops { struct list_head list; u32 key; u32 flags; /* initialize private data (optional) */ void (*init)(struct sock *sk); /* cleanup private data (optional) */ void (*release)(struct sock *sk); /* return slow start threshold (required) */ u32 (*ssthresh)(struct sock *sk); /* do new cwnd calculation (required) */ void (*cong_avoid)(struct sock *sk, u32 ack, u32 acked); /* call before changing ca_state (optional) */ void (*set_state)(struct sock *sk, u8 new_state); /* call when cwnd event occurs (optional) */ void (*cwnd_event)(struct sock *sk, enum tcp_ca_event ev); /* call when ack arrives (optional) */ void (*in_ack_event)(struct sock *sk, u32 flags); /* new value of cwnd after loss (required) */ u32 (*undo_cwnd)(struct sock *sk); /* hook for packet ack accounting (optional) */ void (*pkts_acked)(struct sock *sk, const struct ack_sample *sample); /* override sysctl_tcp_min_tso_segs */ u32 (*min_tso_segs)(struct sock *sk); /* returns the multiplier used in tcp_sndbuf_expand (optional) */ u32 (*sndbuf_expand)(struct sock *sk); /* call when packets are delivered to update cwnd and pacing rate, * after all the ca_state processing. (optional) */ void (*cong_control)(struct sock *sk, const struct rate_sample *rs); /* get info for inet_diag (optional) */ size_t (*get_info)(struct sock *sk, u32 ext, int *attr, union tcp_cc_info *info); char name[TCP_CA_NAME_MAX]; struct module *owner;};
Linux4.x内核cubic算法重新如下函数来实现:
static struct tcp_congestion_ops cubictcp __read_mostly = { .init = bictcp_init, .ssthresh = bictcp_recalc_ssthresh, .cong_avoid = bictcp_cong_avoid, .set_state = bictcp_state, .undo_cwnd = tcp_reno_undo_cwnd, .cwnd_event = bictcp_cwnd_event, .pkts_acked = bictcp_acked, .owner = THIS_MODULE, .name = "cubic",};
Linux 系统流量控制重要系统参数
# 每个套接字所允许的最大缓冲区的大小net.core.optmem_max = 20480# 接收套接字缓冲区大小的缺省值(以字节为单位)。net.core.rmem_default = 229376# 接收套接字缓冲区大小的最大值(以字节为单位)。net.core.rmem_max = 16777216# socket监听的backlog(监听队列)上限net.core.somaxconn = 128# tcp默认拥塞算法net.ipv4.tcp_congestion_control = cubic# 是否开启tcp窗口扩大net.ipv4.tcp_window_scaling = 1# tcp内存大小区(以页为单位, 1页=4096字节), 3个数值分别为 low, pressure, high# low: tcp使用低于该值页数时不考虑释放内存, pressure: tcp使用内存大于该值则试图稳定其使用内存low以下# high: 允许tcp用排队缓存数据报文的页面量, 超过该值拒绝分配socket, 出现TCP: too many of orphaned socketsnet.ipv4.tcp_mem = 381705 508942 763410# tcp读缓存区(以字节为单位), 3个数值分别为 默认值 最小值 最大值net.ipv4.tcp_rmem = 10240 87380 16777216# tcp写缓存区(以字节为单位), 3个数值分别为 默认值 最小值 最大值net.ipv4.tcp_wmem = 10240 87380 16777216
Reference
https://tools.ietf.org/html/std7
https://datatracker.ietf.org/doc/html/rfc1122
https://datatracker.ietf.org/doc/html/rfc1323
https://datatracker.ietf.org/doc/html/rfc1379
https://datatracker.ietf.org/doc/html/rfc1948
https://datatracker.ietf.org/doc/html/rfc2018
https://datatracker.ietf.org/doc/html/rfc5681
https://datatracker.ietf.org/doc/html/rfc6247
https://datatracker.ietf.org/doc/html/rfc6298
https://datatracker.ietf.org/doc/html/rfc6824
https://datatracker.ietf.org/doc/html/rfc7323
https://datatracker.ietf.org/doc/html/rfc7414
https://en.wikipedia.org/wiki/Transmission_Control_Protocol
https://linuxgazette.net/135/pfeiffer.html
http://www.tcpipguide.com/free/t_TCPSlidingWindowDataTransferandAcknowledgementMech.htm
https://www2.tkn.tu-berlin.de/teaching/rn/animations/gbn_sr/
https://zhuanlan.zhihu.com/p/144273871
http://lxr.linux.no/linux+v3.2.8/Documentation/networking/ip-sysctl.txt#L464
标签:
相关阅读
-
全球热头条丨3g网速是多少兆宽带(3g网络和4g网络的区别)应用范围不同
区别:1、应用范围不同3G技术以“人对人”为主,4G技术以“人对信息”为主,而5G将会做到“人对万物”乃...
2022-12-16 -
环球观察:ie无法上网怎么解决(ie浏览器无网络连接解决技巧)下文教你解决
我们在使用浏览器上网浏览网页的时候,如果想要清理网页临时文件或者进行设置,我们需要在“internet选...
2022-12-16 -
全球热头条丨3g网速是多少兆宽带(3g网络和4g网络的区别)应用范围不同
区别:1、应用范围不同3G技术以“人对人”为主,4G技术以“人对信息”为主,而5G将会做到“人对万物”乃...
2022-12-16 -
环球观察:ie无法上网怎么解决(ie浏览器无网络连接解决技巧)下文教你解决
我们在使用浏览器上网浏览网页的时候,如果想要清理网页临时文件或者进行设置,我们需要在“internet选...
2022-12-16 -
dictionary复数形式怎么写(dictionary的复数和用法例句)
大家好,我是sweet老师,可数名词的复数形式多种多样,究竟应该选择哪一个呢?这些例子为大家总结了用法...
2022-12-16 -
焦点报道:fraps简体中文版怎么用(手机fps帧数显示软件推荐:win10任务管理器)
电脑单机游戏数量庞大,种类繁多,对显卡和CPU的性能要求不一致,而大部分游戏又不自带帧数(FPS)显示...
2022-12-16 -
super scanner使用说明(手机scan软件推荐:cmd即命令行)
CMD、LINUX命令大全来了,不管电脑爱好者,还是渗透初学者,网络安全大神,这里为你整理的最全的系统命...
2022-12-16 -
【速看料】mp3音乐裁剪器(mp3音乐剪辑器软件推荐) 批处理转换音频文件
PowerMp3Cutter是一个简洁实用的音频裁剪工具,可以帮助我们截取一首歌的其中一部分,裁剪的精准度很高...
2022-12-16 -
世界热推荐:android 4.3进程管理器(安卓4.3系统升级技巧)一起来看看吧
对于大多数Android开发者来说,AndroidStudio是首选工具。谷歌会持续发布IDE更新,以添加各种新功能和BU...
2022-12-16 -
今日视点:魔兽不能全屏的原因(win7魔兽不能全屏设置方法)具体方法如下
上篇文章我们说到W7运行魔兽争霸3游戏常出现的问题,这一篇我们说下W7魔兽争霸3怎么全屏 一般情况下玩...
2022-12-16 -
焦点讯息:联想大屏智能手机大全(最新款手机联想) 有你喜欢的吗
IT之家1月23日消息,联想拯救者Y90双擎风冷电竞手机此前已官宣,将搭载骁龙8Gen1芯片,用6 92英寸144Hz...
2022-12-16 -
天天热议:iphone按键失灵(苹果home键失灵修复方法)维修教程教给你
序周末给儿子的IP6s更换电池,由于很久没拆了,再加上原来的电池背胶粘性太足,实在不得已必须拆屏幕后...
2022-12-16 -
天天精选!cda格式怎么转换成mp3(免费软件)小编带你一起了解
cda格式,就是cd音轨。首先CDA格式的音频文件都是CD光盘里面的文件,那么想要转换成MP3通用的音频文件就...
2022-12-16 -
今日聚焦!美宝莲眼线笔多少钱一个(眼线笔品牌推荐:UNNY眼线胶笔)
今天给小仙女们来一波不晕妆网红眼线笔,嘻嘻嘻!UNNY眼线胶笔(参考价:¥30)我每次化妆的时候最烦的...
2022-12-16 -
今日看点:免费短信接收平台(6 个免费在线接收短信验证)需要的来了解下
(友情提示:查看榜单,可直接翻至文末)短信验证码(SMSVerificationCode)作为短信群发的一种,作用是...
2022-12-16 -
世界播报:格力吸顶空调型号有哪些(格力所有型号空调参数详解) 型号命名规则
产品分类型号命名规则型号是空调的“名字”,通过型号能够了解到一台空调的基本信息 型号中的每一个字...
2022-12-16 -
电脑开机蓝屏显示C0000218 unknown错误的原因及解决方法 具体步骤如如下
电脑开不了机,不断地重启也进不了系统桌面,都有遇到过这样的问题。电脑出现蓝屏显示STOP:C0000218unk...
2022-12-16
精彩推荐
阅读排行
相关词
- 环球今亮点!电脑关不了机怎么回事怎么解决 电脑关不了机的原因分析
- 每日关注!腾达路由器设置_Tenda腾达无线路由器怎么设置 看完下文你就懂了
- SLI技术是什么 历史和原理介绍
- 【环球热闻】手机锁屏密码忘了怎么办 锁屏密码破解法 需要的进来看看
- 微信分付怎么开通?分付怎么把额度刷出来?
- 防火墙在哪里设置 具体操作教会你
- 通讯!电脑问题_如何更改桌面图标 方法和步骤教给你
- 要闻速递:诺基亚5330报价以及手机介绍 诺基亚5330外观特点
- 联想v370怎么样 联想v370配置及测评(外观方面)
- 天天快消息!黑莓z30怎么样 黑莓z30评测详情 下面来认识下这款手机
- 车险续保如何续?车险续保怎么买便宜?
- 适马2470价格与评测 你觉得如何
- 电脑没有声音怎么回事 (硬件原因)
- 今日看点:最好用的浏览器是什么 最好用的浏览器一般有哪些?
- 天天实时:爱国者蓝牙耳机配对方法介绍 爱国者蓝牙耳机说明书
- 环球资讯:yy直播间怎么赚钱 相关内容了解
- 环球看热讯:怎样安装摄像头驱动程序 摄像头驱动程序安装教程 一起来看看
- 佳能eos7d怎么样 数码相机的基本特点是什么
- 数码相机维修与常见故障 以下方法值得收藏
- 快资讯丨手机充电很慢是怎么回事啊? 手机充电慢的原因分析
- 电脑开机蓝屏显示C0000218 unknown错误的原因及解决方法 具体步骤如如下
- 无量下跌是什么意思?为什么放量下跌必将反弹?
- 腾达路由器的默认管理地址是多少 腾达无线路由器后台管理地址主要情况介绍
- 全球观点:手机充电时充电器发热怎么回事 手机充电有哪些注意事项
- 杨丞琳八卦曝光,渴望同时被很多人追 杨丞琳有什么八卦
- 天天新资讯:散热架工作原理是什么 散热架原理简介(处理器的功耗)
- 电脑开机后进不了系统只是在运行怎么办 电脑开机进不了系统原因(修复错误)
- 吴尊的老婆是什么的身份 吴尊和林丽莹什么时候结婚的
- 快资讯丨笔记本电脑托运安全吗 看文你就了解了
- home键失灵怎么办?home键失灵要如何修复(弹指大法)
- 股指期货开户条件是什么?期货手续费怎么收取的?
- 焦点热议:硬盘的型号怎么看 硬盘型号查看详细步骤介绍
- 天天热点!电视剧我是余欢水一共多少集 剧情简介
- 股票技术指标有哪些?股票买卖点看什么指标比较准?
- 环球热头条丨扫描仪怎么用 方法/步骤教给你
- 【时快讯】亲爱的自己陈一鸣结局解析 你有看过吗
- 卡帕是哪国的品牌 成立于哪一年
- 天天信息:任天鸽杨光是什么电视,温柔的诱惑剧情介绍 结局如何
- 34的文胸是多少码,文胸尺码对照表 教你选购适合的文胸
- 索尼PSP2怎么样 索尼PSP2性能价格介绍(psp2参数与测评)
- 焦点热文:二手thinkpad值得购买吗 什么是thinkpad笔记本?
- 【环球速看料】娘惹是什么意思 娘惹的来源
- 今日视点:86版西游记真假美猴王是哪一集,真假美猴王剧情介绍 你看过吗
- 世界报道:白沉香是怎么死的? 中间发生了什么
- 全球视点!易遥得的什么传染病 《悲伤逆流成河》剧情简介
- 全球热文:狄威和狄龙是什么关系 狄威个人资料 出演过什么
- 曾小娅结局,《假如生活欺骗了你》剧情介绍
- 青春斗赵聪为什么消失 讲述了什么
- 什么是经营性贷款?经营贷最长可以贷多少年?
- 林子闳为什么叫老板 林子闳资料介绍
- 当前关注:优客李林是哪两位歌手 都唱歌什么歌
- 胡列娜怎么死的,胡列娜最后结局 一起来看看
- 环球热点!何琳是什么电视剧角色,婆婆来了剧情介绍
- 为什么说高圆圆是炮架? 这到底怎么回事?
- 当前观点:普普是怎么死的,隐秘的角落剧情简介 一共多少集
- 天天快播:《血族》突围隐者新服礼包已开放领取
- 全球快讯:《血族》突围隐者新服礼包火爆预订中
- 世界速读:五指山市气象台发布寒冷橙色预警【Ⅱ级/严重】【2022-12-16】
- 宝妈的华丽蜕变《我叫MT:归来》小迦迦登场
- 每日视讯:华泰证券:看好内需消费的长期潜能 食品饮料板块明年基本面有望改善
- 乐东县气象台发布寒冷橙色预警【Ⅱ级/严重】【2022-12-16】
- 安永:2022年A股筹资额保持高位 专精特新企业占比逐年上升
- 《弹弹堂大冒险》社交系统全面解析
- 暗区突围s2赛季段位继承等级详情
- 世界热文:海南省气象局发布寒冷黄色预警【III级/较重】【2022-12-16】
- 2022年中国智能语音转写行业研究报告
- 滚动:暖冬行动:农产地销售供应链调查
- 全球即时看!纳斯达克100风向标:百度向左,Rivian向右
- Pilbara拍价终降,锂盐锂矿价格双跌现隐忧
- 【独家】雷丁有难,潍坊支援
- 红杉、泰格、药明等躬身入局,临床试验数字化玩家争夺百亿市场 | 行业观察
- 买断合同是什么意思?买断工龄补偿标准是怎样的?
- 每日报道:海兰信回应股价大跌:公司未有任何利空,也没有任何操纵行为
- 世界短讯!总台三部纪录电影海南电影节首发
- 天天看热讯:《极简塔防》开局怎么玩攻略
- 【全球新要闻】开赛在即 《胡莱三国4》巅峰对决玩法登场
- 宝可梦朱紫姆克鹰捕捉位置介绍
- 世界热讯:《全民枪神2》强杀阵容
- 光伏产业链全线降价 利润面临重新分配 哪些环节盈利能力更为坚挺?(附概念股)
- 机械设备折旧年限是多少年?机械租赁费是几个点?
- 【世界独家】一人一狗辐射传奇什么时候出 公测上线时间预告
- 房屋两证指的是什么?房产两证合一必须办吗?
- 【世界新要闻】不确定性增多 家电企业又到了调整战略的时刻
- 中国经济,如何稳增长?如何扩内需?
- 店铺买卖注意事项有哪些?店铺什么时候转让比较好?
- 当前热文:11月我国经济保持恢复态势 投资规模继续扩大
- 传媒公司经营范围包含什么?开一家传媒公司需要多少钱?
- 球球看看什么时候出 公测上线时间预告
- 播报:海南省琼中县发布大雾橙色预警
- 环球关注:水浒对对碰好玩吗 水浒对对碰玩法简介
- 焦点信息:抢单力度大 拿单底气足——外贸开启年底冲刺模式
- iPhone 15最核心功能被砍,安卓赢麻了
- 今日热文:网络用户如何在使用音乐时避免侵权?北京互联网法院答疑
- 你笑《贪玩蓝月》不懂游戏,《贪玩蓝月》笑你不懂人生
- 主打豪华科技配置?岚图首款纯电轿车追光正式亮相
- 团战冲冲冲什么时候出 公测上线时间预告
- 世界今亮点!国家级先进制造业集群增至45个
- 天天速读:团战冲冲冲官网在哪下载 最新官方下载安装地址
- 一线一笔画好玩吗 一线一笔画玩法简介
- 冬日鹳影丨东方白鹳:优雅的鸟界“国宝”
- 【天天速看料】Warhammer40000freeblade好玩吗 Warhammer40000freeblade玩法简介
- 每日精选:团战冲冲冲好玩吗 团战冲冲冲玩法简介
- 当前焦点!黎明暮色官网在哪下载 最新官方下载安装地址
- 布局受益数字人民币发展的上市公司
- 微速讯:加速布局海外市场,国轩高科成立泰国新国轩合资公司
- 全球信息:马斯克减持2200万股特斯拉股票 套现约35亿美元
- 最新:海南省第一中级人民法院精准“出招”化解一宗行政案件 原告当庭撤诉
- 今日快讯:《宝可梦朱紫》种子机关枪招式学习器位置介绍
- 世界速读:躺平猎梦屋好玩吗 躺平猎梦屋玩法简介
- 【当前独家】石头跳跳官网在哪下载 最新官方下载安装地址
- 《原神》七圣召唤狙神甘雨卡组攻略
- 水浒对对碰官网在哪下载 最新官方下载安装地址
- 美团外卖加强运力保障,北京接单骑手增加
- 通讯!腾讯电竞广泛布局,难逃城市同质化怪圈?
- 退货率超80%,物流快递只是替罪羊
- 环球资讯:浙江加快提升医疗救治能力 常态化开设“战疫求助平台”
- 全球新动态:茅台股东会审议275亿分红方案
- 天天头条:召唤西游什么时候出 公测上线时间预告
- 海口市“椰城云医”互联网诊疗平台上线
- 今日热闻!光遇12月15日每日任务完成方法介绍2022
- 世界新动态:海口:保障双节期间园林环卫 营造干净整洁的城乡环境
- 每日时讯!基因特工技能书怎么获取 技能书获得位置介绍
- 原神试胆大会任务1怎么过 试胆大会任务1通关攻略
- Warhammer40000freeblade什么时候出 公测上线时间预告
- 全球热推荐:华创证券11月社零数据点评:餐饮、出行类商品消费疲软 疫情冲击仍在延续
- 每日动态!工信部:1-10月全国晶硅组件出口约132GW 同比增61%
- 天天快资讯丨“好品山东”渔业品牌云展交易会开幕,供采信息实时“云”享
- 今日讯!钟南山强烈呼吁加速新冠疫苗的加强接种
- 环球消息!《战火与永恒》策划面对面|新增&调优内容报告
- 环球热推荐:《宝可梦朱紫》双打娱乐雪天队配置介绍
- 动态焦点:2022海南自由贸易港渔业产业招商推介会在海口举行
- 【全球独家】关注冬交会丨东方31家企业携火龙果等特色农产品亮相冬交会
- 世界热推荐:《源战役》星核力量绽放四部曲
- 环球实时:1216暖心情缘 《剑与契约》真气冲榜活动开启
- 环球即时看!中国(海南)国际热带农产品冬季交易会开幕
- 进出港“候鸟”旅客增多 三亚机场推出多重保障服务
- 全球报道:球球看看好玩吗 球球看看玩法简介
- 环球播报:数字创新助推铝业智造 三门峡铝业砥砺20年引领氧化铝行业发展
- 原神决意试炼通关攻略
- 今日聚焦!一人一狗辐射传奇官网在哪下载 最新官方下载安装地址
- 三亚拟对14条公交线路进行优化调整
- 当前报道:世界杯期间组织网络赌球,涉案赌资约800万元,这个团伙21人落网!
- 《女神星球》 魂卡:阿瑟 即将登场!
- 航海物语官网在哪下载 最新官方下载安装地址
- 天天快资讯:联通数科总裁李广聚:我国数字技术发展迅速 部分领域呈领跑之势
- 天天通讯!视频+多图!2022年冬交会今日开幕!带你一览新奇特优农产品盛宴
- 多家企业与海南省农科院在冬交会上集中签约
- 文远知行开启深圳首个前装量产自动驾驶小巴载人示范运营
- 全球讯息:华兴资本发布《2022中国创新经济报告》
- 即时看!武侠重开模拟器好玩吗 武侠重开模拟器玩法简介