青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

libjingle源碼解析(6)-【PseudoTcp】建立UDP之上的TCP(4):超時(shí)與重傳

轉(zhuǎn)載自:http://blog.csdn.net/leehark/article/details/7700931

超時(shí)與重傳

 

    TCP是面向連接的可靠的運(yùn)輸層。當(dāng)數(shù)據(jù)丟失時(shí),TCP需要重傳包。TCP通過設(shè)置定時(shí)器解決這種問題。

    對(duì)每個(gè)連接,TCP4個(gè)不同的定時(shí)器:

        1)重傳定時(shí)器:用于當(dāng)希望收到另一端的確認(rèn),而沒有收到時(shí)。

        2)堅(jiān)持定時(shí)器:使窗口大小信息保持不斷流動(dòng)。

        3)?;疃〞r(shí)器:可檢測(cè)空閑連接另一端何時(shí)崩潰或重啟。

        4)2MSL定時(shí)器:測(cè)量TIME_WAIT狀態(tài)的時(shí)間。

 

    PTCP本身是沒有提供定時(shí)器的,而通過方法GetNextClock讓調(diào)用者獲取下一個(gè)定時(shí)器觸發(fā)的時(shí)機(jī),當(dāng)定時(shí)器觸發(fā)下一個(gè)超時(shí)時(shí),需要調(diào)用方法NotifyClock。

 

超時(shí)時(shí)間設(shè)置

 

    TCP設(shè)置獲得確認(rèn)ACK包的超時(shí)時(shí)間設(shè)置序列可能為1.5S,3S,6S,12S,24S,48S,64S,當(dāng)超時(shí)持續(xù)時(shí)間多于9分鐘時(shí),TCP會(huì)被復(fù)位(RST),即“指數(shù)退避”。

    那么這個(gè)超時(shí)值是怎么計(jì)算呢?

    如果能很好的估計(jì)RTT話,如果確認(rèn)包在一個(gè)RTT之內(nèi)沒有收到回報(bào),那么可以認(rèn)為丟包發(fā)生。

    TCP最初的RTT估算方法為

        R = aR+(1-a)M

    其中平滑因子a取為90%,M表示這次測(cè)量的RTT,即這個(gè)包發(fā)送到獲取ACK的時(shí)間間隔。

    這個(gè)算法通過平滑因子來避免R的值受新的M的浮動(dòng)過大的影響。然而這恰恰在RTT浮動(dòng)比較大的連接中無法及時(shí)的反應(yīng)連接情況。并且網(wǎng)絡(luò)處于飽和狀態(tài)時(shí),頻繁重傳會(huì)導(dǎo)致火上燒油。Jacobson對(duì)此設(shè)計(jì)了新的算法:

        Err = M - A

        A = A+g*Err

        D = D + h(|Err| -D)

        RTO = A + 4D

    增量g0.125(1/8),Err為上一個(gè)得到的值和新的RTT的差。A為上一個(gè)測(cè)到的增量后的數(shù)據(jù),h0.25。

當(dāng)RTT變化大時(shí),Err也會(huì)變大,導(dǎo)致D也會(huì)變大,導(dǎo)致RTO快速上升。某一次連接的估值和真正的RTT關(guān)系估下:

 

 

     PTCP實(shí)現(xiàn)如下:

     PTCP設(shè)置最大超時(shí)時(shí)間為60S。當(dāng)收到ACK時(shí),計(jì)算RTT是通過PTCP頭部的TimeStamp差值計(jì)算,所以Karn算法在此不管用。RTO的算法和上面所述一致:

         1)Err = rtt - m_rx_srtt

         2)D=D+0.25*(abs(Err-D))

         3)m_rx_srtt = m_rx_srtt + err/8

         4)RTO = m_rx_srtt+D

     下面的代碼實(shí)現(xiàn),有一定的不同,但仔細(xì)分析和上面算法是一致的。

 

 

 

  1. bool PseudoTcp::process(Segment& seg) {  
  2. ......  
  3.  // Check if this is a valuable ack  
  4.   if ((seg.ack > m_snd_una) && (seg.ack <= m_snd_nxt)) {  
  5.     // Calculate round-trip time  
  6.     if (seg.tsecr) {  
  7.       long rtt = talk_base::TimeDiff(now, seg.tsecr);//計(jì)算RTT  
  8.       if (rtt >= 0) {  
  9.         if (m_rx_srtt == 0) {  
  10.           m_rx_srtt = rtt;  
  11.           m_rx_rttvar = rtt / 2;  
  12.         } else {  
  13.           m_rx_rttvar = (3 * m_rx_rttvar + abs(long(rtt - m_rx_srtt))) / 4;  
  14.           m_rx_srtt = (7 * m_rx_srtt + rtt) / 8;  
  15.         }  
  16.         m_rx_rto = bound(MIN_RTO, m_rx_srtt +  
  17.             talk_base::_max<uint32>(1, 4 * m_rx_rttvar), MAX_RTO);  
  18.       } else {  
  19.         ASSERT(false);  
  20.       }  
  21.     }  
  22. ......  
  23. }  


 

 

    當(dāng)重傳后,仍然超時(shí)時(shí),PTCP也采用指數(shù)退避算法。

擁塞避免算法

 

    擁塞避免算法通常和慢啟動(dòng)算法一起使用,主要是限制發(fā)送方的流量。慢啟動(dòng)的目的是,不要過快的發(fā)送數(shù)據(jù)導(dǎo)致中間的路由器填滿緩沖,而擁塞避免算法是當(dāng)發(fā)現(xiàn)到網(wǎng)絡(luò)被擁塞時(shí)限制發(fā)送方處理丟失分組的一種方法。

    擁塞避免算法和慢啟動(dòng)算法同時(shí)在一個(gè)連接上維護(hù)兩個(gè)變量cwndssthresh。

        1)對(duì)一個(gè)給定連接cwnd初始化為1。

        2)當(dāng)擁塞發(fā)生時(shí)(超時(shí)或者受到重復(fù)的第三個(gè)ack)時(shí)ssthreth取當(dāng)前窗口的一半,如果超時(shí)引起的擁塞,則cwnd取為1。

        3)當(dāng)新的數(shù)據(jù)包受到確認(rèn)時(shí),如果cwnd<ssthreth則進(jìn)行慢啟動(dòng)算法,否則cwnd在每個(gè)確認(rèn)增加1/cwnd。

 

