• <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>

            牽著老婆滿街逛

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

            libjingle源碼解析(4)-【PseudoTcp】建立UDP之上的TCP(2):對(duì)交互數(shù)據(jù)流的處理

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

            對(duì)交互數(shù)據(jù)流的處理

            TCP包含兩類數(shù)據(jù)流,交互數(shù)據(jù)流和成塊數(shù)據(jù)流。交互數(shù)據(jù)流的特點(diǎn)是每個(gè)報(bào)文數(shù)據(jù)字節(jié)數(shù)比較小,大部分是10字節(jié)一下,而成塊數(shù)據(jù)流的特點(diǎn)是大部分報(bào)文是滿長(zhǎng)度的,一般能達(dá)到MSS

            本文先介紹一些TCPPTCP對(duì)交互數(shù)據(jù)流的處理。

            交互式輸入

                Rlogin是典型的交互數(shù)據(jù)流應(yīng)用,每一按鍵都會(huì)產(chǎn)生數(shù)據(jù)分組,使客戶端傳輸一個(gè)報(bào)文,接連總共產(chǎn)生4個(gè)報(bào)文:

                a.C傳輸交互按鍵數(shù)據(jù)

                b.S確認(rèn)C的數(shù)據(jù)

                c.S回顯C的按鍵

                d.C確認(rèn)S的回顯

                上面的報(bào)文b,c可能會(huì)同時(shí)包含在一個(gè)報(bào)文段。而對(duì)于TCP報(bào)文-40個(gè)字節(jié)的頭部的協(xié)議報(bào)文來說每次只傳輸一個(gè)字節(jié)是個(gè)極大的浪費(fèi),此外Rlogin這類應(yīng)用會(huì)在短時(shí)間內(nèi)按N個(gè)字符,按如上的方式,至少要傳輸3*N個(gè)報(bào)文。

            經(jīng)受時(shí)延的確認(rèn)

                經(jīng)受時(shí)延的確認(rèn)考慮了時(shí)間有關(guān)的細(xì)微之處,對(duì)于交互類應(yīng)用,短時(shí)間內(nèi)會(huì)產(chǎn)生多個(gè)報(bào)文。對(duì)于TCP,當(dāng)接收數(shù)據(jù)時(shí),并不立即發(fā)送確認(rèn),而先緩存,延遲發(fā)送,以便在短時(shí)間如果有該方向的數(shù)據(jù)需要發(fā)送,則一同發(fā)送,這樣能減少ACK報(bào)文的個(gè)數(shù),提高報(bào)文的利用率。TCP通常等待200ms后發(fā)送ACK

                對(duì)于PTCP來說,也支持延時(shí)確認(rèn),默認(rèn)延時(shí)時(shí)長(zhǎng)為100ms,可以通過選項(xiàng)OPT_ACKDELAY更改延時(shí)時(shí)間。不另外,如果出現(xiàn)連續(xù)兩個(gè)不含數(shù)據(jù)的ACK需要發(fā)送,則不會(huì)等到100ms,直接會(huì)發(fā)送ACK報(bào)文。PTCP發(fā)送ACK的時(shí)機(jī)如下:

                A. 和SEND數(shù)據(jù)一起發(fā)送

                B. 等到超時(shí)(100ms后沒有數(shù)據(jù)時(shí))時(shí)發(fā)送

                C. 出錯(cuò)時(shí)發(fā)送(如發(fā)現(xiàn)對(duì)方傳來的數(shù)據(jù)和預(yù)期的不一致,或者ACK被丟失)

                雖然PTCP是等到100ms后發(fā)送ACK,但沒有提供任何定時(shí)器,只提供了下次需要被提醒的時(shí)間(通過方法GetNextClock),然后由業(yè)務(wù)層來實(shí)現(xiàn)定時(shí)器并通知到時(shí)(通過方法NotifyClock)。這樣,業(yè)務(wù)層就會(huì)有靈活的方式設(shè)置定時(shí)器,比如通過消息循環(huán),等待事件,完成端口等等。

            Nagle算法

                Nagle算法是為了避免在廣域網(wǎng)上出現(xiàn)大量的TCP小分組報(bào)文段。該算法要求一個(gè)TCP連接上最多只有一個(gè)未被確認(rèn)的小分組。當(dāng)已經(jīng)發(fā)送的一個(gè)分組沒有被確認(rèn)前,該算法積累所有需要發(fā)送的數(shù)據(jù),等到未被確認(rèn)的分組確認(rèn)了,一同發(fā)送,這樣在短時(shí)間內(nèi)出現(xiàn)的小分組合并成一個(gè)報(bào)文發(fā)送,提高了報(bào)文的利用率。這個(gè)算法是自適應(yīng)的,得到確認(rèn)越快,則發(fā)送頻率越高。偽代碼如下:

                if there is new data to send

                  if the window size >= MSS and available data is >= MSS

                    send complete MSS segment now

                  else

                    if there is unconfirmed data still in the pipe

                      enqueue data in the buffer until an acknowledge is received

                    else

                      send data immediately

                    end if

                  end if

                end if

                PTCP也支持Nagle算法,可以通過選項(xiàng)OPT_NODELAY開啟或者關(guān)閉。Nagle算法的實(shí)現(xiàn)比較簡(jiǎn)單,當(dāng)嘗試發(fā)送數(shù)據(jù)時(shí),發(fā)現(xiàn)如果有未確認(rèn)的數(shù)據(jù)且等待發(fā)送的數(shù)據(jù)長(zhǎng)度小于MSS,則延遲發(fā)送,如下:

                

            1. void PseudoTcp::attemptSend(SendFlags sflags) {  
            2.     ......  
            3.         // Nagle's algorithm.  
            4.         // If there is data already in-flight, and we haven't a full segment of  
            5.         // data ready to send then hold off until we get more to send, or the  
            6.         // in-flight data is acknowledged.  
            7.         if (m_use_nagling && (m_snd_nxt > m_snd_una) && (nAvailable < m_mss))  {  
            8.           return;  
            9.         }  
            10.     ......  
            11.     }  

            窗口大小通告

                TCPPTCP都通過頭部的window字段通告接收緩沖區(qū)的可用窗口大小。當(dāng)客戶端收到服務(wù)器的數(shù)據(jù),并有等待發(fā)送的數(shù)據(jù)時(shí)(開啟Nagle算法時(shí)會(huì)經(jīng)常出現(xiàn)此情況),通告給服務(wù)器的窗口大小總是小于接收緩沖區(qū)的大小,是因?yàn)椋瑧?yīng)用層還沒有拿取剛從服務(wù)獲取的數(shù)據(jù)之前,就會(huì)嘗試發(fā)送被緩沖的數(shù)據(jù)。

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

                當(dāng)PTCP接收對(duì)方發(fā)送的數(shù)據(jù)時(shí)會(huì)調(diào)用NofifyPacket->parse->process,在Process先調(diào)用attemptSend發(fā)送緩沖的數(shù)據(jù),然后通知應(yīng)用層有可讀數(shù)據(jù)。

            1. bool PseudoTcp::process(Segment& seg) {  
            2. ......  
            3.         attemptSend(sflags);  
            4.          // If we have new data, notify the user  
            5.          if (bNewData && m_bReadEnable) {  
            6.               m_bReadEnable = false;  
            7.               if (m_notify) {  
            8.                 m_notify->OnTcpReadable(this);  
            9.               }  
            10.               //notify(evRead);  
            11.            }  
            12.          return true;  
            13. }  

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


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


            久久久久国产一区二区| 久久99精品久久久久久水蜜桃| 国产91久久精品一区二区| 一本一道久久a久久精品综合| 日本三级久久网| 99久久精品国产毛片| 久久国产精品-国产精品| 久久国产精品成人影院| 精品永久久福利一区二区 | 亚洲国产成人久久综合野外| 久久国产视屏| 国产香蕉久久精品综合网| 日产久久强奸免费的看| 久久天天婷婷五月俺也去| 狠狠色丁香婷婷久久综合五月| 综合久久国产九一剧情麻豆| 亚洲欧美成人综合久久久| 亚洲中文字幕无码久久综合网| 久久人人爽人人爽人人AV东京热| 人妻精品久久无码专区精东影业| 久久久久高潮毛片免费全部播放| 色综合久久中文综合网| 久久久久无码精品国产app| 久久久久久久女国产乱让韩| 久久丫忘忧草产品| 国产精品久久久久久| 久久不见久久见免费影院www日本| 日日狠狠久久偷偷色综合96蜜桃 | 国产精品久久久久jk制服| 久久不射电影网| 超级97碰碰碰碰久久久久最新| 亚洲国产精品无码成人片久久| 久久精品国产精品青草| 久久综合亚洲色HEZYO国产 | 久久超乳爆乳中文字幕| 久久99精品久久久久久齐齐| 无码精品久久久久久人妻中字| 青青草国产精品久久| 伊人久久综合无码成人网| 99久久精品免费国产大片| 伊人久久大香线蕉AV色婷婷色|