国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
全面了解linux TCP/IP協(xié)議棧

簡要說明

 自從熟悉了linux socket編程(主要做posix socket的TCP/IP)之后,就一直以來就想寫一篇對TCP/IP有一個比較全面的涵蓋用戶空間、內(nèi)核以及網(wǎng)卡的文章,以便幫助大家在遇到基于socket的TCP/IP問題或困惑時能進行有目的的、恰當(dāng)?shù)姆治鲆员憬鉀Q問題。只是一是本人上學(xué)時是個“不學(xué)無術(shù)”的不良少年。工作后自己也是不斷學(xué)習(xí)中,還有比較忙(都是懶的借口吧,不然怎么還有時間看龍珠),一直沒動筆,今天就花一下午時間來做一個介紹。如果大家發(fā)現(xiàn)了謬誤之處,請及時留言,我好更正之、學(xué)習(xí)之。話不多說,下面就進入正題。
 
 現(xiàn)如今的internet services可以說就是基于TCP/IP構(gòu)建的。理解數(shù)據(jù)是如何通過network傳輸?shù)模瑹o論對你調(diào)試net IO的性能還是解決問題還是學(xué)習(xí)新的技術(shù)都是有很大助益的。本文將會全面的,盡力細致的通過內(nèi)核及硬件中的數(shù)據(jù)流和控制流來介紹這方面的知識。
 
 PS: 有一個我自認為實現(xiàn)的還不錯的項目,有興趣的童鞋可以參與github c/c++連接復(fù)用庫實現(xiàn)

TCP/IP的關(guān)鍵特征

 我們?nèi)绾卧O(shè)計一個數(shù)據(jù)傳輸協(xié)議以便保證數(shù)據(jù)快速、有序、無誤?TCP/IP正是為了這樣的需求被創(chuàng)造的。下面的幾個特征用于幫助了解什么是TCP/IP協(xié)議(棧)。由于對于TCP來講IP是緊密相關(guān)的,我們放到一起介紹。更多的內(nèi)容,大家可以參考大學(xué)教材《計算機網(wǎng)絡(luò)》(謝希仁著)以及《TCP/IP協(xié)議》三卷(國外)。

  • 面向連接的(Connection-oriented)
    一個tcp connection有兩個端(endpoint),每一個endpoint可以用一個(ip、port)來表達,所以兩端的話就可以用(local IP address, local port number, remote IP address, remote port number)來表達。

  • 數(shù)據(jù)是雙向流動的
    雙向的傳遞二進制流。

  • 按序傳送的
    接受者接收數(shù)據(jù)一定是會按照發(fā)送者發(fā)送數(shù)據(jù)的順序的。通過一個32-bit integer做標(biāo)記。通過ACK來保證可靠性,如果發(fā)送者收不到接受者的ACK,則會重新發(fā)送。

  • 流量控制
    發(fā)送方會根據(jù)接收方提供的的窗口大小來決定如何發(fā)送數(shù)據(jù),不會超過接收方的緩沖能力。

  • 擁塞控制
    擁塞窗口(congestion window)區(qū)別于receive window,是發(fā)送方自己根據(jù)包ACK的狀態(tài)結(jié)合特定的擁塞算法計算出的一個window。它表達的當(dāng)前的網(wǎng)絡(luò)狀態(tài)。發(fā)送發(fā)發(fā)送的數(shù)據(jù)上限受到流量控制和擁塞控制共同的作用。

數(shù)據(jù)傳送


 
 數(shù)據(jù)通過網(wǎng)絡(luò)協(xié)議棧發(fā)送,如下圖1。
 
 

             圖1:數(shù)據(jù)發(fā)送的流動過程

 借用于國外大神的圖(下文也會借用很多,不一一說明了),其表達了數(shù)據(jù)的流動過程。這里為了防止大家不認真看,我要強調(diào)一下右側(cè)黑色方塊表達用戶write的新的數(shù)據(jù),而灰色的代表發(fā)送緩沖區(qū)中已有的數(shù)據(jù),大括號圈的灰黑兩塊結(jié)合代表了一個TCP報文段。整個過程可以分為三個區(qū)域,user、kernel和device,其中user和kernel的部分要吃CPU的。這里的device就是我們說的網(wǎng)卡(Network Interface Card)。

 內(nèi)核socket關(guān)聯(lián)了兩個緩沖區(qū):

