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

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            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):對交互數據流的處理

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

            對交互數據流的處理

            TCP包含兩類數據流,交互數據流和成塊數據流。交互數據流的特點是每個報文數據字節數比較小,大部分是10字節一下,而成塊數據流的特點是大部分報文是滿長度的,一般能達到MSS

            本文先介紹一些TCPPTCP對交互數據流的處理。

            交互式輸入

                Rlogin是典型的交互數據流應用,每一按鍵都會產生數據分組,使客戶端傳輸一個報文,接連總共產生4個報文:

                a.C傳輸交互按鍵數據

                b.S確認C的數據

                c.S回顯C的按鍵

                d.C確認S的回顯

                上面的報文b,c可能會同時包含在一個報文段。而對于TCP報文-40個字節的頭部的協議報文來說每次只傳輸一個字節是個極大的浪費,此外Rlogin這類應用會在短時間內按N個字符,按如上的方式,至少要傳輸3*N個報文。

            經受時延的確認

                經受時延的確認考慮了時間有關的細微之處,對于交互類應用,短時間內會產生多個報文。對于TCP,當接收數據時,并不立即發送確認,而先緩存,延遲發送,以便在短時間如果有該方向的數據需要發送,則一同發送,這樣能減少ACK報文的個數,提高報文的利用率。TCP通常等待200ms后發送ACK

                對于PTCP來說,也支持延時確認,默認延時時長為100ms,可以通過選項OPT_ACKDELAY更改延時時間。不另外,如果出現連續兩個不含數據的ACK需要發送,則不會等到100ms,直接會發送ACK報文。PTCP發送ACK的時機如下:

                A. 和SEND數據一起發送

                B. 等到超時(100ms后沒有數據時)時發送

                C. 出錯時發送(如發現對方傳來的數據和預期的不一致,或者ACK被丟失)

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

            Nagle算法

                Nagle算法是為了避免在廣域網上出現大量的TCP小分組報文段。該算法要求一個TCP連接上最多只有一個未被確認的小分組。當已經發送的一個分組沒有被確認前,該算法積累所有需要發送的數據,等到未被確認的分組確認了,一同發送,這樣在短時間內出現的小分組合并成一個報文發送,提高了報文的利用率。這個算法是自適應的,得到確認越快,則發送頻率越高。偽代碼如下:

                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算法,可以通過選項OPT_NODELAY開啟或者關閉。Nagle算法的實現比較簡單,當嘗試發送數據時,發現如果有未確認的數據且等待發送的數據長度小于MSS,則延遲發送,如下:

                

            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字段通告接收緩沖區的可用窗口大小。當客戶端收到服務器的數據,并有等待發送的數據時(開啟Nagle算法時會經常出現此情況),通告給服務器的窗口大小總是小于接收緩沖區的大小,是因為,應用層還沒有拿取剛從服務獲取的數據之前,就會嘗試發送被緩沖的數據。

                PTCP的實現如下:

                當PTCP接收對方發送的數據時會調用NofifyPacket->parse->process,在Process先調用attemptSend發送緩沖的數據,然后通知應用層有可讀數據。

            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) 評論(0)  編輯 收藏 引用

            欧美亚洲日本久久精品| 东方aⅴ免费观看久久av| 久久精品aⅴ无码中文字字幕重口 久久精品a亚洲国产v高清不卡 | 人妻无码久久精品| 国产美女亚洲精品久久久综合| 久久亚洲日韩精品一区二区三区| 97精品久久天干天天天按摩| 国产福利电影一区二区三区久久久久成人精品综合 | 日本一区精品久久久久影院| 精品久久国产一区二区三区香蕉| 国产69精品久久久久观看软件| 精品久久久久香蕉网| 久久久久一本毛久久久| 亚洲日本va中文字幕久久| 久久国产精品久久国产精品| 久久人人爽人人爽人人片AV麻豆 | 婷婷综合久久中文字幕| 亚洲欧美一区二区三区久久| 97久久超碰成人精品网站| 久久一区二区三区99| 99久久精品免费观看国产| 亚洲AV无码久久| 亚洲国产成人精品91久久久| 国产韩国精品一区二区三区久久| 亚洲日本va午夜中文字幕久久| 伊人丁香狠狠色综合久久| 久久精品人人做人人妻人人玩| 久久久久国产| 伊人久久大香线蕉影院95| 久久青青草原亚洲av无码app | 国产精品狼人久久久久影院 | 亚洲国产成人精品91久久久 | 三上悠亚久久精品| 久久成人国产精品免费软件| 久久综合久久伊人| 久久伊人五月天论坛| 久久久久国色AV免费看图片| 国产高清国内精品福利99久久| 久久精品国内一区二区三区| 久久国产精品国产自线拍免费| 久久精品成人免费网站|