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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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):超時與重傳

轉載自:http://blog.csdn.net/leehark/article/details/7700931

超時與重傳

 

    TCP是面向連接的可靠的運輸層。當數據丟失時,TCP需要重傳包。TCP通過設置定時器解決這種問題。

    對每個連接,TCP4個不同的定時器:

        1)重傳定時器:用于當希望收到另一端的確認,而沒有收到時。

        2)堅持定時器:使窗口大小信息保持不斷流動。

        3)保活定時器:可檢測空閑連接另一端何時崩潰或重啟。

        4)2MSL定時器:測量TIME_WAIT狀態的時間。

 

    PTCP本身是沒有提供定時器的,而通過方法GetNextClock讓調用者獲取下一個定時器觸發的時機,當定時器觸發下一個超時時,需要調用方法NotifyClock。

 

超時時間設置

 

    TCP設置獲得確認ACK包的超時時間設置序列可能為1.5S3S6S12S24S48S64S,當超時持續時間多于9分鐘時,TCP會被復位(RST),即“指數退避”。

    那么這個超時值是怎么計算呢?

    如果能很好的估計RTT話,如果確認包在一個RTT之內沒有收到回報,那么可以認為丟包發生。

    TCP最初的RTT估算方法為

        R = aR+(1-a)M

    其中平滑因子a取為90%M表示這次測量的RTT,即這個包發送到獲取ACK的時間間隔。

    這個算法通過平滑因子來避免R的值受新的M的浮動過大的影響。然而這恰恰在RTT浮動比較大的連接中無法及時的反應連接情況。并且網絡處于飽和狀態時,頻繁重傳會導致火上燒油。Jacobson對此設計了新的算法:

        Err = M - A

        A = A+g*Err

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

        RTO = A + 4D

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

RTT變化大時,Err也會變大,導致D也會變大,導致RTO快速上升。某一次連接的估值和真正的RTT關系估下:

 

 

     PTCP實現如下:

     PTCP設置最大超時時間為60S。當收到ACK時,計算RTT是通過PTCP頭部的TimeStamp差值計算,所以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

     下面的代碼實現,有一定的不同,但仔細分析和上面算法是一致的。

 

 

 

  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);//計算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. }  


 

 

    當重傳后,仍然超時時,PTCP也采用指數退避算法。

擁塞避免算法

 

    擁塞避免算法通常和慢啟動算法一起使用,主要是限制發送方的流量。慢啟動的目的是,不要過快的發送數據導致中間的路由器填滿緩沖,而擁塞避免算法是當發現到網絡被擁塞時限制發送方處理丟失分組的一種方法。

    擁塞避免算法和慢啟動算法同時在一個連接上維護兩個變量cwndssthresh。

        1)對一個給定連接cwnd初始化為1。

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

        3)當新的數據包受到確認時,如果cwnd<ssthreth則進行慢啟動算法,否則cwnd在每個確認增加1/cwnd

 