一個發(fā)送緩沖區(qū)為了數(shù)據(jù)發(fā)送。
一個接收緩沖區(qū)為了接收數(shù)據(jù)。

 在內(nèi)核中有一個TCP control block(TCB)關(guān)聯(lián)到socket。TCB包含了連接需要處理的一系列數(shù)據(jù),這里面包含了TCP的state(LISTEN, ESTABLISHED, TIME_WAIT),receive window, congestion window, sequence number, resending timer等等。
 
 內(nèi)核中如果當(dāng)前的TCP狀態(tài)允許數(shù)據(jù)發(fā)送,則一個新的TCP報文段(或者說包)就會被創(chuàng)建。
 


             圖2:TCP報文段

 之后報文段流向IP層。IP層在TCP的報文段上加上IP頭并執(zhí)行IP路由。IP路由是尋找到達目的IP的下一跳的一個程序。IP層計算完并加上IP頭的checksum之后就會把數(shù)據(jù)發(fā)送到鏈路層。鏈路層通過ARP和下一跳的IP地址查找到下一跳的MAC地址,之后鏈路層把其頭加到數(shù)據(jù)中。至此主機端數(shù)據(jù)包完成。之后就是調(diào)用網(wǎng)卡驅(qū)動了。此時如果有包捕獲程序比如tcpdump或者Wireshark處于運行中,內(nèi)核會把數(shù)據(jù)包拷貝給它們一份。
 
 驅(qū)動根據(jù)硬件廠商定義的協(xié)議請求傳送數(shù)據(jù)。網(wǎng)卡在接到數(shù)據(jù)傳送請求之后把數(shù)據(jù)包從主存拷貝到它的存儲空間中,之后把數(shù)據(jù)打到網(wǎng)線。這時,為了遵從以太網(wǎng)標(biāo)準(zhǔn),網(wǎng)卡會添加IFG(幀間隔)到數(shù)據(jù)包以便區(qū)分數(shù)據(jù)包的開始。網(wǎng)卡發(fā)送完數(shù)據(jù)包之后就會產(chǎn)生一個CPU中斷,每一個中斷都一個特定的中斷號,OS根據(jù)中斷號選擇合適的驅(qū)動對中斷進行處理(驅(qū)動啟動的時候會注冊一個對應(yīng)中斷號的處理函數(shù))。

數(shù)據(jù)接收

 現(xiàn)在我們來看看是怎么接收數(shù)據(jù)的,如圖3。
 
 


              圖3:數(shù)據(jù)流入過程
 首先網(wǎng)卡把接收到的數(shù)據(jù)包寫入到它的內(nèi)存之中。然后對其進行校驗,通過后發(fā)送到主機的主存之中。主存中的buffer是驅(qū)動分配好的,驅(qū)動會把分配好的buffer描述告訴網(wǎng)卡,如果沒有足夠的buffer接受網(wǎng)卡的數(shù)據(jù)包,網(wǎng)卡會將數(shù)據(jù)包丟棄。一旦數(shù)據(jù)包拷貝到主存完成,網(wǎng)卡會通過中斷告知主機OS。
 之后驅(qū)動會檢查它是否能處理這個新的包。如果能處理,驅(qū)動會把數(shù)據(jù)包包裝成OS認識的結(jié)構(gòu)(linux sk_buffer)并推送到上層。
 鏈路層接收到幀后檢查通過的話會按照協(xié)議解幀并推送至IP層。
 IP層會在解包之后根據(jù)包中包含的IP信息決定推送至上層還是轉(zhuǎn)發(fā)到其他IP。如果判斷需要推送至上層,則會解掉IP包頭并推送至TCP層。
 TCP在解報之后會根據(jù)其四元組找到對應(yīng)的TCB,之后通過TCP協(xié)議處理這個報文。在接收到報文后,會把報文加到接受報文,之后根據(jù)TCP的狀態(tài)發(fā)送一個ACK給對端。
 當(dāng)然上述過程會受到NAT等等Netfilter的作用,這里不談了,也沒深研究過。當(dāng)然為了性能,大牛們方方面面也做了很多努力,比如大到RDMA、DPDK等大的軟硬件技術(shù),小到zero-copy、checksum offload等。

