HOME 首頁
SERVICE 服務產品
XINMEITI 新媒體代運營
CASE 服務案例
NEWS 熱點資訊
ABOUT 關于我們
CONTACT 聯系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    tcp調整器安卓版(tcp參數調優(yōu))

    發(fā)布時間:2023-03-19 04:45:24     稿源: 創(chuàng)意嶺    閱讀: 105        問大家

    大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關于tcp調整器安卓版的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。

    開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等

    只需要輸入關鍵詞,就能返回你想要的內容,越精準,寫出的就越詳細,有微信小程序端、在線網頁版、PC客戶端

    官網:https://ai.de1919.com

    本文目錄:

    tcp調整器安卓版(tcp參數調優(yōu))

    一、如何偵服務器的tcp返回數據

    在平時的開發(fā)中,經常會碰到一些需要檢測tcp連接是否正常的場景。比如一個分布式的應用,一個調度任務的節(jié)點管理一堆用來跑業(yè)務的節(jié)點。當調度節(jié)點進行調度的時候,需要把任務分發(fā)給它認為正常的業(yè)務節(jié)點去執(zhí)行。業(yè)務節(jié)點是否正常,一個重要的參考依據就是調度節(jié)點和業(yè)務節(jié)點之間的tcp連接是否正常。這時候就需要調度節(jié)點主動地去檢測tcp連接。常見的檢測方法有以下幾種

    方案一、通過TCP協議的返回值進行判斷

    <1> 利用select,把socket設置為非阻塞。然后使用select等待該socket的可讀事件。如果socket可讀,但是recv的返回值是0,則說明socket已經被對端斷開,這時候就可以調用close關閉socket。這里還要注意一點,recv還可能返回負數,這個代表socket操作出錯。但是仍然應該判斷一下errno是否為EINTR。如果errno是EINTR,則說明recv函數是被信號中斷返回的,這時候不能判斷socket的連接是否正常,也不應該調用close關閉socket。

    <2> 利用poll的事件。poll本身提供了POLLHUP,POLLERR, POLLNVAL三個事件。如果文件描述符是socket,則POLLHUP代表socket已經斷開了連接,在TCP底層就是已經收到了FIN報文。POLLERR表示socket出現了錯誤,一般情況下是收到了rst報文,或者已經發(fā)送了rst報文。這兩種情況都應該調用close關閉socket。POLLNVAL代表socket沒有打開,這時不能使用close關閉它,而應該根據自己的業(yè)務做一些其他的操作。因為關閉一個未打開的socket會出錯。

    這兩種方法都可以很精確地判斷tcp連接是否正常,但是仍然有很明顯的缺陷。就是它只可以根據TCP操作的返回值來進行判斷。如果TCP四次握手沒有正常被執(zhí)行呢?比如連接對端機器直接掛了,那么就不會發(fā)送FIN報文給這一端,select不會返回socket可讀,poll不會返回socket異常。那么這個死鏈接將會永遠檢測不到。直到寫這個socket的時候,對端直接返回一個ret報文,這時才知道這個連接已經斷掉了。這就意味著tcp連接異??赡苡肋h檢測不到,或者檢測到的延遲非常大。這對于一些資源寶貴而且要求高性能的服務器是不能接受的,比如游戲服務器,比如搜索服務器。

    方案二、在第一種方案的基礎上設置socket的 keep alive 機制

    方案一的主要缺陷在于檢測不及時,或者根本檢測不到。TCP協議提供了keep alive機制。如果開啟了這個特性(暫時稱開啟了keep alive的一端為開啟端),在默認情況下,開啟的著一端的socket相關結構中會維護一個定時器,默認是2小時。如果在2小時內兩端沒有數據往來,那么開啟端就會給另一端發(fā)送一個ack空報文。這時候分幾種情況:

    <1> 對端機器可達,而且TCP相關組件運行正常。那么對端就會給開啟端發(fā)送一個ack空報文。這時開啟端就知道對端是正常的,意味著tcp連接也沒有問題。開啟端會重新初始化定時器,等待下一個超時的到來。需要注意的是,如果兩端之間有數據往來,定時器也會被重新初始化為2個小時。

    <2> 對端掛了,或者正在重啟,還沒有完全起來。或者對端服務器不可達。 這種狀態(tài)的對端是不會響應這個ack的。開啟端的 keep alive 機制會把這種情況當探測超時來處理,并且重新發(fā)送ack到對端。當超時次數超過一定限制,keep alive 就認為這個tcp連接有問題。典型值是每次75秒,超時9次。

    <3> 對端掛過,但是已經重啟完成。這時候發(fā)送這個ack和寫已經關閉的socket是一種情況,對端會返回一個rst報文,這樣開啟端就知道tcp連接出問題了。

    可以看出 keep alive 機制彌補了方案一種不能判斷沒有進行正常四次揮手連接出現問題的缺陷。默認的發(fā)送超時和發(fā)送間隔都是可以調整的。

    tcp_keepalive_time: KeepAlive的空閑時長,默認是2小時

    tcp_keepalive_intvl: KeepAlive探測包的發(fā)送間隔,默認是75s 

    tcp_keepalive_probes: 在tcp_keepalive_time之后,沒有接收到對方確認,繼續(xù)發(fā)送?;钐綔y包次數,默認是9次

    這3個參數使用 setsockopt函數都是可以配置的。

    方案二看似已經完美了,能夠比較精確而且及時地發(fā)現有問題的連接。但是還有2個缺點。第一個是 keep alive 機制看似牛逼,但是很多人不建議使用。因為上面說的3個參數很難根據業(yè)務場景給出合適的值,設置不好很容易對tcp連接狀態(tài)發(fā)生誤判,關閉了一個本來正常的連接。而且沒有一個主動通知應用層的方式。比如socket連接出錯了,TCP協議接到了rst,fin,或者keep alive判斷出socket有問題了,但是并不會主動去通知應用層,必須我們自己 recv socket或者等待錯誤事件才能得到這個錯誤。第二個是很多場景下,keep alive 檢測仍然不夠及時,比如對端掛了,最長需要等待 tcp_keepalive_intvl * tcp_keepalive_probes時間才可以檢測出來,而且這兩個值還不能設置得太小,太小了容易誤判。

    方案三、應用層的心跳

    這種形式的心跳設計就比較多樣化了,而且靈活,可以很好地適應業(yè)務場景。唯一的缺點就是要自己寫代碼。我目前接觸到的就是定期進行RPC調用。看RPC調用是否正常,如果返回錯誤或者拋出異常,就說明連接有問題。

    二、關閉路由器tcp時間戳

    1、登錄無線路由器,找到節(jié)能設置。

    2、設置無線使用時間段。

    3、解除無線網絡定時關閉,將時間設定為全天即可。

    4、最后把路由器插在定時插座來控制路由器電源供電,也可將定時插座時間進行調整關閉路由器tcp時間戳。

    三、圖解TCP/IP

    計算機使用模式的演變:

    20世紀50年代 批處理時代

    20世紀60年代 分時系統(tǒng)時代

    20世紀70年代 計算機間通信時代

    20世紀80年代 計算機網絡時代

    20世紀90年代 互聯網普及時代

    2000年 以互聯網為中心的時代

    2010年 無論何時何地地一切皆TCP/IP的網絡時代

    在計算機網絡與信息通信領域,人們經常提及 “協議” 。簡單來說。 協議 就是計算機與計算機之間通過網絡實現通信時事先達成的一種“約定”。這種“約定”使那些由不同廠商的設備、不同的CPU以及不同的操作系統(tǒng)組成的計算機之間,只要遵循相同的協議就能實現通信。換句話說, 協議 就是計算機之間的通信語言,只有支持相同的協議,計算機之間才能相互通信。

    計算機通信也會在每一個分組中附加上源主機地址和目標主機地址送給通信線路。這些發(fā)送端地址、接收端地址以及分組序號寫入的部分稱為 “報文首部” 。

    TCP/IP協議并非ISO(國際標準化組織)所制定的某種國際標準,而是由IETF(Internet Engineering Task Force國際互聯網工程任務組)所建議的、致力于推進器標準化作業(yè)的一種協議。

    OSI參考模型

    應用層 :針對特定應用的協議。以電子郵件為例,用戶A在主機A上新建一封電子郵件,指定收件人為B,并輸入郵件內容為“早上好”。應用層協議會在所要傳遞數據的前端附加一個首部(標簽)信息,該首部標明了郵件內容為“早上好”和收件人為B。

    表示層 :設備固有數據格式和網絡標準數據格式的轉換。用戶A和用戶B使用的郵件客戶端一致,便能夠順利收取和閱讀郵件,不一致時表示層就發(fā)揮作用了:將數據從“某個計算機特定的數據格式”轉換為“網絡通用的標準數據格式”后再發(fā)送出去,接收端也進行相應處理。表示層與表示層之間為了識別編碼格式也會附加首部信息,從而將實際傳輸的數據轉交給下一層處理。

    會話層 :通信管理。負責建立和斷開通信連接(數據流動的邏輯通路)。管理傳輸層以下的分層。假定用戶A新建了5封電子郵件準備發(fā)送給用戶B,是建立一次連接一起發(fā)送,還是分別建立5次連接各自發(fā)送,都是會話層決定的,會話層和表示層一樣,也會在數據前段附加首部或標簽信息再轉發(fā)給下一層。而這些首部或標簽中記錄著數據傳送順序的信息。

    傳輸層 :管理兩個節(jié)點之間的數據傳輸。負責可靠傳輸(確保數據被可靠傳送到目標地址)。用主機A將“早上好”這一數據發(fā)送給主機B,期間可能因為某些原因導致數據損壞,主機B只收到“早上”,此時也會將這一事實告訴主機A,主機A得知情況會將后面的“好”重發(fā)給主機B。保證數據傳輸的可靠性是傳輸層的一個重要作用。為了確保可靠性,這一層所要傳輸的數據附加首部以識別這一分層的數據。然而,實際上將數據傳輸給對端的處理是由網絡層來完成的。

    網絡層 :地址管理與路由選擇。兩端主機之間雖然有眾多數據鏈路,但能夠將數據從主機A送到主機B也都是網絡層的功勞。相當于TCP/IP協議中的IP協議,網絡層不能保證數據的可達性,所以需要傳輸層TCP協議確??蛇_性,所以TCP/IP協議實現了可靠傳輸。

    數據鏈路層 :互連設備之間傳送和識別數據幀。網絡層負責將整個數據發(fā)送給最終目標地址,而數據鏈路層則只負責發(fā)送一個分段內的數據。

    物理層 :以“0”、“1”代表電壓的高低、燈光的閃滅。界定連接器和網線的規(guī)格。將數據的0、1轉換為電壓和脈沖光傳輸給物理的傳輸介質。

    計算機之間的網絡連接通過 電纜 相互連接。任何一臺計算機連接網絡時,必須要使用 網卡 (網絡適配器、NIC、LAN卡), 中繼器 的作用是將電纜傳過來的信號調整和放大再傳給另一個電纜,可以完成不同媒介之間的連接工作。 網橋 是數據鏈路層面上連接兩個網絡的設備,提供的是傳遞數據幀的作用,并且還具備自學機制。 路由器 是在網絡層面上(OSI七層模型網絡層)連接兩個網絡、并對分組報文進行轉發(fā)的設備。 網橋 是根據物理地址(MAC地址)進行處理,而路由器/3層交換機則是根據IP地址進行處理的。由此,TCP/IP中網絡層的地址就成為了IP地址。對于并發(fā)訪問量非常大的一個企業(yè)級Web站點,使用一臺服務器不足以滿足前端的訪問需求,這時通常會架設多臺服務器來分擔。這些服務器的訪問的入口地址通常只有一個,為了能通過同一個URL將前端訪問分發(fā)到后臺多個服務器上,可以將這些服務器的前端加一個負載均衡器。這種負載均衡器就是4-7層交換機的一種。 網關 是OSI參考模型中負責將從傳輸層到應用層的數據進行轉換和轉發(fā)的設備。在兩個不能進行直接通信的協議之間進行翻譯,最終實現兩者的通信。非常典型的例子就是互聯網郵件和手機郵件之間的轉換服務。防火墻也是一款通過網關通信,針對不用應用提高安全性的產品。

    美國軍方利用分組交換技術組件的ARPANET網絡是互聯網的鼻祖。而BSD UNIX操作系統(tǒng)實現了TCP/IP協議,隨著UNIX系統(tǒng)的普及,TCP/IP協議開始盛行。TCP/IP可以單純的指這兩種協議,然而在很多情況下,它指的是包含HTTP、SMTP、FTP、TCP、UDP、IP、ARP等很多協議的 網際協議族 。

    發(fā)送數據包的過程,和上節(jié)OSI參考模型中介紹的差不多。數據鏈路層是由網絡接口(以太網驅動)來處理的,它會改數據附加上 以太網首部 , 以太網首部 中包含接收端的MAC地址、發(fā)送端MAC地址以及標志以太網類型的以太網數據的協議。

    在以太網普及之初,一般多臺終端使用同一根同軸電纜的 共享介質型 連接方式,訪問控制一般以半雙工通信為前提采用CSMA/CD方式。隨著ATM交換技術的進步和CAT5 UTP電纜的普及很快發(fā)生了變化,逐漸采用像 非共享介質網絡 那樣直接與交換機連接的方式。

    網絡層與數據鏈路層的關系

    某人要去一個很遠的地方旅行,并計劃先后乘坐飛機、火車、公交車到達目的地。旅行社不僅幫他預訂好了飛機票和火車票,甚至還為他指定了一個詳細的行程表,詳細到幾點幾分需要乘坐飛機或火車都一目了然。機票和火車票只能夠在某一限定區(qū)間內移動,此處的“區(qū)間內”就如同通信網絡上的數據鏈路。這個區(qū)間內的出發(fā)地點和目的地點就如同某一個數據鏈路的源地址和目標地址等首部信息。整個行程表的作用就相當于網絡層。

    DNS :將域名和IP地址相匹配。

    ARP :以目標IP地址為線索,用來定位下一個應該接受數據分包的網絡設備對應的MAC地址。ARP只適用于IPv4,IPv6可以用ICMPv6替代ARP發(fā)送鄰居探索消息。

    ICMP :在IP通信中如果某個IP包因為某種原因未能送達目標地址,那么這個具體的原因將由ICMP負責通知。

    DHCP :使用移動設備時,每移動到一個新地方,都要重新設置IP地址,為了實現自動設置IP地址、統(tǒng)一管理IP地址分配,就產生了DHCP協議。

    NAT :是用于在本地網絡中使用私有地址,在連接互聯網時轉而使用全局IP地址的技術。

    IP隧道 :IPv4和IPv6之間進行通信的技術就是IP隧道。

    TCP用于低速可靠傳輸

    UDP用于高速不可靠傳輸

    端口號就是用來識別同一臺計算機中進行通信的不同應用程序,也被稱為程序地址。

    TCP傳輸利用 窗口控制 提高速度,無需等到每次應答來進行下一次發(fā)送,而是有個窗口進行緩沖,來提高吞吐量。

    TCP擁塞控制,利用擁塞窗口來調節(jié)發(fā)送的數據量,擁塞時減小窗口,流暢是增大窗口來控制吞吐量。

    我們日常網絡訪問的 http 用的是 tcp ,那還是看一下這個過程吧

    tcp 可以提供全雙工的數據流傳輸服務,全雙工說白了,就是同一時間 A 可以發(fā)信息給 B , B 也可以發(fā)消息給 A ,倆人同時都可以給對方發(fā)消息;半雙工就是某個時間段 A 可以發(fā)給 B ,但 B 不能給 A ,換個時間段,就反過來了。

    這個過程理解起來,就像兩人在喊話:

    A:喂,有人嗎,我想建立連接

    B:有哇,你建立吧,等你吆

    A:好噠,我來啦

    然后倆人就建立連接了...

    一定要三次握手么,兩次行不行?

    這么一個場景:

    A->B: 洞幺洞幺,我是洞拐,收到請回復。

    B->A: 洞拐洞拐,洞幺收到。

    請問根據以上對話判斷:

    1、B是否能收到A的信息? (答案是肯定的)

    2、A是否能收到B的信息? (你猜?)

    tcp的核心思想是保證數據可靠傳輸,如果 2 次,顯然不行,但 3 次就一定行么?未必,可能第三次的時候網絡中斷了,然后 A 就認為 B 收到了,然后一通發(fā)消息,其實 B 沒收到,但這是無法完全保證的。無論握手多少次都不能滿足傳輸的絕對可靠,為了效率跟相對可靠而看, 3 次剛剛好,所以就 3 次了(正好 AB 相互確認了一次)。

    舉個栗子:把客戶端比作男孩,服務器比作女孩。通過他們的分手來說明“四次揮手”過程:

    "第一次揮手" :日久見人心,男孩發(fā)現女孩變成了自己討厭的樣子,忍無可忍,于是決定分手,隨即寫了一封信告訴女孩。

    “第二次揮手” :女孩收到信之后,知道了男孩要和自己分手,怒火中燒,心中暗罵:你算什么東西,當初你可不是這個樣子的!于是立馬給男孩寫了一封回信:分手就分手,給我點時間,我要把你的東西整理好,全部還給你!男孩收到女孩的第一封信之后,明白了女孩知道自己要和她分手。隨后等待女孩把自己的東西收拾好。

    “第三次揮手” :過了幾天,女孩把男孩送的東西都整理好了,于是再次寫信給男孩:你的東西我整理好了,快把它們拿走,從此你我恩斷義絕!

    “第四次揮手” :男孩收到女孩第二封信之后,知道了女孩收拾好東西了,可以正式分手了,于是再次寫信告訴女孩:我知道了,這就去拿回來!

    為什么連接的時候是三次握手,關閉的時候卻是四次握手?

    答:因為當 Server端 收到 Client端 的 SYN 連接請求報文后,可以直接發(fā)送 SYN+ACK報文 。其中 ACK報文 是用來應答的, SYN報文 是用來同步的。但是關閉連接時,當 Server端 收到 FIN報文 時,很可能并不會立即 關閉SOCKET ,所以只能先回復一個 ACK報文 ,告訴 Client端 ,"你發(fā)的 FIN報文 我收到了"。只有等到我 Server端 所有的報文都發(fā)送完了,我才能發(fā)送 FIN報文 ,因此不能一起發(fā)送。故需要四步握手。

    靜態(tài)路由 是指事先設置好路由器和主機中并將路由信息固定的一種方法。缺點是某個路由器發(fā)生故障,基本上無法自動繞過發(fā)生故障的節(jié)點,只有在管理員手工設置以后才能恢復正常。

    動態(tài)路由 是管理員先設置好路由協議,其設定過程的復雜程度與具體要設置路由協議的類型有直接關系。在路由器個數較多的網絡,采用動態(tài)路由顯然能夠減輕管理員負擔。網絡發(fā)生故障,只要有一個可繞的其他路徑,數據包會自動選擇這個路徑,但路由器需要定期相互交換必要的路由控制信息,會增加一定程度的負荷。

    根據路由控制范圍分為 IGP (內部網關協議)和 EGP (外部網關協議)

    路由算法分為 距離向量算法 鏈路狀態(tài)算法

    距離向量算法 :通過距離與方向確定通往目標網絡的路徑

    鏈路狀態(tài)算法 :鏈路狀態(tài)中路由器知道網絡的連接狀態(tài),并根據鏈路信息確定通往目標網絡的路徑。

    IGP包含RIP、RIP2、OSPF

    EGP包含EGP、BGP

    RIP是距離向量型的一種路由協議,廣泛應用于LAN

    RIP2是RIP的第二版。新增以下特點:使用多播、支持子網掩碼、路由選擇域、外部路由標志、身份驗證密鑰

    OSPF是一種鏈路狀態(tài)型路由協議。

    在RIP和OSPF中利用IP的網絡地址部分進行著路由控制,然而BGP則需要放眼整個互聯網進行路由控制。BGP的最終路由控制表有網絡地址和下一站的路由器組來表示,不過它會根據所要經過的AS個數進行路由控制。有了AS編號的域,就相當于有了自己一個獨立的“國家”。AS的代表可以決定AS內部的網絡運營和相關政策。與其他AS相連的時候,可以像一位“外交官”一樣簽署合約再進行連接。正是有了這些不同地區(qū)的AS通過簽約的相互連接,才有了今天全球范圍內的互聯網。

    轉發(fā)IP數據包的過程中除了使用路由技術外,還在使用標記交換技術。最有代表性的就是多協議標記交換技術(MPLS)。

    MPLS的標記不像MAC地址直接對應到硬件設備。因此,MPLS不需要具備以外網或ATM等數據鏈路層協議的作用,而只需要關注它與下面一層IP層之間的功能和協議即可。

    MPLS優(yōu)點:

    1.轉發(fā)速度快

    2.利用標記生成虛擬路徑,并在它的上面實現IP等數據包的通信。

    四、網絡編程(五)TCP詳解

    考慮最簡單的情況:兩臺主機之間的通信。這個時候只需要一條網線把兩者連起來,規(guī)定好彼此的硬件接口,如都用 USB、電壓 10v、頻率 2.4GHz 等, 這一層就是物理層,這些規(guī)定就是物理層協議 。

    我們當然不滿足于只有兩臺電腦連接,因此我們可以使用交換機把多個電腦連接起來,如下圖:

    這樣連接起來的網絡,稱為局域網,也可以稱為以太網(以太網是局域網的一種)。在這個網絡中,我們需要標識每個機器,這樣才可以指定要和哪個機器通信。這個標識就是硬件地址 MAC。

    硬件地址隨機器的生產就被確定,永久性唯一。在局域網中,我們需要和另外的機器通信時,只需要知道他的硬件地址,交換機就會把我們的消息發(fā)送到對應的機器。

    這里我們可以不管底層的網線接口如何發(fā)送,把物理層抽離,在他之上創(chuàng)建一個新的層次,這就是 數據鏈路層 。

    我們依然不滿足于局域網的規(guī)模,需要把所有的局域網聯系起來,這個時候就需要用到路由器來連接兩個局域網:

    但是如果我們還是使用硬件地址來作為通信對象的唯一標識,那么當網絡規(guī)模越來越大,需要記住所有機器的硬件地址是不現實的;

    同時,一個網絡對象可能會頻繁更換設備,這個時候硬件地址表維護起來更加復雜。這里使用了一個新的地址來標記一個網絡對象: IP 地址 。

    通過一個簡單的寄信例子來理解 IP 地址。

    我住在北京市,我朋友 A 住在上海市,我要給朋友 A 寫信:

    因此,這里 IP 地址就是一個網絡接入地址(朋友 A 的住址),我只需要知道目標 IP 地址,路由器就可以把消息給我?guī)У健?strong> 在局域網中,就可以動態(tài)維護一個 MAC 地址與 IP 地址的映射關系,根據目的 IP 地址就可以尋找到機器的 MAC 地址進行發(fā)送 。

    這樣我們不需管理底層如何去選擇機器,我們只需要知道 IP 地址,就可以和我們的目標進行通信。這一層就是 網絡層 。網絡層的核心作用就是 提供主機之間的邏輯通信

    這樣,在網絡中的所有主機,在邏輯上都連接起來了,上層只需要提供目標 IP 地址和數據,網絡層就可以把消息發(fā)送到對應的主機。

    一個主機有多個進程,進程之間進行不同的網絡通信,如邊和朋友開黑邊和女朋友聊微信。我的手機同時和兩個不同機器進行通信。

    那么當我的手機收到數據時,如何區(qū)分是微信的數據,還是王者的數據?那么就必須在網絡層之上再添加一層: 運輸層

    運輸層通過 socket(套接字),將網絡信息進行進一步的拆分,不同的應用進程可以獨立進行網絡請求,互不干擾。

    這就是運輸層的最本質特點: 提供進程之間的邏輯通信 。這里的進程可以是主機之間,也可以是同個主機,所以在 android 中,socket 通信也是進程通信的一種方式。

    現在不同的機器上的應用進程之間可以獨立通信了,那么我們就可以在計算機網絡上開發(fā)出形形式式的應用:如 web 網頁的 http,文件傳輸 ftp 等等。這一層稱為 應用層 。

    應用層還可以進一步拆分出表示層、會話層,但他們的本質特點都沒有改變: 完成具體的業(yè)務需求 。和下面的四層相比,他們并不是必須的,可以歸屬到應用層中。

    最后對計網分層進行小結:

    這里需要注意的是,分層并不是在物理上的分層,而是邏輯上的分層。通過對底層邏輯的封裝,使得上層的開發(fā)可以直接依賴底層的功能而無需理會具體的實現,簡便了開發(fā)。

    這種分層的思路,也就是責任鏈設計模式,通過層層封裝,把不同的職責獨立起來,更加方便開發(fā)、維護等等。

    TCP 并不是把應用層傳輸過來的數據直接加上首部然后發(fā)送給目標,而是把數據看成一個字節(jié) 流,給他們標上序號之后分部分發(fā)送。這就是 TCP 的 面向字節(jié)流 特性:

    面向字節(jié)流的好處是無需一次存儲過大的數據占用太多內存,壞處是無法知道這些字節(jié)代表的意義,例如應用層發(fā)送一個音頻文件和一個文本文件,對于 TCP 來說就是一串字節(jié)流,沒有意義可言,這會導致粘包以及拆包問題,后面講。

    前面講到,TCP 是可靠傳輸協議,也就是,一個數據交給他,他肯定可以完整無誤地發(fā)送到目標地址,除非網絡炸了。他實現的網絡模型如下:

    對于應用層來說,他就是一個可靠傳輸的底層支持服務;而運輸層底層采用了網絡層的不可靠傳輸。雖然在網絡層甚至數據鏈路層就可以使用協議來保證數據傳輸的可靠性,但這樣網絡的設計會更加復雜、效率會隨之降低。把數據傳輸的可靠性保證放在運輸層,會更加合適。

    可靠傳輸原理的重點總結一下有: 滑動窗口、超時重傳、累積確認、選擇確認、連續(xù) ARQ 。

    停止等待協議

    要實現可靠傳輸,最簡便的方法就是:我發(fā)送一個數據包給你,然后你跟我回復收到,我繼續(xù)發(fā)送下一個數據包。傳輸模型如下:

    這種“一來一去”的方法來保證傳輸可靠就是 停止等待協議 (stop-and-wait)。不知道還記不記得前面 TCP 首部有一個 ack 字段,當他設置為 1 的時候,表示這個報文是一個確認收到報文。

    然后再來考慮另一種情況:丟包。網絡環(huán)境不可靠,導致每一次發(fā)送的數據包可能會丟失,如果機器 A 發(fā)送了數據包丟失了,那么機器 B 永遠接收不到數據,機器 A 永遠在等待。

    解決這個問題的方法是: 超時重傳 。當機器 A 發(fā)出一個數據包時便開始計時,時間到還沒收到確認回復,就可以認為是發(fā)生了丟包,便再次發(fā)送,也就是重傳。

    但重傳會導致另一種問題:如果原先的數據包并沒有丟失,只是在網絡中待的時間比較久,這個時候機器 B 會受到兩個數據包,那么機器 B 是如何辨別這兩個數據包是屬于同一份數據還是不同的數據?

    這就需要前面講過的方法: 給數據字節(jié)進行編號 。這樣接收方就可以根據數據的字節(jié)編號,得出這些數據是接下來的數據,還是重傳的數據。

    在 TCP 首部有兩個字段:序號和確認號,他們表示發(fā)送方數據第一個字節(jié)的編號,和接收方期待的下一份數據的第一個字節(jié)的編號。

    停止等待協議的優(yōu)點是簡單,但缺點是 信道利用率 太低。

    假定AB之間有一條直通的信道來傳送分組

    這里的TD是A發(fā)送分組所需要的時間(顯然TD = 分組長度 / 數據速率)再假定TA是B發(fā)送確認分組所需要的時間(A和B處理分組的時間都忽略不計)那么A在經過TD+RTT+TA時間后才能發(fā)送下一個分組,這里的RTT是往返時間,因為只有TD是采用來傳輸有用的數據(這個數據包括了分組首部,如果可以知道傳輸更精確的數據的時間,可以計算的更精確),所有信道利用率為

    為了提高傳輸效率,發(fā)送方可以不使用低效率的停止等待協議,而是采用 流水線傳輸 :就是發(fā)送方可以 連續(xù)的發(fā)送多個分組 ,不必每發(fā)完一個分組就停下來等待對方的確認。這樣可使信道上一直有數據不間斷地在傳送。顯然這種傳輸方式可以獲得很高的信道利用率

    停止等待協議已經可以滿足可靠傳輸了,但有一個致命缺點: 效率太低 。發(fā)送方發(fā)送一個數據包之后便進入等待,這個期間并沒有干任何事,浪費了資源。解決的方法是: 連續(xù)發(fā)送數據包 。

    也就是下面介紹的 連續(xù)ARQ協議 滑動窗口協議

    連續(xù) ARQ 協議

    模型如下:

    和停止等待最大的不同就是,他會源源不斷地發(fā)送,接收方源源不斷收到數據之后,逐一進行確認回復。這樣便極大地提高了效率。但同樣,帶來了一些額外的問題:

    發(fā)送是否可以無限發(fā)送直到把緩沖區(qū)所有數據發(fā)送完?不可以。因為需要考慮接收方緩沖區(qū)以及讀取數據的能力。如果發(fā)送太快導致接收方無法接受,那么只是會頻繁進行重傳,浪費了網絡資源。所以發(fā)送方發(fā)送數據的范圍,需要考慮到接收方緩沖區(qū)的情況。這就是 TCP 的 流量控制 。

    解決方法是: 滑動窗口 ?;灸P腿缦拢?/p>

    在 TCP 的首部有一個窗口大小字段,他表示接收方的剩余緩沖區(qū)大小,讓發(fā)送方可以調整自己的發(fā)送窗口大小。通過滑動窗口,就可以實現 TCP 的流量控制,不至于發(fā)送太快,導致太多的數據丟失。

    連續(xù) ARQ 帶來的第二個問題是:網絡中充斥著和發(fā)送數據包一樣數據量的確認回復報文,因為每一個發(fā)送數據包,必須得有一個確認回復。提高網絡效率的方法是: 累積確認 。

    接收方不需要逐個進行回復,而是累積到一定量的數據包之后,告訴發(fā)送方,在此數據包之前的數據全都收到。例如,收到 1234,接收方只需要告訴發(fā)送方我收到 4 了,那么發(fā)送方就知道 1234 都收到了。

    第三個問題是:如何處理丟包情況。在停止等待協議中很簡單,直接一個超時重傳就解決了。但,連續(xù) ARQ 中不太一樣。

    例如:接收方收到了 123 567,六個字節(jié),編號為 4 的字節(jié)丟失了。按照累積確認的思路,只能發(fā)送 3 的確認回復,567 都必須丟掉,因為發(fā)送方會進行重傳。這就是 GBN(go-back-n) 思路。

    但是我們會發(fā)現,只需要重傳 4 即可,這樣不是很浪費資源,所以就有了: 選擇確認 SACK 。在 TCP 報文的選項字段,可以設置已經收到的報文段,每一個報文段需要兩個邊界來進行確定。這樣發(fā)送方,就可以根據這個選項字段只重傳丟失的數據了。

    第四個問題是:擁塞控制的問題

    也是通過窗口的大小來控制的,但是檢測網絡滿不滿是個挺難的事情,所以 TCP 發(fā)送包經常被比喻成往誰管理灌水,所以擁塞控制就是在不堵塞,不丟包的情況下盡可能的發(fā)揮帶寬。

    水管有粗細,網絡有帶寬,即每秒鐘能發(fā)送多少數據;水管有長度,端到端有時延。理想狀態(tài)下,水管里面的水 = 水管粗細 * 水管長度。對于網絡上,通道的容量 = 帶寬 * 往返時延。

    如果我們設置發(fā)送窗口,使得發(fā)送但未確認的包為通道的容量,就能撐滿整個管道。

    如圖所示,假設往返時間為 8 秒,去 4 秒,回 4 秒,每秒發(fā)送一個包,已經過去了 8 秒,則 8 個包都發(fā)出去了,其中前四個已經到達接收端,但是 ACK 還沒返回,不能算發(fā)送成功,5-8 后四個包還在路上,還沒被接收,這個時候,管道正好撐滿,在發(fā)送端,已發(fā)送未確認的 8 個包,正好等于帶寬,也即每秒發(fā)送一個包,也即每秒發(fā)送一個包,乘以來回時間 8 秒。

    如果在這個基礎上調大窗口,使得單位時間可以發(fā)送更多的包,那么會出現接收端處理不過來,多出來的包會被丟棄,這個時候,我們可以增加一個緩存,但是緩存里面的包 4 秒內肯定達不到接收端課,它的缺點會增加時延,如果時延達到一定程度就會超時重傳

    TCP 擁塞控制主要來避免兩種現象,包丟失和超時重傳,一旦出現了這些現象說明發(fā)送的太快了,要慢一點。

    具體的方法就是發(fā)送端慢啟動,比如倒水,剛開始倒的很慢,漸漸變快。然后設置一個閾值,當超過這個值的時候就要慢下來

    慢下來還是在增長,這時候就可能水滿則溢,出現擁塞,需要降低倒水的速度,等水慢慢滲下去。

    擁塞的一種表現是丟包,需要超時重傳,這個時候,采用快速重傳算法,將當前速度變?yōu)橐话?。所以速度還是在比較高的值,也沒有一夜回到解放前。

    到這里關于 TCP 的可靠傳輸原理就已經介紹得差不多。最后進行一個小結:

    當然,這只是可靠傳輸的冰山一角,感興趣可以再深入去研究

    以上就是關于tcp調整器安卓版相關問題的回答。希望能幫到你,如有更多相關問題,您也可以聯系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內容。


    推薦閱讀:

    chatGPT手機驗證碼(驗證碼captcha)

    ChatGPT需要多少算力(1btc需要多少算力)

    ChatGP有中文版嗎(chatcraftpro下載)

    景觀設計實戰(zhàn)(景觀設計初學者實戰(zhàn)寶典)

    學景觀設計考研嗎(景觀設計專業(yè)考研可以考什么方向)