• <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包含兩類(lèi)數(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)文來(lái)說(shuō)每次只傳輸一個(gè)字節(jié)是個(gè)極大的浪費(fèi),此外Rlogin這類(lèi)應(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ì)于交互類(lèi)應(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來(lái)說(shuō),也支持延時(shí)確認(rèn),默認(rèn)延時(shí)時(shí)長(zhǎng)為100ms,可以通過(guò)選項(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后沒(méi)有數(shù)據(jù)時(shí))時(shí)發(fā)送

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

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

            Nagle算法

                Nagle算法是為了避免在廣域網(wǎng)上出現(xiàn)大量的TCP小分組報(bào)文段。該算法要求一個(gè)TCP連接上最多只有一個(gè)未被確認(rèn)的小分組。當(dāng)已經(jīng)發(fā)送的一個(gè)分組沒(méi)有被確認(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算法,可以通過(guò)選項(xiàng)OPT_NODELAY開(kāi)啟或者關(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都通過(guò)頭部的window字段通告接收緩沖區(qū)的可用窗口大小。當(dāng)客戶端收到服務(wù)器的數(shù)據(jù),并有等待發(fā)送的數(shù)據(jù)時(shí)(開(kāi)啟Nagle算法時(shí)會(huì)經(jīng)常出現(xiàn)此情況),通告給服務(wù)器的窗口大小總是小于接收緩沖區(qū)的大小,是因?yàn)椋瑧?yīng)用層還沒(méi)有拿取剛從服務(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 楊粼波 閱讀(401) 評(píng)論(0)  編輯 收藏 引用


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


            超级碰碰碰碰97久久久久| 色欲综合久久中文字幕网| 99久久夜色精品国产网站| 久久99热精品| 亚洲精品美女久久777777| 精品视频久久久久| 九九精品99久久久香蕉| 伊人 久久 精品| 久久九九有精品国产23百花影院| 久久中文字幕精品| 久久夜色精品国产亚洲| 国产69精品久久久久9999APGF| 久久996热精品xxxx| 久久精品99久久香蕉国产色戒 | 久久婷婷五月综合色高清| 久久性生大片免费观看性| 无码任你躁久久久久久老妇| 99久久久精品免费观看国产| 久久久SS麻豆欧美国产日韩| 婷婷久久综合| 久久人人爽人人澡人人高潮AV| 国内精品久久国产大陆| 一本一本久久A久久综合精品| 天天影视色香欲综合久久| 久久99精品久久久久久野外| 久久国产精品久久| 国产一级持黄大片99久久| 久久99精品久久久久婷婷| 99精品国产综合久久久久五月天| 亚洲国产成人久久一区久久| 热RE99久久精品国产66热| 久久久久国产精品三级网| 岛国搬运www久久| 精品99久久aaa一级毛片| 国产精品熟女福利久久AV| 9999国产精品欧美久久久久久| 日本久久久精品中文字幕| 久久精品国产亚洲网站| 久久综合九色综合97_久久久| 日本精品久久久久中文字幕| 一级做a爰片久久毛片人呢|