數(shù)據(jù)結(jié)構(gòu)

 下面介紹一下關(guān)鍵數(shù)據(jù)結(jié)構(gòu)sk_buff(skb)。
 


         圖4:sk_buffer(意為socket buffer?)
 
 一個skb就是一個發(fā)送緩沖區(qū)可發(fā)送的數(shù)據(jù)包。從圖4中可以看到其各個指針。不同層級的數(shù)據(jù)包頭的添加和刪除、數(shù)據(jù)包的聯(lián)合和分割都是通過控制這些指針來實現(xiàn)的。真正的數(shù)據(jù)結(jié)構(gòu)可能比這復(fù)雜很多,但是基本思路是一致的。

  • TCP control block
     一個TCB代表了一個connection,這里TCB是一個抽象,linux用tcp_sock這個結(jié)構(gòu)表達。下圖5可以看出tcp_sock和fd、socket之間的關(guān)系。
     


                圖5:TCP connection結(jié)構(gòu)
     
     當(dāng)調(diào)用系統(tǒng)調(diào)用的時候,OS先找到file結(jié)構(gòu)。對于類unix系統(tǒng),socket、本地file、device都被抽象成file。因此file擁有最少的信息。對于socket,有其自己的結(jié)構(gòu)關(guān)聯(lián)到file,tcp_sock也會關(guān)聯(lián)到socket。tcp_sock只是socket的一類,其他還有諸如inet_sock等支持各種協(xié)議的sock。所有TCP相關(guān)的信息都在tcp_sock中,比如序號啊,各種窗口等。
     
     發(fā)送和接收緩沖區(qū)就是sk_buffer的list。dst_entry就是路由的結(jié)果,為了避免太頻繁的路由,他們是sock關(guān)聯(lián)的。dst_entry允許簡單的ARP查找,它也是路由表的一部分。tcp_sock通過對四元組進行hash來索引。

驅(qū)動和網(wǎng)卡的交互

 這一部分的知識可能是網(wǎng)上最難搜索到的部分,很大一部分原因應(yīng)該是很少有人關(guān)注吧,但是了解了這部分知識會讓你更通透。
 
 驅(qū)動和網(wǎng)卡之間是異步通信。驅(qū)動在請求發(fā)送數(shù)據(jù)之后CPU就去干別的事情去了。網(wǎng)卡發(fā)送完包之后通過中斷通知CPU,CPU再通過驅(qū)動程序了解到結(jié)果。和發(fā)送數(shù)據(jù)一樣,接收數(shù)據(jù)也是異步的。網(wǎng)卡把數(shù)據(jù)倒騰到主存之后再通過中斷通知CPU。

 因此,預(yù)留一些空間來緩存發(fā)送和接受的buffer是必要的。大多數(shù)情況下,網(wǎng)卡使用環(huán)結(jié)構(gòu),這個環(huán)基本上就是一個隊列,它具有固定的條目數(shù),每一個條目存儲一個發(fā)送或者接受的數(shù)據(jù)。條目被順序的輪流使用,可以復(fù)用。如下圖6,可以看到數(shù)據(jù)傳送過程。
 


           圖6:驅(qū)動與網(wǎng)卡發(fā)送數(shù)據(jù)流

 驅(qū)動接收上層的數(shù)據(jù)并創(chuàng)建一個網(wǎng)卡可以理解的數(shù)據(jù)包描述(send descriptor),包含了主存地址和大小。由于網(wǎng)卡只認識物理地址,所以驅(qū)動還需將虛擬地址轉(zhuǎn)換成物理地址,之后把send descriptor放到Tx ring之中。下一步通過通知網(wǎng)卡有新的數(shù)據(jù)了,之后網(wǎng)卡通過DMA(直接內(nèi)存訪問)獲取元數(shù)據(jù)和數(shù)據(jù)發(fā)送出去。發(fā)送完之后通過DMA把結(jié)果寫回,之后發(fā)送中斷通知。

 數(shù)據(jù)的接收和發(fā)送反推過程差不多,自己看圖7說話吧;-)。
 


           圖7:驅(qū)動與網(wǎng)卡接收數(shù)據(jù)流