快速重傳與快速恢復算法

 

     為什么上面判斷擁塞時,獲得三個以上重復的ACK時,認為產生擁塞了呢?

     因為,當接收方收到失序的報文段時,立即發送需要收到的下一個報文段,然而發送方發送兩個以上報文時,因報文的路由不一樣,會產生短暫的失序,為了避免因此而產生的重傳,把擁塞判斷設置為3個以上。

     當收到三個以上重復報文段時,發送方認為此包被丟失,于是立即重傳丟失報文段,不會等到超時定時器溢出。這就是快速重傳算法。

 

     當發送方重傳后,會持續發送后面沒有發送的數據,而不啟動慢啟動,等待ACK,是因為發送方收到了連續的3個以上ACK說明,接收方收到了3個以上數據報文,并緩存起來了。這就是快速恢復算法,實現如下:

        1)當收到3個重復ACKssthreth設置為當前窗口的一半,并cwnd設置為ssthresh+3。

        2)每次收到另一個重復的ACK時,cwnd增加一個報文段并重傳。

        3)當下一個ACK到達時cwdn設置為ssthreth,即采用擁塞避免,速率減半。

    對于重傳PTCP有一點不同,就是上述第一步,當收到重復3ACK時,ssthresh設置為還未確認的字節數的一半。

 

  1. bool PseudoTcp::process(Segment& seg) {  
  2. ......  
  3.     if ((seg.ack > m_snd_una) && (seg.ack <= m_snd_nxt)) {//當收到合法的ACK時  
  4. ......  
  5.     if (m_dup_acks >= 3) {//如果進行過重傳  
  6.       if (m_snd_una >= m_recover) { // 時重傳后的數據確認  
  7.         uint32 nInFlight = m_snd_nxt - m_snd_una;//未確認數據  
  8.         m_cwnd = talk_base::_min(m_ssthresh, nInFlight + m_mss); // cwnd設置為ssthreth  
  9.         m_dup_acks = 0;//重復ACK計數器清零  
  10.       } else {  
  11.         if (!transmit(m_slist.begin(), now)) {//慢啟動、繼續傳送  
  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) {//慢啟動  
  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) { //當收到3個重復的ACK時進行快速重傳  
  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設置為2個MSS和cwnd的最小值  
  43.           m_cwnd = m_ssthresh + 3 * m_mss;//cwnd設置為ssthresh加3  
  44.         } else if (m_dup_acks > 3) {  
  45.           m_cwnd += m_mss;//當收到發送重傳后的重復的ACK時,只增加一個MSS,即快速恢復算法  
  46.         }  
  47.       } else {  
  48.         m_dup_acks = 0;  
  49.       }  
  50.     }  
  51. ......  
  52. }  


 

 

重新分組

    當TCP超時重傳時,可以允許以更大的且不大于MSS的報文發送,即合并后續的數據一起發送,PTCP也是如此處理的。


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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            午夜欧美精品| 欧美日韩一区在线播放| 久久久美女艺术照精彩视频福利播放 | 午夜激情久久久| 亚洲精选国产| 亚洲人成绝费网站色www| 久久综合一区二区| 美女日韩欧美| 亚洲激情视频在线| 亚洲午夜国产成人av电影男同| 亚洲婷婷在线| 欧美一区二区三区久久精品茉莉花 | 久久精品亚洲国产奇米99| 久久国产精品99国产精| 亚洲一级在线| 性伦欧美刺激片在线观看| 久久免费国产精品| 欧美福利电影网| 国产精品久久久久国产精品日日| 国产精品一区二区你懂的| 狠狠色伊人亚洲综合网站色| 亚洲电影免费观看高清完整版在线观看| ●精品国产综合乱码久久久久| 亚洲精品中文字幕在线| 亚洲免费婷婷| 欧美黄网免费在线观看| 亚洲天堂久久| 欧美福利电影网| 国产一区二区久久久| 99re8这里有精品热视频免费 | 国产欧美一区二区三区久久人妖 | 欧美在线亚洲一区| 欧美激情精品久久久久久黑人| 国产精品女人网站| 亚洲三级影院| 麻豆成人在线播放| 亚洲免费一区二区| 欧美日韩在线一二三| 亚洲国产毛片完整版| 久久国产福利| 亚洲一区二区三区在线看| 免费日韩av| 在线免费观看日本欧美| 欧美有码视频| 亚洲午夜国产一区99re久久| 欧美日韩国产精品一区二区亚洲| 一区二区三区在线看| 西瓜成人精品人成网站| 亚洲精选一区二区| 免费欧美在线| 亚洲精品乱码久久久久久蜜桃麻豆 | 免费不卡亚洲欧美| 午夜精彩国产免费不卡不顿大片| 欧美劲爆第一页| 亚洲国产精品一区在线观看不卡 | 亚洲色图在线视频| 欧美激情综合色| 亚洲第一精品影视| 久久久人成影片一区二区三区| 洋洋av久久久久久久一区| 欧美美女福利视频| 亚洲精品一区二区三区99| 亚洲国产精品ⅴa在线观看 | 麻豆av一区二区三区久久| 国产精品综合不卡av | 久久久www| 性欧美video另类hd性玩具| 国产精品久久久久久久久果冻传媒 | 亚洲精品久久久久久下一站| 欧美99久久| 最新国产乱人伦偷精品免费网站 | 国产啪精品视频| 久久国产精品久久w女人spa| 亚洲综合不卡| 国内成人在线| 亚洲第一区在线观看| 欧美电影在线观看完整版| 亚洲人www| 9l国产精品久久久久麻豆| 国产精品久久7| 久久看片网站| 欧美激情视频一区二区三区免费| 亚洲精品中文字幕在线| 一本色道久久综合一区| 国产欧美精品国产国产专区| 麻豆成人在线播放| 欧美日韩在线播| 久久免费视频网站| 另类av一区二区| 亚洲视屏一区| 欧美一区亚洲一区| 亚洲激情在线视频| 在线一区亚洲| 亚洲成人在线视频网站| 亚洲美女福利视频网站| 国产亚洲欧美aaaa| 亚洲黄色在线看| 国产日韩av高清| 亚洲国产三级在线| 国产精品一区二区在线观看| 欧美成人一品| 国产伦精品一区二区三区视频黑人| 免费亚洲电影在线观看| 欧美色欧美亚洲高清在线视频| 久久久久国产精品人| 欧美日韩国产片| 亚洲激情国产精品| 亚洲一区二区三区四区五区黄| 亚洲国产精品成人精品| 亚洲欧美日韩中文播放| 亚洲乱码国产乱码精品精可以看| 亚洲自拍偷拍视频| 制服丝袜亚洲播放| 久久亚洲国产精品一区二区| 亚洲一级高清| 欧美国产激情二区三区| 久久日韩精品| 国产日本欧美一区二区三区| 99v久久综合狠狠综合久久| 亚洲成色最大综合在线| 午夜亚洲一区| 亚洲欧美日韩一区二区三区在线观看| 久久综合成人精品亚洲另类欧美| 欧美亚洲综合久久| 欧美日韩在线免费观看| 欧美成人乱码一区二区三区| 国产亚洲精品aa午夜观看| 日韩午夜剧场| 亚洲最新视频在线| 久久av红桃一区二区小说| 亚洲精品一区二区在线| 久久久青草青青国产亚洲免观| 亚洲女人av| 欧美特黄a级高清免费大片a级| 亚洲激情成人| 日韩一区二区福利| 欧美激情网友自拍| 亚洲高清一区二| 亚洲免费高清| 欧美美女日韩| 一区二区三区四区国产精品| 亚洲美女视频在线观看| 欧美国产日本高清在线| 亚洲日本电影| 亚洲宅男天堂在线观看无病毒| 久久久91精品国产一区二区精品| 久久精品国产v日韩v亚洲| 国产欧美高清| 久久亚洲国产精品一区二区| 欧美激情一区二区三区| 亚洲免费av电影| 欧美午夜久久| 午夜精品一区二区三区在线| 久久久精品午夜少妇| 亚洲成人中文| 欧美女同在线视频| 亚洲性av在线| 老司机精品视频网站| 亚洲福利一区| 欧美日韩日韩| 亚洲专区国产精品| 久久青草欧美一区二区三区| 在线观看日韩av| 欧美精品一区二区三区蜜桃| 99v久久综合狠狠综合久久| 午夜激情久久久| 一区二区三区在线视频免费观看| 欧美成年人视频| 一区二区三区不卡视频在线观看| 西西人体一区二区| 亚洲黄色三级| 国产欧美欧美| 欧美福利在线观看| 亚洲欧美一级二级三级| 欧美多人爱爱视频网站| 亚洲欧美日本日韩| 亚洲承认在线| 亚洲欧美日韩国产综合| 久久精品国产久精国产爱| 国产精品国产三级国产a| 久久不射网站| 一区二区激情小说| 欧美成人免费播放| 香蕉精品999视频一区二区 | 国产欧美短视频| 欧美激情一区二区久久久| 日韩视频免费观看高清在线视频| 午夜精品一区二区三区在线| 亚洲国产天堂久久综合网| 国产欧美日韩精品丝袜高跟鞋| 玖玖视频精品| 亚洲婷婷在线| 99国内精品久久| 美女黄色成人网| 欧美一区激情| 亚洲网站在线播放| 亚洲精品国产精品久久清纯直播| 国产欧美日韩麻豆91| 欧美三级日本三级少妇99| 欧美va亚洲va香蕉在线|