亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍

TCP數據重傳時間細節探秘及數據中心優化
來源:易賢網 閱讀:2059 次 日期:2015-04-02 13:02:34
溫馨提示:易賢網小編為您整理了“TCP數據重傳時間細節探秘及數據中心優化”,方便廣大網友查閱!

在數據中心網絡內,機器之間數據傳輸的往返時間(rtt)一般在10ms以內,為此調內部服務的超時時間一般會設置成50ms、200ms、500ms等,如果在傳輸過程中出現丟包,這樣的服務超時時間,tcp層有機會發現并重傳一次數據么?如果設置成200ms以內,答案是沒有機會,原因是linux系統下第一次重傳時間等于傳輸的往返時間上至少加上200ms的預測偏差值,即如果rtt值是7ms,第一次重傳超時時間至少是207ms,這樣如果對某個接口的超時時間設置成200ms以內, 即便是rtt時間很小,仍然無法容忍一次丟包,因為在tcp發現丟包之前,該接口已經超時了。

本文針對linux系統tcp數據包第一次重傳時間的計算進行探究,結果會讓人大吃一驚。提出的優化方法,理論上能夠降低內部服務調用時延和出錯量。

tcp發送數據包后,會設置一個定時器,到期后如果還沒有收到對方的回復(ack),就會重傳數據包。從發出數據包到第一次重傳之間的間隔時間稱為retransmission timeout(RTO),rto由數據包的往返時間(rtt)加上rtt的預測偏差(波動值)計算出來。

即 rto = srtt + rttvar,其中srtt是rtt的平滑值,而rttvar是波動值,代表可能的預測偏差。

接下來我們做一個試驗。

先ping一下,看一下數據包的往返時間,如下:

[xiaohong@localhost ~]$ ping

PING (123.125.104.197) 56(84) bytes of data.

64 bytes from 123.125.104.197: icmp_seq=1 ttl=55 time=3.65 ms

64 bytes from 123.125.104.197: icmp_seq=2 ttl=55 time=3.38 ms

64 bytes from 123.125.104.197: icmp_seq=3 ttl=55 time=4.34 ms

64 bytes from 123.125.104.197: icmp_seq=4 ttl=55 time=7.82 ms

再看一下tcp對到的rtt相關數據,下面的命令是針對centos7(如果是以下的版本,運行的命令是ip route list tab cache)如下:

[xiaohong@localhost ~]$ sudo ip tcp_metrics

123.125.104.197 age 22.255sec rtt 7375us rttvar 7250us cwnd 10

由上面看出,平滑后的rtt值約為7ms,rttvar約為7ms,那按理說rto值應該是14ms左右,也就是等14ms后,如果沒有收到對方的響應,就會重傳數據。實際的情況會是這樣么?

在一個命令窗口里,運行下面的命令:

[xiaohong@localhost ~]$ nc 80

GET / HTTP/1.1

Host:

Connection:

同時再開一個命令行窗口里,運行下面的命令:

[xiaohong@localhost iproute2-3.19.0]$ ss -eipn '( dport = :www )'

tcp ESTAB 0 0 10.209.80.111:56486 123.125.104.197:80 users:(("nc",1713,3)) uid:1000 ino:14243 sk:ffff88002c992d00 <->

ts sack cubic wscale:0,7 rto:207 rtt:7.375/7.25 mss:1448 cwnd:10 send 15.7Mbps rcv_space:14600

從上面的結果可以看出,實際的rto值是207ms,相當于rtt值加上200ms,為什么呢?

下面從內核tcp源代碼中分析原因。

設置超時時間的函數是tcp_set_rto,在net/ipv4/tcp_input.c中,如下:

static inline void tcp_set_rto(struct sock *sk)

{

const struct tcp_sock *tp = tcp_sk(sk);

inet_csk(sk)->icsk_rto = __tcp_set_rto(tp);

tcp_bound_rto(sk);

}

可以看出,重傳的定時值isck_rto實際上是調用 __tcp_set_rto,接著看它的源碼,這個在文件include/tcp/net/tcp.h中,如下:

static inline u32 __tcp_set_rto(const struct tcp_sock *tp)

{

return (tp->srtt >> 3) + tp->rttvar;

}

為了避免浮點數運算,rtt乘以8保存在socket數據結構中,從代碼可以確認:

icsk_rto = srtt + rttvar

而計算和影響srtt和rttvar的函數是tcp_rtt_estimator,在文件net/ipv4/tcp_input.c中,代碼如下:

static void tcp_rtt_estimator(struct sock *sk, const __u32 mrtt)