協(xié)議棧buffer和控制流

 協(xié)議棧中的控制流分為幾個階段。圖8顯示了buffer的發(fā)送過程。
         


              圖8:buffer發(fā)送流

 首先應(yīng)用程序創(chuàng)建數(shù)據(jù)并加入到發(fā)送緩沖區(qū)。如果緩沖區(qū)不足則調(diào)用失敗或者阻塞調(diào)用線程。因此應(yīng)用程序向內(nèi)核灌入數(shù)據(jù)的速率收到緩沖區(qū)大小的限制。
 
 之后TCP創(chuàng)建包并通過傳輸隊列(qdisc)發(fā)送給驅(qū)動。qdisc是一個FIFO結(jié)構(gòu)并且是固定大小,這個大小可以通過ifconfig命令查看,其中的txqueuelen便是,一般情況下它是千級別的。

 在驅(qū)動和網(wǎng)卡之間是TX ring。之前提到它是定長的,如果它沒有足夠的空間,那么當(dāng)傳輸隊列(qdisc)也滿了之后包就會被drop,就形成了之下而上的反壓。

 下圖9表現(xiàn)了buffer接收流。
          


               圖9:buffer接收流

 很容易通過發(fā)送流反推。值得注意的是驅(qū)動和協(xié)議棧之間沒有了隊列,數(shù)據(jù)是通過poll直接獲取的。如果主機處理的速度沒有網(wǎng)卡接收的快,則Rx ring會滿,就會有包被丟棄。一般情況下丟棄不會是因為TCP連接導(dǎo)致的,因為TCP連接有流量控制,但是UDP是沒有的??梢酝ㄟ^ifconfig命令看到很多信息,比如drop、error等包的數(shù)量。

最后

 現(xiàn)代的軟硬件TCP/IP協(xié)議棧單鏈接發(fā)送速率到1~2GiB/s完全沒有任何問題(經(jīng)過實測)。如果你想探索更優(yōu)秀的性能,你可以嘗試RMDA等技術(shù),他們通過繞過內(nèi)核以減少拷貝等方式優(yōu)化了性能,當(dāng)然可能依賴硬件。


深入淺出 TCP/IP 協(xié)議棧

TCP/IP 協(xié)議棧是一系列網(wǎng)絡(luò)協(xié)議的總和,是構(gòu)成網(wǎng)絡(luò)通信的核心骨架,它定義了電子設(shè)備如何連入因特網(wǎng),以及數(shù)據(jù)如何在它們之間進行傳輸。TCP/IP 協(xié)議采用4層結(jié)構(gòu),分別是應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和鏈路層,每一層都呼叫它的下一層所提供的協(xié)議來完成自己的需求。由于我們大部分時間都工作在應(yīng)用層,下層的事情不用我們操心;其次網(wǎng)絡(luò)協(xié)議體系本身就很復(fù)雜龐大,入門門檻高,因此很難搞清楚TCP/IP的工作原理,通俗一點講就是,一個主機的數(shù)據(jù)要經(jīng)過哪些過程才能發(fā)送到對方的主機上。 接下來,我們就來探索一下這個過程。

0、物理介質(zhì)

物理介質(zhì)就是把電腦連接起來的物理手段,常見的有光纖、雙絞線,以及無線電波,它決定了電信號(0和1)的傳輸方式,物理介質(zhì)的不同決定了電信號的傳輸帶寬、速率、傳輸距離以及抗干擾性等等。

TCP/IP協(xié)議棧分為四層,每一層都由特定的協(xié)議與對方進行通信,而協(xié)議之間的通信最終都要轉(zhuǎn)化為 0 和 1 的電信號,通過物理介質(zhì)進行傳輸才能到達對方的電腦,因此物理介質(zhì)是網(wǎng)絡(luò)通信的基石。

下面我們通過一張圖先來大概了解一下TCP/IP協(xié)議的基本框架:

當(dāng)通過http發(fā)起一個請求時,應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和鏈路層的相關(guān)協(xié)議依次對該請求進行包裝并攜帶對應(yīng)的首部,最終在鏈路層生成以太網(wǎng)數(shù)據(jù)包,以太網(wǎng)數(shù)據(jù)包通過物理介質(zhì)傳輸給對方主機,對方接收到數(shù)據(jù)包以后,然后再一層一層采用對應(yīng)的協(xié)議進行拆包,最后把應(yīng)用層數(shù)據(jù)交給應(yīng)用程序處理。

網(wǎng)絡(luò)通信就好比送快遞,商品外面的一層層包裹就是各種協(xié)議,協(xié)議包含了商品信息、收貨地址、收件人、聯(lián)系方式等,然后還需要配送車、配送站、快遞員,商品才能最終到達用戶手中。

一般情況下,快遞是不能直達的,需要先轉(zhuǎn)發(fā)到對應(yīng)的配送站,然后由配送站再進行派件。

