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

            xiaoxiaoling

            C++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
              17 Posts :: 2 Stories :: 9 Comments :: 0 Trackbacks
            概念
               tcp和udp,連接和無(wú)連接都是協(xié)議,是共享物理介質(zhì)的傳輸數(shù)據(jù)的應(yīng)用程序之間的約定。面向連接的協(xié)議維護(hù)了segment的狀態(tài)和次序。

            故障 :
                  默認(rèn)無(wú)keep alive:
            拔網(wǎng)線或路由器崩潰:發(fā)送端超時(shí)(重傳12次大約9分鐘)后放棄,接收端讀errorno ETIMEOUT,如果沒(méi)有讀則要等到下一次寫失敗sigpipe。如果中間路由器無(wú)法轉(zhuǎn)發(fā)則向源端發(fā)送 ICMP 目標(biāo)主機(jī)不可達(dá)。
            程序退出(包括崩潰): 程序退出和正常調(diào)用 close無(wú)法區(qū)分,都會(huì)返回FIN表示退出,如果一端退出,
                  另一端: 1.第一次寫合法(接收到fin后還是能繼續(xù)發(fā)送數(shù)據(jù))第二次寫的時(shí)候發(fā)現(xiàn)連接不存在,得到 RST RESET錯(cuò)誤 2.讀的時(shí)候得到 conn reset錯(cuò)誤,繼續(xù)寫則被SIGPIPE信號(hào)中止,程序退出。
            主機(jī)宕機(jī): 宕機(jī)后無(wú)法通過(guò)FIN通知對(duì)方,對(duì)方會(huì)繼續(xù)重傳直到timeout。如果超時(shí)前宕機(jī)的主機(jī)重啟了,此時(shí)收到重傳的主機(jī)沒(méi)有連接記錄,向源返回rst,發(fā)送端得到ECONNRESET錯(cuò)誤,如果發(fā)送端在讀得到 conn reset錯(cuò)誤,繼續(xù)寫則被SIGPIPE信號(hào)中止,程序退出。
            開(kāi)啟keep alive情況下:
            如果程序崩潰返回fin , 如果主機(jī)可達(dá)但程序不存在(主機(jī)重啟),則響應(yīng)RSt,源端得到ECONNRESET 錯(cuò)誤。
            如果對(duì)方?jīng)]有對(duì)keep alive響應(yīng)ACK 或者RST,源端TIMEOUT(重試9次,每次間隔75秒,定時(shí)器2小時(shí)超時(shí)后的11.25分鐘)以程序自己做心跳還是必要的。

            細(xì)節(jié)
            tcp寫操作:
            用戶態(tài)拷貝到內(nèi)核態(tài)寫緩沖區(qū)后返回,只返回明顯錯(cuò)誤:socket無(wú)效或緩沖區(qū)無(wú)效。影響的因素有:發(fā)送窗口,擁塞窗口,寫緩沖區(qū)大小,Nagle。
            tcp是提高帶寬利用率的協(xié)議,每次發(fā)送傾向mss大小,同時(shí)不能大于對(duì)端指定的大小(發(fā)送窗口),tcp只考慮了網(wǎng)絡(luò)中路由器緩沖區(qū)耗盡情況(也是tcp的限制)所以有擁塞窗口和慢啟動(dòng):為了防止網(wǎng)絡(luò)擁塞(自律的協(xié)議)每次發(fā)送的不能大于對(duì)方指定的(發(fā)送窗口)和自己給自己限制的(擁塞窗口)。


                

            慢啟動(dòng):一開(kāi)始指數(shù)級(jí)的增加擁塞窗口,到一個(gè)門閥值后變成線性的, 之后每次超時(shí)都把門閥值降低到原來(lái)一半(并且rto翻倍,TCP超時(shí)計(jì)算是RTOx2,這樣連續(xù)丟三次包就變成RTOx8了,十分恐怖),擁塞窗口設(shè)置為1重新開(kāi)始慢啟動(dòng)(指數(shù)級(jí)增加)。一切都是為了讓路由器有時(shí)間處理積壓的緩沖。(所以不適用于頻繁斷開(kāi)連接的移動(dòng)網(wǎng)絡(luò),這也是為什么以前的下載工具開(kāi)多條tcp傳輸速度更快的原因)。

            Nagle算法:第一次(此時(shí)沒(méi)有等待ack確認(rèn),空閑連接)發(fā)送小包成功,第二次繼續(xù)發(fā)送 :哪怕發(fā)送窗口,擁塞窗口都很大,之前的包沒(méi)有ack確認(rèn)依舊不讓發(fā)直到收到之前的 ack確認(rèn)。

            shutdown和close的區(qū)別:

            close只是遞減引用計(jì)數(shù), shutdown的半關(guān)閉會(huì)影響所有的進(jìn)程。

            shutdown how=0 關(guān)閉讀,讀會(huì)返回eof
            shutdown how=1 關(guān)閉寫,任何寫會(huì)出錯(cuò),將緩沖區(qū)的發(fā)送完后會(huì)發(fā)送fin表示沒(méi)有數(shù)據(jù)了,
            收到對(duì)方發(fā)送的fin,recv會(huì)返回0。
            listen 的第二個(gè)參數(shù)制定的是全連接隊(duì)列大小(accept)

            time_wait和close_wait
            time_wait 出現(xiàn)在主動(dòng)close方,為了防止新連接收到舊鏈接的數(shù)據(jù)包, 數(shù)量高可以通過(guò)設(shè)置內(nèi)核參數(shù)縮短時(shí)間降低數(shù)值(2msl)。可以通過(guò) SO_LINGER關(guān)閉。
            close_wait 出現(xiàn)在被動(dòng)close方,數(shù)量高一般因?yàn)樾阅芑蛘遙ug在收到fin后沒(méi)有調(diào)用close。

            SO_REUSEADDR
            用于程序崩潰后重啟,解決地址被占用問(wèn)題(time_wait),另一個(gè)用途是開(kāi)兩個(gè)服務(wù),第一個(gè)制定地址,第二個(gè)指定INADDR_ANY 通配地址,如果客戶端連接的是制定地址一樣會(huì)到第一個(gè)socket上。
                  對(duì)于綁定于同一地址端口組合上的UDP socket,kernel嘗試在它們之間平均分配收到的數(shù)據(jù)包;對(duì)于綁定于同一地址端口組合上的TCP監(jiān)聽(tīng)socket,kernel嘗試在它們之間平均分配收到的連接請(qǐng)求(調(diào)用accept()方法所得到的請(qǐng)求)。

            Nagle和延遲ack的問(wèn)題:
            發(fā)送端數(shù)據(jù)未發(fā)送完,被nagle禁止發(fā)送(必須等待接收端的ack,也就是沒(méi)有未確認(rèn)的包才允許發(fā)送),此時(shí)接收端ack被延遲發(fā)送(希望將ack和數(shù)據(jù)一起發(fā)送提高帶寬利用率)而發(fā)送方數(shù)據(jù)未發(fā)送完導(dǎo)致接收端無(wú)法回復(fù),雙方死鎖。
            已連接的UDP:
            tcp的connect是開(kāi)始三次握手,將遠(yuǎn)程的ip端口綁定到socket,而bind是綁定本地的ip端口。
            udp沒(méi)有三次握手,connect純粹是本地行為,將遠(yuǎn)程的ip端口綁定到socket上。
            已連接的udp可以不用sendto,sendto會(huì)先將socket和目的地址連接,然后發(fā)送數(shù)據(jù)后再斷開(kāi),而已連接的已經(jīng)綁定地址可以用write,提高效率(資料顯示暫時(shí)連接斷開(kāi)所用的時(shí)間是傳輸udp數(shù)據(jù)的三分之一,還是很可觀的)。異步錯(cuò)誤的接收,使用sendto發(fā)送完系統(tǒng)就沒(méi)有記錄了,應(yīng)用程序無(wú)法接收之后icmp返回的錯(cuò)誤。
            接收端已連接udp的好處: 可以標(biāo)識(shí)哪個(gè)socket是哪個(gè)用戶,另外還可以獨(dú)占連接,再另一個(gè)地方調(diào)用recvfrom指定相同地址會(huì)返回ECONNREFUSED,因?yàn)榇诉B接已經(jīng)被綁定。
            posted on 2018-07-13 15:49 clcl 閱讀(270) 評(píng)論(0)  編輯 收藏 引用

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


            久久久久国产精品嫩草影院| 婷婷综合久久中文字幕| 久久精品国产男包| 久久发布国产伦子伦精品| 77777亚洲午夜久久多喷| 99久久精品免费看国产免费| 亚洲国产成人久久精品99 | 久久精品国产清自在天天线| 久久久久久久综合日本| 欧美熟妇另类久久久久久不卡 | 久久国产乱子伦免费精品| 999久久久国产精品| 香蕉久久av一区二区三区| 国产精品成人精品久久久| 少妇高潮惨叫久久久久久| 久久久久99精品成人片牛牛影视| 性做久久久久久久| 日韩AV毛片精品久久久| 成人妇女免费播放久久久| 伊人精品久久久久7777| 99久久精品费精品国产| 久久精品99久久香蕉国产色戒| 婷婷久久综合| 欧美激情精品久久久久久| 久久最新精品国产| 久久九九有精品国产23百花影院| 亚洲AV无码久久精品色欲| 日日狠狠久久偷偷色综合免费| 国产精品久久久久久影院| 亚洲乱码精品久久久久.. | WWW婷婷AV久久久影片| 97久久婷婷五月综合色d啪蜜芽| 久久久人妻精品无码一区| 久久精品免费观看| 亚洲天堂久久精品| 国产 亚洲 欧美 另类 久久| 99久久婷婷免费国产综合精品| 久久久久久人妻无码| 久久亚洲中文字幕精品有坂深雪| 久久精品国产99国产精品导航| 婷婷久久综合|