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

    tcp調(diào)整器安卓版(tcp參數(shù)調(diào)優(yōu))

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

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

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

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

    官網(wǎng):https://ai.de1919.com

    本文目錄:

    tcp調(diào)整器安卓版(tcp參數(shù)調(diào)優(yōu))

    一、如何偵服務(wù)器的tcp返回數(shù)據(jù)

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

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

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

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

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

    方案二、在第一種方案的基礎(chǔ)上設(shè)置socket的 keep alive 機制

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

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

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

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

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

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

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

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

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

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

    方案三、應(yīng)用層的心跳

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

    二、關(guān)閉路由器tcp時間戳

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

    2、設(shè)置無線使用時間段。

    3、解除無線網(wǎng)絡(luò)定時關(guān)閉,將時間設(shè)定為全天即可。

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

    三、圖解TCP/IP

    計算機使用模式的演變:

    20世紀50年代 批處理時代

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

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

    20世紀80年代 計算機網(wǎng)絡(luò)時代

    20世紀90年代 互聯(lián)網(wǎng)普及時代

    2000年 以互聯(lián)網(wǎng)為中心的時代

    2010年 無論何時何地地一切皆TCP/IP的網(wǎng)絡(luò)時代

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

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

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

    OSI參考模型

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

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

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

    傳輸層 :管理兩個節(jié)點之間的數(shù)據(jù)傳輸。負責(zé)可靠傳輸(確保數(shù)據(jù)被可靠傳送到目標地址)。用主機A將“早上好”這一數(shù)據(jù)發(fā)送給主機B,期間可能因為某些原因?qū)е聰?shù)據(jù)損壞,主機B只收到“早上”,此時也會將這一事實告訴主機A,主機A得知情況會將后面的“好”重發(fā)給主機B。保證數(shù)據(jù)傳輸?shù)目煽啃允莻鬏攲拥囊粋€重要作用。為了確??煽啃?,這一層所要傳輸?shù)臄?shù)據(jù)附加首部以識別這一分層的數(shù)據(jù)。然而,實際上將數(shù)據(jù)傳輸給對端的處理是由網(wǎng)絡(luò)層來完成的。

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

    數(shù)據(jù)鏈路層 :互連設(shè)備之間傳送和識別數(shù)據(jù)幀。網(wǎng)絡(luò)層負責(zé)將整個數(shù)據(jù)發(fā)送給最終目標地址,而數(shù)據(jù)鏈路層則只負責(zé)發(fā)送一個分段內(nèi)的數(shù)據(jù)。

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

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

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

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

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

    網(wǎng)絡(luò)層與數(shù)據(jù)鏈路層的關(guān)系

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

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

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

    ICMP :在IP通信中如果某個IP包因為某種原因未能送達目標地址,那么這個具體的原因?qū)⒂蒊CMP負責(zé)通知。

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

    NAT :是用于在本地網(wǎng)絡(luò)中使用私有地址,在連接互聯(lián)網(wǎng)時轉(zhuǎn)而使用全局IP地址的技術(shù)。

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

    TCP用于低速可靠傳輸

    UDP用于高速不可靠傳輸

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

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

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

    我們?nèi)粘>W(wǎng)絡(luò)訪問的 http 用的是 tcp ,那還是看一下這個過程吧

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

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

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

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

    A:好噠,我來啦

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

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

    這么一個場景:

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

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

    請問根據(jù)以上對話判斷:

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

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

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

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

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

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

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

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

    為什么連接的時候是三次握手,關(guān)閉的時候卻是四次握手?

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

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

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

    根據(jù)路由控制范圍分為 IGP (內(nèi)部網(wǎng)關(guān)協(xié)議)和 EGP (外部網(wǎng)關(guān)協(xié)議)

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

    距離向量算法 :通過距離與方向確定通往目標網(wǎng)絡(luò)的路徑

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

    IGP包含RIP、RIP2、OSPF

    EGP包含EGP、BGP

    RIP是距離向量型的一種路由協(xié)議,廣泛應(yīng)用于LAN

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

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

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

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

    MPLS的標記不像MAC地址直接對應(yīng)到硬件設(shè)備。因此,MPLS不需要具備以外網(wǎng)或ATM等數(shù)據(jù)鏈路層協(xié)議的作用,而只需要關(guān)注它與下面一層IP層之間的功能和協(xié)議即可。

    MPLS優(yōu)點:

    1.轉(zhuǎn)發(fā)速度快

    2.利用標記生成虛擬路徑,并在它的上面實現(xiàn)IP等數(shù)據(jù)包的通信。

    四、網(wǎng)絡(luò)編程(五)TCP詳解

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

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

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

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

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

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

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

    同時,一個網(wǎng)絡(luò)對象可能會頻繁更換設(shè)備,這個時候硬件地址表維護起來更加復(fù)雜。這里使用了一個新的地址來標記一個網(wǎng)絡(luò)對象: IP 地址 。

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

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

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

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

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

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

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

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

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

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

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

    最后對計網(wǎng)分層進行小結(jié):

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

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

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

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

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

    對于應(yīng)用層來說,他就是一個可靠傳輸?shù)牡讓又С址?wù);而運輸層底層采用了網(wǎng)絡(luò)層的不可靠傳輸。雖然在網(wǎng)絡(luò)層甚至數(shù)據(jù)鏈路層就可以使用協(xié)議來保證數(shù)據(jù)傳輸?shù)目煽啃?,但這樣網(wǎng)絡(luò)的設(shè)計會更加復(fù)雜、效率會隨之降低。把數(shù)據(jù)傳輸?shù)目煽啃员WC放在運輸層,會更加合適。

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

    停止等待協(xié)議

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

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

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

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

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

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

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

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

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

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

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

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

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

    連續(xù) ARQ 協(xié)議

    模型如下:

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

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

    解決方法是: 滑動窗口 。基本模型如下:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    到這里關(guān)于 TCP 的可靠傳輸原理就已經(jīng)介紹得差不多。最后進行一個小結(jié):

    當然,這只是可靠傳輸?shù)谋揭唤?,感興趣可以再深入去研究

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


    推薦閱讀:

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

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

    ChatGP有中文版嗎(chatcraftpro下載)

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

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