配送車就是物理介質(zhì),配送站就是網(wǎng)關(guān), 快遞員就是路由器,收貨地址就是IP地址,聯(lián)系方式就是MAC地址。 

快遞員負責(zé)把包裹轉(zhuǎn)發(fā)到各個配送站,配送站根據(jù)收獲地址里的省市區(qū),確認是否需要繼續(xù)轉(zhuǎn)發(fā)到其他配送站,當(dāng)包裹到達了目標(biāo)配送站以后,配送站再根據(jù)聯(lián)系方式找到收件人進行派件。  

有了整體概念以后,下面我們詳細了解一下各層的分工。

1、鏈路層

網(wǎng)絡(luò)通信就是把有特定意義的數(shù)據(jù)通過物理介質(zhì)傳送給對方,單純的發(fā)送 0 和 1 是沒有意義的,要傳輸有意義的數(shù)據(jù),就需要以字節(jié)為單位對 0 和 1 進行分組,并且要標(biāo)識好每一組電信號的信息特征,然后按照分組的順序依次發(fā)送。以太網(wǎng)規(guī)定一組電信號就是一個數(shù)據(jù)包,一個數(shù)據(jù)包被稱為一幀, 制定這個規(guī)則的協(xié)議就是以太網(wǎng)協(xié)議。一個完整的以太網(wǎng)數(shù)據(jù)包如下圖所示:

整個數(shù)據(jù)幀由首部、數(shù)據(jù)尾部三部分組成,首部固定為14個字節(jié),包含了目標(biāo)MAC地址、源MAC地址和類型;數(shù)據(jù)最短為46個字節(jié),最長為1500個字節(jié),如果需要傳輸?shù)臄?shù)據(jù)很長,就必須分割成多個幀進行發(fā)送;尾部固定為4個字節(jié),表示數(shù)據(jù)幀校驗序列,用于確定數(shù)據(jù)包在傳輸過程中是否損壞。因此,以太網(wǎng)協(xié)議通過對電信號進行分組并形成數(shù)據(jù)幀,然后通過物理介質(zhì)把數(shù)據(jù)幀發(fā)送給接收方。那么以太網(wǎng)如何來識接收方的身份呢?

以太網(wǎng)規(guī)協(xié)議定,接入網(wǎng)絡(luò)的設(shè)備都必須安裝網(wǎng)絡(luò)適配器,即網(wǎng)卡, 數(shù)據(jù)包必須是從一塊網(wǎng)卡傳送到另一塊網(wǎng)卡。而網(wǎng)卡地址就是數(shù)據(jù)包的發(fā)送地址和接收地址,也就是幀首部所包含的MAC地址,MAC地址是每塊網(wǎng)卡的身份標(biāo)識,就如同我們身份證上的身份證號碼,具有全球唯一性。MAC地址采用十六進制標(biāo)識,共6個字節(jié), 前三個字節(jié)是廠商編號,后三個字節(jié)是網(wǎng)卡流水號,例如 4C-0F-6E-12-D2-19

有了MAC地址以后,以太網(wǎng)采用廣播形式,把數(shù)據(jù)包發(fā)給該子網(wǎng)內(nèi)所有主機,子網(wǎng)內(nèi)每臺主機在接收到這個包以后,都會讀取首部里的目標(biāo)MAC地址,然后和自己的MAC地址進行對比,如果相同就做下一步處理,如果不同,就丟棄這個包。

所以鏈路層的主要工作就是對電信號進行分組并形成具有特定意義的數(shù)據(jù)幀,然后以廣播的形式通過物理介質(zhì)發(fā)送給接收方。

2、網(wǎng)絡(luò)層

對于上面的過程,有幾個細節(jié)問題值得我們思考:

發(fā)送者如何知道接收者的MAC地址?

發(fā)送者如何知道接收者和自己同屬一個子網(wǎng)?

如果接收者和自己不在同一個子網(wǎng),數(shù)據(jù)包如何發(fā)給對方?

為了解決這些問題,網(wǎng)絡(luò)層引入了三個協(xié)議,分別是IP協(xié)議ARP協(xié)議、路由協(xié)議。

【1】IP協(xié)議

通過前面的介紹我們知道,MAC地址只與廠商有關(guān),與所處的網(wǎng)絡(luò)無關(guān),所以無法通過MAC地址來判斷兩臺主機是否屬于同一個子網(wǎng)。