快速重傳與快速恢復(fù)算法

 

     為什么上面判斷擁塞時(shí),獲得三個(gè)以上重復(fù)的ACK時(shí),認(rèn)為產(chǎn)生擁塞了呢?

     因?yàn)?,?dāng)接收方收到失序的報(bào)文段時(shí),立即發(fā)送需要收到的下一個(gè)報(bào)文段,然而發(fā)送方發(fā)送兩個(gè)以上報(bào)文時(shí),因報(bào)文的路由不一樣,會(huì)產(chǎn)生短暫的失序,為了避免因此而產(chǎn)生的重傳,把擁塞判斷設(shè)置為3個(gè)以上。

     當(dāng)收到三個(gè)以上重復(fù)報(bào)文段時(shí),發(fā)送方認(rèn)為此包被丟失,于是立即重傳丟失報(bào)文段,不會(huì)等到超時(shí)定時(shí)器溢出。這就是快速重傳算法。

 

     當(dāng)發(fā)送方重傳后,會(huì)持續(xù)發(fā)送后面沒有發(fā)送的數(shù)據(jù),而不啟動(dòng)慢啟動(dòng),等待ACK,是因?yàn)榘l(fā)送方收到了連續(xù)的3個(gè)以上ACK說明,接收方收到了3個(gè)以上數(shù)據(jù)報(bào)文,并緩存起來了。這就是快速恢復(fù)算法,實(shí)現(xiàn)如下:

        1)當(dāng)收到3個(gè)重復(fù)ACK時(shí)ssthreth設(shè)置為當(dāng)前窗口的一半,并cwnd設(shè)置為ssthresh+3。

        2)每次收到另一個(gè)重復(fù)的ACK時(shí),cwnd增加一個(gè)報(bào)文段并重傳。

        3)當(dāng)下一個(gè)ACK到達(dá)時(shí)cwdn設(shè)置為ssthreth,即采用擁塞避免,速率減半。

    對(duì)于重傳PTCP有一點(diǎn)不同,就是上述第一步,當(dāng)收到重復(fù)3個(gè)ACK時(shí),ssthresh設(shè)置為還未確認(rèn)的字節(jié)數(shù)的一半。

 

  1. bool PseudoTcp::process(Segment& seg) {  
  2. ......  
  3.     if ((seg.ack > m_snd_una) && (seg.ack <= m_snd_nxt)) {//當(dāng)收到合法的ACK時(shí)  
  4. ......  
  5.     if (m_dup_acks >= 3) {//如果進(jìn)行過重傳  
  6.       if (m_snd_una >= m_recover) { // 時(shí)重傳后的數(shù)據(jù)確認(rèn)  
  7.         uint32 nInFlight = m_snd_nxt - m_snd_una;//未確認(rèn)數(shù)據(jù)  
  8.         m_cwnd = talk_base::_min(m_ssthresh, nInFlight + m_mss); // cwnd設(shè)置為ssthreth  
  9.         m_dup_acks = 0;//重復(fù)ACK計(jì)數(shù)器清零  
  10.       } else {  
  11.         if (!transmit(m_slist.begin(), now)) {//慢啟動(dòng)、繼續(xù)傳送  
  12.           closedown(ECONNABORTED);  
  13.           return false;  
  14.         }  
  15.         m_cwnd += m_mss - talk_base::_min(nAcked, m_cwnd);  
  16.       }  
  17.     } else {  
  18.       m_dup_acks = 0;  
  19.       // Slow start, congestion avoidance  
  20.       if (m_cwnd < m_ssthresh) {//慢啟動(dòng)  
  21.         m_cwnd += m_mss;  
  22.       } else {  
  23.         m_cwnd += talk_base::_max<uint32>(1, m_mss * m_mss / m_cwnd);//擁塞避免,增加1/cwnd  
  24.       }  
  25.      }  
  26.     }  
  27.     else if (seg.ack == m_snd_una) {  
  28.       // !?! Note, tcp says don't do this... but otherwise how does a closed window become open?  
  29.       m_snd_wnd = static_cast<uint32>(seg.wnd) << m_swnd_scale;  
  30.       // Check duplicate acks  
  31.       if (seg.len > 0) {  
  32.         // it's a dup ack, but with a data payload, so don't modify m_dup_acks  
  33.       } else if (m_snd_una != m_snd_nxt) {  
  34.         m_dup_acks += 1;  
  35.         if (m_dup_acks == 3) { //當(dāng)收到3個(gè)重復(fù)的ACK時(shí)進(jìn)行快速重傳  
  36.           if (!transmit(m_slist.begin(), now)) {  
  37.             closedown(ECONNABORTED);  
  38.             return false;  
  39.           }  
  40.           m_recover = m_snd_nxt;  
  41.           uint32 nInFlight = m_snd_nxt - m_snd_una;  
  42.           m_ssthresh = talk_base::_max(nInFlight / 2, 2 * m_mss);//ssthresh設(shè)置為2個(gè)MSS和cwnd的最小值  
  43.           m_cwnd = m_ssthresh + 3 * m_mss;//cwnd設(shè)置為ssthresh加3  
  44.         } else if (m_dup_acks > 3) {  
  45.           m_cwnd += m_mss;//當(dāng)收到發(fā)送重傳后的重復(fù)的ACK時(shí),只增加一個(gè)MSS,即快速恢復(fù)算法  
  46.         }  
  47.       } else {  
  48.         m_dup_acks = 0;  
  49.       }  
  50.     }  
  51. ......  
  52. }  


 

 