{

struct tcp_sock *tp = tcp_sk(sk);

long m = mrtt; /* RTT */

/* 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 (m == 0)

m = 1;

if (tp->srtt != 0) {

m -= (tp->srtt >> 3); /* m is now error in rtt est */

tp->srtt += m; /* rtt = 7/8 rtt + 1/8 new */

if (m < 0) {

m = -m; /* m is now abs(error) */

m -= (tp->mdev >> 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 >> 2); /* similar update on mdev */

}

tp->mdev += m; /* mdev = 3/4 mdev + 1/4 new */

if (tp->mdev > tp->mdev_max) {

tp->mdev_max = tp->mdev;

if (tp->mdev_max > tp->rttvar)

tp->rttvar = tp->mdev_max;

}

if (after(tp->snd_una, tp->rtt_seq)) {

if (tp->mdev_max < tp->rttvar)

tp->rttvar -= (tp->rttvar - tp->mdev_max) >> 2;

tp->rtt_seq = tp->snd_nxt;

tp->mdev_max = tcp_rto_min(sk);

}

} else {

/* no previous measure. */

tp->srtt = m << 3; /* take the measured time to be rtt */

tp->mdev = m << 1; /* make sure rto = 3*rtt */

tp->mdev_max = tp->rttvar = max(tp->mdev, tcp_rto_min(sk));

tp->rtt_seq = tp->snd_nxt;

}

}

從上面的代碼可以看出,srtt = 7/8 old srtt + 1/8 new rtt,這個跟RFC一致,沒有啥可以說的。

獲得第一個往返時間數據時(一般是建立連接完成時,對于客戶端就是發出sync請求,收到服務端的回應時,而對于服務器端就是發出syc+ack后,收到客戶端的ack時)的計算分析如下:

} else {

/* no previous measure. */

/* 以前沒有rtt的數據,這是收到第一個rtt的樣本數據的代碼邏輯 */

/* m是本次的rtt值,乘以8保存到 srtt中 */

tp->srtt = m << 3; /* take the measured time to be rtt */

/* rtt的初始偏差值mdev是 2倍rtt值 */

tp->mdev = m << 1; /* make sure rto = 3*rtt */

/* 設置rttvar和rtt偏差的最大值mdev_max這兩者的初始值 */

/* 2倍的rtt值,tcp_rto_min之間,那個大,就選那個 */

tp->mdev_max = tp->rttvar = max(tp->mdev, tcp_rto_min(sk));

tp->rtt_seq = tp->snd_nxt;

}

再看tcp_rto_min的代碼,在文件include/net/tcp.h中:

static inline u32 tcp_rto_min(struct sock *sk)

{

struct dst_entry *dst = __sk_dst_get(sk);

u32 rto_min = TCP_RTO_MIN; /* 200ms */

if (dst && dst_metric_locked(dst, RTAX_RTO_MIN))

rto_min = dst_metric_rtt(dst, RTAX_RTO_MIN);

return rto_min;

}

結合起來看,如果第一個數據包往返時間在100ms以內,rtt預測初始的偏差值就固定為200ms,當數據包往返時間超過100ms,rtt預測偏差的初始值是2倍的rtt值,也就是說rttvar最小值是200ms。

接著分析計算和影響srtt和rttvar的函數是tcp_rtt_estimator的代碼:

if (tp->mdev > tp->mdev_max) {

/* 跟蹤rtt的偏差,記錄偏差最大值mdev_max */

tp->mdev_max = tp->mdev;

if (tp->mdev_max > tp->rttvar) /* 偏差最大值大于 rttvar時,rttvar跟著變大 */

tp->rttvar = tp->mdev_max;

}

if (after(tp->snd_una, tp->rtt_seq)) {

/* 偏差最大值小于 rttvar時,rttvar也會相應減少 */

if (tp->mdev_max < tp->rttvar)

tp->rttvar -= (tp->rttvar - tp->mdev_max) >> 2;

tp->rtt_seq = tp->snd_nxt;

/* 每個發送周期結束,重置mdev_max為tcp_rto_min */

tp->mdev_max = tcp_rto_min(sk);

}

也就是說,rtt預測偏差值rttvar會跟著實際的rtt預測偏差值變化,如果波動變大,則跟著變大,反之,如果波動變小,也會跟著變小。但因為每個發送周期內,偏差的最大值會重置為tcp_rto_min,所以,rtt預測偏差值rttvar不會小于200ms。

那這200ms的限制,有啥簡單的方法調整么?繼續看tcp_rto_min的代碼,前面也貼過,如下:

static inline u32 tcp_rto_min(struct sock *sk)