因此,網(wǎng)絡(luò)層引入了IP協(xié)議,制定了一套新地址,使得我們能夠區(qū)分兩臺主機是否同屬一個網(wǎng)絡(luò),這套地址就是網(wǎng)絡(luò)地址,也就是所謂的IP地址。

IP地址目前有兩個版本,分別是IPv4IPv6,IPv4是一個32位的地址,常采用4個十進制數(shù)字表示。IP協(xié)議將這個32位的地址分為兩部分,前面部分代表網(wǎng)絡(luò)地址,后面部分表示該主機在局域網(wǎng)中的地址。由于各類地址的分法不盡相同,以C類地址192.168.24.1為例其中前24位就是網(wǎng)絡(luò)地址,后8位就是主機地址。因此, 如果兩個IP地址在同一個子網(wǎng)內(nèi),則網(wǎng)絡(luò)地址一定相同。為了判斷IP地址中的網(wǎng)絡(luò)地址,IP協(xié)議還引入了子網(wǎng)掩碼, IP地址和子網(wǎng)掩碼通過按位與運算后就可以得到網(wǎng)絡(luò)地址。

由于發(fā)送者和接收者的IP地址是已知的(應(yīng)用層的協(xié)議會傳入), 因此我們只要通過子網(wǎng)掩碼對兩個IP地址進行AND運算后就能夠判斷雙方是否在同一個子網(wǎng)了。

【2】ARP協(xié)議

即地址解析協(xié)議,是根據(jù)IP地址獲取MAC地址的一個網(wǎng)絡(luò)層協(xié)議。其工作原理如下:

ARP首先會發(fā)起一個請求數(shù)據(jù)包,數(shù)據(jù)包的首部包含了目標(biāo)主機的IP地址,然后這個數(shù)據(jù)包會在鏈路層進行再次包裝,生成以太網(wǎng)數(shù)據(jù)包,最終由以太網(wǎng)廣播給子網(wǎng)內(nèi)的所有主機,每一臺主機都會接收到這個數(shù)據(jù)包,并取出標(biāo)頭里的IP地址,然后和自己的IP地址進行比較,如果相同就返回自己的MAC地址,如果不同就丟棄該數(shù)據(jù)包。ARP接收返回消息,以此確定目標(biāo)機的MAC地址;與此同時,ARP還會將返回的MAC地址與對應(yīng)的IP地址存入本機ARP緩存中并保留一定時間,下次請求時直接查詢ARP緩存以節(jié)約資源。cmd輸入 arp -a 就可以查詢本機緩存的ARP數(shù)據(jù)。

【3】路由協(xié)議

通過ARP協(xié)議的工作原理可以發(fā)現(xiàn),ARP的MAC尋址還是局限在同一個子網(wǎng)中,因此網(wǎng)絡(luò)層引入了路由協(xié)議,首先通過IP協(xié)議來判斷兩臺主機是否在同一個子網(wǎng)中,如果在同一個子網(wǎng),就通過ARP協(xié)議查詢對應(yīng)的MAC地址,然后以廣播的形式向該子網(wǎng)內(nèi)的主機發(fā)送數(shù)據(jù)包;如果不在同一個子網(wǎng),以太網(wǎng)會將該數(shù)據(jù)包轉(zhuǎn)發(fā)給本子網(wǎng)的網(wǎng)關(guān)進行路由。網(wǎng)關(guān)是互聯(lián)網(wǎng)上子網(wǎng)與子網(wǎng)之間的橋梁,所以網(wǎng)關(guān)會進行多次轉(zhuǎn)發(fā),最終將該數(shù)據(jù)包轉(zhuǎn)發(fā)到目標(biāo)IP所在的子網(wǎng)中,然后再通過ARP獲取目標(biāo)機MAC,最終也是通過廣播形式將數(shù)據(jù)包發(fā)送給接收方。

而完成這個路由協(xié)議的物理設(shè)備就是路由器,在錯綜復(fù)雜的網(wǎng)絡(luò)世界里,路由器扮演者交通樞紐的角色,它會根據(jù)信道情況,選擇并設(shè)定路由,以最佳路徑來轉(zhuǎn)發(fā)數(shù)據(jù)包。

【4】IP數(shù)據(jù)包

在網(wǎng)絡(luò)層被包裝的數(shù)據(jù)包就叫IP數(shù)據(jù)包,IPv4數(shù)據(jù)包的結(jié)構(gòu)如下圖所示:

IP數(shù)據(jù)包由首部和數(shù)據(jù)兩部分組成,首部長度為20個字節(jié),主要包含了目標(biāo)IP地址和源IP地址,目標(biāo)IP地址是網(wǎng)關(guān)路由的線索和依據(jù);數(shù)據(jù)部分的最大長度為65515字節(jié),理論上一個IP數(shù)據(jù)包的總長度可以達到65535個字節(jié),而以太網(wǎng)數(shù)據(jù)包的最大長度是1500個字符,如果超過這個大小,就需要對IP數(shù)據(jù)包進行分割,分成多幀發(fā)送。

所以,網(wǎng)絡(luò)層的主要工作是定義網(wǎng)絡(luò)地址,區(qū)分網(wǎng)段,子網(wǎng)內(nèi)MAC尋址,對于不同子網(wǎng)的數(shù)據(jù)包進行路由。

3、傳輸層

鏈路層定義了主機的身份,即MAC地址, 而網(wǎng)絡(luò)層定義了IP地址,明確了主機所在的網(wǎng)段,有了這兩個地址,數(shù)據(jù)包就從可以從一個主機發(fā)送到另一臺主機。但實際上數(shù)據(jù)包是從一個主機的某個應(yīng)用程序發(fā)出,然后由對方主機的應(yīng)用程序接收。而每臺電腦都有可能同時運行著很多個應(yīng)用程序,所以當(dāng)數(shù)據(jù)包被發(fā)送到主機上以后,是無法確定哪個應(yīng)用程序要接收這個包。

因此傳輸層引入了UDP協(xié)議來解決這個問題,為了給每個應(yīng)用程序標(biāo)識身份,UDP協(xié)議定義了端口,同一個主機上的每個應(yīng)用程序都需要指定唯一的端口號,并且規(guī)定網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)包必須加上端口信息。 這樣,當(dāng)數(shù)據(jù)包到達主機以后,就可以根據(jù)端口號找到對應(yīng)的應(yīng)用程序了。UDP定義的數(shù)據(jù)包就叫做UDP數(shù)據(jù)包,結(jié)構(gòu)如下所示:

UDP數(shù)據(jù)包由首部和數(shù)據(jù)兩部分組成,首部長度為8個字節(jié),主要包括源端口和目標(biāo)端口;數(shù)據(jù)最大為65527個字節(jié),整個數(shù)據(jù)包的長度最大可達到65535個字節(jié)。

UDP協(xié)議比較簡單,實現(xiàn)容易,但它沒有確認機制, 數(shù)據(jù)包一旦發(fā)出,無法知道對方是否收到,因此可靠性較差,為了解決這個問題,提高網(wǎng)絡(luò)可靠性,TCP協(xié)議就誕生了,TCP即傳輸控制協(xié)議,是一種面向連接的、可靠的、基于字節(jié)流的通信協(xié)議。簡單來說TCP就是有確認機制的UDP協(xié)議,每發(fā)出一個數(shù)據(jù)包都要求確認,如果有一個數(shù)據(jù)包丟失,就收不到確認,發(fā)送方就必須重發(fā)這個數(shù)據(jù)包。

為了保證傳輸?shù)目煽啃裕琓CP 協(xié)議在 UDP 基礎(chǔ)之上建立了三次對話的確認機制,也就是說,在正式收發(fā)數(shù)據(jù)前,必須和對方建立可靠的連接。由于建立過程較為復(fù)雜,我們在這里做一個形象的描述:

主機A:我想發(fā)數(shù)據(jù)給你,可以么?

主機B:可以,你什么時候發(fā)?

主機A:我馬上發(fā),你接著!

經(jīng)過三次對話之后,主機A才會向主機B發(fā)送正式數(shù)據(jù),而UDP是面向非連接的協(xié)議,它不與對方建立連接,而是直接就把數(shù)據(jù)包發(fā)過去了。所以 TCP 能夠保證數(shù)據(jù)包在傳輸過程中不被丟失,但美好的事物必然是要付出代價的,相比 UDP,TCP 實現(xiàn)過程復(fù)雜,消耗連接資源多,傳輸速度慢。

TCP 數(shù)據(jù)包和 UDP 一樣,都是由首部和數(shù)據(jù)兩部分組成,唯一不同的是,TCP 數(shù)據(jù)包沒有長度限制,理論上可以無限長,但是為了保證網(wǎng)絡(luò)的效率,通常 TCP 數(shù)據(jù)包的長度不會超過IP數(shù)據(jù)包的長度,以確保單個 TCP 數(shù)據(jù)包不必再分割。