重新分組

    當(dāng)TCP超時(shí)重傳時(shí),可以允許以更大的且不大于MSS的報(bào)文發(fā)送,即合并后續(xù)的數(shù)據(jù)一起發(fā)送,PTCP也是如此處理的。


posted on 2013-09-01 14:08 楊粼波 閱讀(626) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产精品悠悠久久琪琪| 久久久精品国产一区二区三区| 亚洲欧美日韩视频一区| 日韩一级黄色片| 欧美福利在线| 欧美韩国日本综合| 亚洲国产高清视频| 久久精品免费播放| 免费一级欧美片在线观看| 欧美一区日韩一区| 在线精品亚洲| 亚洲欧洲另类国产综合| 亚洲精品在线观看视频| 亚洲麻豆一区| 亚洲欧美日韩精品久久| 欧美一区二区三区日韩视频| 午夜久久美女| 久久影视精品| 日韩一级视频免费观看在线| 亚洲一区免费观看| 亚洲女人小视频在线观看| 免费欧美在线视频| 欧美日本二区| 国产综合香蕉五月婷在线| 亚洲美女中文字幕| 欧美一级久久久| 亚洲高清影视| 午夜精品久久久久久久蜜桃app| 欧美影片第一页| 欧美激情在线有限公司| 国产亚洲在线| 一区二区三区欧美视频| 久久久久久久久久久久久久一区 | 国产精品视频99| 亚洲精品中文字幕女同| 欧美一区二区三区视频| 欧美福利视频| 国产一区二区电影在线观看| 亚洲乱码国产乱码精品精98午夜| 午夜性色一区二区三区免费视频| 欧美成人性生活| 性高湖久久久久久久久| 欧美精品久久99| 精品51国产黑色丝袜高跟鞋| 99日韩精品| 麻豆freexxxx性91精品| 亚洲私拍自拍| 欧美精品免费视频| 亚洲欧洲免费视频| 女同一区二区| 久久精品夜色噜噜亚洲a∨ | 亚洲最快最全在线视频| 久久久久9999亚洲精品| 国产精品乱子久久久久| 免费永久网站黄欧美| 久久久无码精品亚洲日韩按摩| 欧美极品在线视频| 亚洲高清电影| 久久综合成人精品亚洲另类欧美 | 国产精品国产三级国产aⅴ9色| 一区二区三区在线视频免费观看| 欧美一区二区三区视频在线观看 | 亚洲精品视频在线看| 久久精品99| 国语自产精品视频在线看抢先版结局 | 亚洲一区一卡| 亚洲全黄一级网站| 蜜臀久久久99精品久久久久久| 韩国av一区二区三区| 久久亚洲国产成人| 久久综合伊人77777蜜臀| 亚洲国产电影| 亚洲国产欧美一区二区三区丁香婷| 美女精品一区| 中文在线不卡| 欧美一区二区三区精品 | 亚洲人精品午夜在线观看| 欧美激情在线有限公司| 免费不卡在线视频| 99热免费精品| 亚洲一区在线观看视频| 狠狠久久综合婷婷不卡| 久久精品夜色噜噜亚洲aⅴ| 亚洲黄色影片| 国产精品久久久久77777| 亚洲女人天堂av| 欧美亚洲一区二区在线| 国产一区二区三区自拍| 狂野欧美激情性xxxx欧美| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲精品专区| 一区二区高清在线观看| 国产欧美日韩综合精品二区| 噜噜噜91成人网| 欧美日韩你懂的| 久久国产精品一区二区三区四区| 美女精品自拍一二三四| 亚洲欧美在线看| 欧美成人免费全部观看天天性色| 亚洲一区二区高清视频| 久久国产天堂福利天堂| 亚洲少妇自拍| 久久一区国产| 欧美一级片一区| 欧美日本一区| 久久久久久999| 欧美日韩成人免费| 久久久久国产精品人| 国产日韩欧美精品在线| 欧美尤物巨大精品爽| 麻豆精品一区二区综合av| 亚洲一区二区三区免费在线观看| 香蕉久久夜色精品国产使用方法 | 亚洲欧美日韩国产精品| 一本色道久久综合亚洲91| 国产综合网站| 亚洲精品字幕| 在线日本欧美| 亚洲男人的天堂在线| 一区二区久久久久| 欧美**字幕| 免费成人黄色片| 国产亚洲一区二区三区在线观看| 艳妇臀荡乳欲伦亚洲一区| 亚洲三级电影全部在线观看高清| 性欧美大战久久久久久久免费观看 | 麻豆亚洲精品| 国产一区二区三区网站| 亚洲色诱最新| 午夜精品短视频| 国产精品久久久久av免费| 亚洲免费高清| 亚洲一区二区精品在线| 欧美午夜片欧美片在线观看| 亚洲精品男同| 国产精品99久久久久久久vr| 欧美电影在线观看完整版| 欧美成人性网| 在线看国产一区| 开心色5月久久精品| 狼人社综合社区| 在线免费精品视频| 久久天天躁狠狠躁夜夜av| 久久综合九色欧美综合狠狠| 国产精品国产三级国产普通话三级 | 亚洲福利视频一区二区| 精品51国产黑色丝袜高跟鞋| 久久久伊人欧美| 欧美+亚洲+精品+三区| 亚洲国产精品一区二区第四页av| 久久久亚洲欧洲日产国码αv| 麻豆国产精品一区二区三区 | 亚洲欧美国产另类| 国产伦理一区| 亚欧成人在线| 老司机67194精品线观看| 亚洲高清在线观看一区| 久久亚洲精品中文字幕冲田杏梨 | 亚洲免费观看在线观看| 欧美~级网站不卡| a91a精品视频在线观看| 亚洲欧美日韩综合一区| 亚洲精品黄色| 国产精品天天摸av网| 欧美一级黄色网| 欧美α欧美αv大片| 日韩小视频在线观看| 欧美日韩中文精品| 亚洲欧美精品一区| 亚洲欧美一区二区三区久久| 国产精品亚洲第一区在线暖暖韩国| 欧美一区二区视频在线观看2020 | 在线播放亚洲一区| 欧美二区在线观看| 亚洲综合成人婷婷小说| 免费看亚洲片| 亚洲欧美另类在线| 国产欧美日韩免费| 欧美va亚洲va日韩∨a综合色| 日韩亚洲精品在线| 久久久精品国产一区二区三区| 亚洲精品欧美在线| 国产精品丝袜白浆摸在线| 美女日韩在线中文字幕| 日韩一区二区精品视频| 性色av一区二区三区| 亚洲国产精品久久久久秋霞不卡 | 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产九色精品成人porny| 久久综合九色九九| 亚洲欧美日韩一区二区| 日韩亚洲欧美精品| 久久亚洲不卡| 久久精品72免费观看| 夜夜夜精品看看| 一区二区三区在线免费播放| 欧美成人免费va影院高清| 亚洲女同精品视频| 国产精品99久久久久久久久| 欧美国产精品va在线观看|