{

struct dst_entry *dst = __sk_dst_get(sk);

u32 rto_min = TCP_RTO_MIN; /* 200ms */

if (dst && dst_metric_locked(dst, RTAX_RTO_MIN))

rto_min = dst_metric_rtt(dst, RTAX_RTO_MIN);

return rto_min;

}

從上面的代碼可以看出,如果對應的目標的路由表項中設置了rto_min值,則以設置的值為準。這可以通過netlink機制來修改,具體可以通過ip route命令,增加rto_min選項來完成。

分析完源代碼,接著試驗一下。

運行下面的命令修改成20ms:

sudo ip route add 123.125.104.197/32 via 10.209.83.254 rto_min 20

看以下修改后的結果:

[xiaohong@localhost ~]$ ip route list

default via 10.209.83.254 dev enp0s3 proto static metric 1024

10.209.80.0/22 dev enp0s3 proto kernel scope link src 10.209.80.111

123.125.104.197 via 10.209.83.254 dev enp0s3 rto_min lock 20ms

清除以下路由表的緩存,這樣可以立即查看效果:

sudo ip tcp_metrics flush

再測試訪問weibo.com:

[xiaohong@localhost ~]$ nc80

GET /

在另外的終端中確認一下結果:

[xiaohong@localhost iproute2-3.19.0]$ ss -eipn '( dport = :www )'

tcp ESTAB 0 0 10.209.80.111:56487 123.125.104.197:80 users:(("nc",1786,3)) uid:1000 ino:14606 sk:ffff88002c992d00 <->

ts sack cubic wscale:0,7 rto:22 rtt:2/1 mss:1448 cwnd:10 send 57.9Mbps rcv_space:14600

可以看出,本次的rtt值是2ms,rto為22ms,即已經生效。

歡迎一起討論,拍磚也可以。呵呵。

更多信息請查看IT技術專欄

更多信息請查看技術文章
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權所有:易賢網

亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍
在线看片一区| 亚洲精品系列| 黄色亚洲在线| 伊人精品在线| 午夜在线精品| 激情视频一区| 噜噜噜躁狠狠躁狠狠精品视频| 久久久久久久久一区二区| 国产精品videosex极品| aa亚洲婷婷| 欧美另类视频| 免费精品视频| 99国产精品久久久久老师 | 亚洲国产片色| 亚洲欧美大片| 在线精品一区| 快she精品国产999| 国产亚洲午夜| 亚洲丰满在线| 欧美激情第六页| 国产精品人人爽人人做我的可爱| 欧美激情无毛| 美女黄色成人网| 一本一本久久a久久精品综合妖精| 久久香蕉精品| 免费看的黄色欧美网站| 国产区日韩欧美| 含羞草久久爱69一区| 久久精品盗摄| 裸体丰满少妇做受久久99精品| 亚洲激情午夜| 亚洲黄色成人久久久| 欧美视频一区| 国模吧视频一区| 欧美婷婷久久| 亚洲午夜精品久久久久久浪潮| 欧美精品尤物在线| 欧美日韩国产高清| 欧美视频日韩| 国产在线不卡| 亚洲性人人天天夜夜摸| 国产精品观看| 国产伊人精品| 激情久久一区| 一级日韩一区在线观看| 在线亚洲美日韩| 亚洲色诱最新| 亚洲综合国产激情另类一区| 午夜在线a亚洲v天堂网2018| 亚洲一区黄色| 老司机精品久久| 国产精品大片| 日韩五码在线| 亚洲女优在线| 欧美破处大片在线视频| 一区二区三区我不卡| 悠悠资源网久久精品| 影音先锋一区| 亚洲一区在线免费| 欧美成人有码| 在线成人h网| 一本色道久久综合亚洲精品不卡| 一区二区三区四区五区精品| 午夜亚洲性色福利视频| 欧美黄色一区| 亚洲美女一区| 蜜乳av另类精品一区二区| 久久综合伊人| 亚洲精品婷婷| 久久亚洲电影| 最新国产乱人伦偷精品免费网站| 一本色道精品久久一区二区三区| 国产精品久久久亚洲一区| 欧美a级一区| 一本色道久久综合亚洲精品婷婷 | 欧美日韩精品免费观看| 欧美涩涩网站| 国产精品推荐精品| 激情久久综合| 久久综合久久久| 一本久道久久久| 欧美精选在线| 亚洲资源av| 精品999日本| 欧美一区91| 亚洲综合首页| 99亚洲精品| 一区二区三区我不卡| 久久国产欧美精品| 国产精品亚洲综合色区韩国| 精品69视频一区二区三区Q| 亚洲免费一区二区| 在线亚洲美日韩| 在线看片成人| 欧美午夜视频| 欧美激情麻豆| 欧美aⅴ99久久黑人专区| 国产精品一区二区三区免费观看| 精品福利av| 国模一区二区三区| 国产精品分类| 国产一区再线| 国模大胆一区二区三区| 欧美日韩1区| 午夜精品偷拍| 欧美性天天影院| 欧美日韩综合| 黄色亚洲在线| 亚洲激情女人| 日韩一区二区久久| 国产日韩欧美一区二区三区在线观看 | 久久久精品性| 久久久久综合| 亚洲欧美综合| 久热国产精品| 国产一区观看| 禁久久精品乱码| 亚洲国产免费| 国产精品亚洲综合| 久久经典综合| 欧美色图麻豆| 亚洲私人影院| av成人激情| 美日韩免费视频| 欧美日韩网址| 99精品欧美| 亚洲欧美日本日韩| 欧美一区二区三区在线免费观看| 久久综合精品一区| 极品中文字幕一区| 亚洲一区二区三区涩| 久久国产精品一区二区三区| 久久精品国产第一区二区三区最新章节 | 夜夜夜久久久| 亚久久调教视频| 午夜精品亚洲| 一本久道久久综合婷婷鲸鱼| 中文欧美日韩| 老司机精品福利视频| 欧美日韩一区二区高清| 激情成人综合| 国产精品主播| 欧美三日本三级少妇三99| 亚洲国产精品久久久久久女王| 亚洲毛片视频| 欧美日本一区二区高清播放视频| 影音先锋中文字幕一区二区| 国产精品美女久久久浪潮软件| 久久精品麻豆| 夜久久久久久| 国产精品大全| 国产精品普通话对白| 欧美精品尤物在线| 国产精品一区在线观看| 欧美精品一区二区三区在线看午夜| 黄色成人av网站| 西西人体一区二区| 亚洲人妖在线| 欧美网站在线| 久久久久久精| 国产偷久久久精品专区| 欧美日韩一区二| 国产精品日本| 亚洲国产欧洲综合997久久| 玖玖精品视频| 久久久国产亚洲精品| 亚洲深夜av| 99热这里只有精品8| 黑丝一区二区三区| 欧美精品一区二区三区在线看午夜 | 亚洲福利国产| 欧美日韩日本国产亚洲在线| 国产精品久久久久久久久久妞妞| 狠色狠色综合久久| 欧美少妇一区| 欧美理论在线| 欧美日韩无遮挡| 欧美日韩一区二区三区在线观看免 | 国精品一区二区三区| 美女国产精品| 母乳一区在线观看| 亚洲在线国产日韩欧美| 亚洲欧洲综合| 在线日本高清免费不卡| 国内成人在线| 亚洲一二区在线| 极品中文字幕一区| 亚洲一级一区| 影音先锋久久资源网| 一区久久精品| 激情自拍一区| 亚洲毛片网站| 国产手机视频一区二区| 国产伦精品一区二区三区照片91| 一本一本久久| 国产偷自视频区视频一区二区| 一区二区三区成人精品| 国产日韩欧美一区在线| 欧美亚洲三区| 午夜精品一区二区在线观看| 欧美一区二区三区久久精品茉莉花| 久久亚洲一区二区| 欧美日韩一区在线观看视频| 国产一区二区三区四区hd| 亚洲东热激情| 国产亚洲精品自拍| 噜噜噜噜噜久久久久久91| 欧美一区二区三区在线播放| 欧美日韩一区在线观看视频| 亚洲高清激情| 麻豆精品91| 国模精品娜娜一二三区| 在线天堂一区av电影| 久久综合九色综合网站| 极品av少妇一区二区| 国产精品久久久久久久久久直播| 久久精品日产第一区二区三区| 欧美99在线视频观看| 精品动漫3d一区二区三区免费| 99综合精品| 欧美高清一区| 国产亚洲毛片在线| 国产综合色产| 鲁大师成人一区二区三区| 午夜久久美女| 国产精品永久入口久久久| 欧美xxx在线观看| 国产欧美精品久久| 好吊日精品视频| 亚洲欧美日韩国产一区| 伊人久久亚洲美女图片| 久久精品国产清高在天天线| 最新亚洲一区| 国产精品xxx在线观看www| 国产精品久久777777毛茸茸| 欧美日韩网站| 女人天堂亚洲aⅴ在线观看| 夜夜精品视频| 国内在线观看一区二区三区| 嫩草成人www欧美| 亚洲国内精品| 国产在线视频欧美一区二区三区| 国产精品一区免费观看| 亚洲激情偷拍| 亚洲国产第一| 亚洲午夜激情| 国产精品www994| 老司机精品视频网站| 亚洲一区二区三区精品视频| 日韩视频精品| 一本色道久久综合亚洲精品不 | 久久一综合视频| 国产视频一区免费看| 亚洲黄色视屏| 亚洲无线一线二线三线区别av| 欧美在线三区| 欧美一区二区三区在线播放| 国产精品久久久亚洲一区| 一本色道精品久久一区二区三区| 国产综合18久久久久久| 欧美日韩亚洲一区| 国产精品av久久久久久麻豆网| 老司机午夜精品视频在线观看| 亚洲欧美网站| 久久亚洲不卡| 国产精品久久7| 亚洲第一黄网| 国产一区二区三区久久久久久久久 | 性感少妇一区| 久久aⅴ国产紧身牛仔裤| 国产精品资源| 久久久水蜜桃| 欧美日韩亚洲三区| 亚洲大胆在线| 国产亚洲一级| 久久综合影音| 激情综合视频| 国产麻豆综合| 午夜亚洲福利| 亚洲全部视频| 亚洲一区三区电影在线观看| 久久久久国产精品午夜一区| 欧美日本亚洲韩国国产| 在线欧美日韩| 性色一区二区| 欧美日韩精品| 中文精品视频| 欧美日韩国产探花| 亚洲黄色天堂| 久久精品官网| 亚洲国产国产亚洲一二三| 中国成人亚色综合网站| 久久亚洲精选| 日韩视频一区| 久久久噜噜噜| 亚洲精品九九| 欧美一区精品| 国产视频久久| 亚洲欧美影院| 亚洲一区二区毛片| 精品1区2区| 狂野欧美一区| 国产精品久久久久久久久久妞妞| 欧美一区不卡| 国产精品日韩一区二区三区| 欧美日韩一区在线播放| 亚洲一区二区精品在线| 亚洲午夜电影| 亚洲欧美一区在线| 免费在线成人| 一区二区激情| 国产综合自拍| 快she精品国产999| 国产偷久久久精品专区| 黄色av成人| 欧美三级小说| 欧美在线免费| 久久久久久夜| 亚洲一区成人| 国产亚洲一区在线播放| 亚洲欧洲久久| 亚洲欧洲一区二区在线观看| 欧美午夜欧美| 欧美片第1页综合| 久久久一本精品99久久精品66| 在线一区欧美| 日韩亚洲视频在线| 亚洲国产一区二区精品专区| 国产精品vip| 欧美一区2区三区4区公司二百| 亚洲一区二区三区精品动漫| aa级大片欧美三级| 99成人在线| 一区二区毛片| 国产一区二区久久久| 一区二区福利| 亚洲一区激情| 久久久久成人精品免费播放动漫| 亚洲一区二区三区精品动漫| 在线亚洲伦理| 国产麻豆日韩| 美女久久网站| 午夜精品网站| 欧美日韩在线不卡一区| 欧美日韩一区二区三| 国产精品二区在线| 激情久久一区| 亚洲深夜福利| 久久aⅴ乱码一区二区三区| 噜噜噜91成人网| 欧美成人综合| 狠狠色狠狠色综合人人| 亚洲精品久久久久久一区二区| av不卡在线看| 亚洲欧美成人| 欧美激情视频一区二区三区免费| 欧美精品黄色| 亚洲精品黄色| 免费欧美日韩| 欧美三级黄美女| 亚洲二区免费| 亚洲欧美日韩另类精品一区二区三区| 免费日韩av| 黄色亚洲免费| 国产精品综合色区在线观看| 久久久久久9| 亚洲小说欧美另类社区| 一级日韩一区在线观看| 销魂美女一区二区三区视频在线| 老司机久久99久久精品播放免费 | 性欧美xxxx大乳国产app| 久久久国产精品一区二区三区| 欧美精品一区在线发布| 亚洲精品护士| 欧美福利专区| 亚洲精品自在在线观看| 久久精品欧美| 亚洲人成人一区二区三区| 久久精品伊人| 亚洲日本无吗高清不卡| 巨乳诱惑日韩免费av| 日韩亚洲一区在线播放| 欧美激情一级片一区二区| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美一区二区三区在线播放 | 影音先锋在线一区| 性一交一乱一区二区洋洋av| 亚洲一本视频| 欧美日韩国产三区| 久久av二区| 国产精品久久九九| 在线观看欧美一区| 久热综合在线亚洲精品| 国产区欧美区日韩区| 国户精品久久久久久久久久久不卡| 亚洲综合电影一区二区三区| 亚洲欧洲视频| 亚洲国产裸拍裸体视频在线观看乱了中文| 久久精品123| 性久久久久久|