總結(jié)一下,傳輸層的主要工作是定義端口,標(biāo)識應(yīng)用程序身份,實現(xiàn)端口到端口的通信,TCP協(xié)議可以保證數(shù)據(jù)傳輸?shù)目煽啃?/strong>。

4、應(yīng)用層

理論上講,有了以上三層協(xié)議的支持,數(shù)據(jù)已經(jīng)可以從一個主機上的應(yīng)用程序傳輸?shù)搅硪慌_主機的應(yīng)用程序了,但此時傳過來的數(shù)據(jù)是字節(jié)流,不能很好的被程序識別,操作性差。因此,應(yīng)用層定義了各種各樣的協(xié)議來規(guī)范數(shù)據(jù)格式,常見的有 HTTP、FTP、SMTP 等,HTTP 是一種比較常用的應(yīng)用層協(xié)議,主要用于B/S架構(gòu)之間的數(shù)據(jù)通信,其報文格式如下:

在 Resquest Headers 中,Accept 表示客戶端期望接收的數(shù)據(jù)格式,而 ContentType 則表示客戶端發(fā)送的數(shù)據(jù)格式;在 Response Headers 中,ContentType 表示服務(wù)端響應(yīng)的數(shù)據(jù)格式,這里定義的格式,一般是和  Resquest Headers 中 Accept 定義的格式是一致的。

有了這個規(guī)范以后,服務(wù)端收到請求以后,就能正確的解析客戶端發(fā)來的數(shù)據(jù),當(dāng)請求處理完以后,再按照客戶端要求的格式返回,客戶端收到結(jié)果后,按照服務(wù)端返回的格式進行解析。

所以應(yīng)用層的主要工作就是定義數(shù)據(jù)格式并按照對應(yīng)的格式解讀數(shù)據(jù)。

5、全流程

首先我們梳理一下每層模型的職責(zé):

  • 鏈路層:對0和1進行分組,定義數(shù)據(jù)幀,確認主機的物理地址,傳輸數(shù)據(jù);

  • 網(wǎng)絡(luò)層:定義IP地址,確認主機所在的網(wǎng)絡(luò)位置,并通過IP進行MAC尋址,對外網(wǎng)數(shù)據(jù)包進行路由轉(zhuǎn)發(fā);

  • 傳輸層:定義端口,確認主機上應(yīng)用程序的身份,并將數(shù)據(jù)包交給對應(yīng)的應(yīng)用程序;

  • 應(yīng)用層:定義數(shù)據(jù)格式,并按照對應(yīng)的格式解讀數(shù)據(jù)。

然后再把每層模型的職責(zé)串聯(lián)起來,用一句通俗易懂的話講就是:

當(dāng)你輸入一個網(wǎng)址并按下回車鍵的時候,首先,應(yīng)用層協(xié)議對該請求包做了格式定義;緊接著傳輸層協(xié)議加上了雙方的端口號,確認了雙方通信的應(yīng)用程序;然后網(wǎng)絡(luò)協(xié)議加上了雙方的IP地址,確認了雙方的網(wǎng)絡(luò)位置;最后鏈路層協(xié)議加上了雙方的MAC地址,確認了雙方的物理位置,同時將數(shù)據(jù)進行分組,形成數(shù)據(jù)幀,采用廣播方式,通過傳輸介質(zhì)發(fā)送給對方主機。而對于不同網(wǎng)段,該數(shù)據(jù)包首先會轉(zhuǎn)發(fā)給網(wǎng)關(guān)路由器,經(jīng)過多次轉(zhuǎn)發(fā)后,最終被發(fā)送到目標(biāo)主機。目標(biāo)機接收到數(shù)據(jù)包后,采用對應(yīng)的協(xié)議,對幀數(shù)據(jù)進行組裝,然后再通過一層一層的協(xié)議進行解析,最終被應(yīng)用層的協(xié)議解析并交給服務(wù)器處理。

6、總結(jié)

以上內(nèi)容是對TCP/IP四層模型做了簡單的介紹,而實際上每一層模型都有很多協(xié)議,每個協(xié)議要做的事情也很多,但我們首先得有一個清晰的脈絡(luò)結(jié)構(gòu),掌握每一層模型最基本的作用,然后再去豐富細枝末節(jié)的東西,也許會更容易理解。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服