網絡分層基礎概念與TCP,IP協議解析

網絡分層基礎概念:

 

ISOOSI網絡分層模型不同。網絡分層事實上的標準為TCP/IP 的網絡分層模型。

 

下圖是他們是他們之間的對應關系。

 

左邊為OSI網絡分層模型。右邊為TCP/IP的網絡分層模型。

網絡分層基礎概念與TCP,IP協議解析


網絡分層,是將一個大而復雜的網絡,拆分為多個層次,每個層次單獨完成自己的任務,多個層次再結合起來,完成一個復雜的通信過程。下層協議,為上層提供服務。這樣拆分的好處不僅是將一個復雜的任務分成小任務分別完成,并且拆分之后,不同的層次之間,若是出了問題,可以迅速定位,還有一點就是每一層之間,通過接口進行傳輸,這使得每一層是獨立的,他們的關系非常靈活。比如,數據鏈路層不用這物理層是通過網線還是無線傳輸的,只要收到物理層傳輸過來的電磁信號即可,網絡層也不用管數據鏈路層是通過交換機,還是集線器完成不同的MAC地址之間的通信,只要收到數據鏈路層傳輸過來的信號即可。獨立分層之后,關系非常靈活。

 

我們簡單來描述一下每一層到底是什么,他們是做什么的。

 

物理層:定義物理傳輸介質的特性。這一層最底層,像定義用光纖傳輸,還是用同軸線纜傳輸之類的。

數據鏈路層:

主要是說設備到設備之間的通信。其實就是MAC地址之間的通信了。我們都知道,不同的主機,MAC地址是不同的。MAC地址分為六段,前三段為廠商的固定編號,后三段為不同的主機之間進行唯一標識的編號。當一個網絡中主機數量多的時候,就需要用到交換機來將眾多的主機相連起來,并且采用載波偵聽,多路訪問,沖突檢測機制保證主機與主機之間進行有效通信。簡稱CSMA/CD此后,在MAC底層采用此種機制通信的網絡,都稱為以太網。這就是以太網的由來。

 

網絡層:

數據鏈路層只完成同一局域網中的不同主機之間的通信,那不在同一局域網中的主機如何進行通信?這就要靠網絡層中的Internet protocol協議來進行界定。MAC地址是物理上的地址,可以說是唯一且固定不變的。它在局域網上工作是沒問題的,若不在同一網絡中,MAC地址如何進行通信?這幾乎是不可能的事情,所以我們需要在MAC地址之上,再給主機附加一層邏輯上的地址,進行網絡界定,判斷他們是否在同一網絡內,若不在同一網絡內,如何通過路由將報文送到另一網絡中,進行通信。為了解決網絡層的這個問題,誕生了大名鼎鼎的IP協議。

 

傳輸層:

通過數據鏈路層與網絡層,同一網絡上主機與主機之間的連接,不同網絡間主機與主機之間的連接都已經得到解決,但連接起來之后,要進行怎樣的通信?我們知道通信的種類大體可以分為兩種,TCPUDP。TCP主要是面向連接,有錯誤檢測,有確認機制,可重傳的連接,像我們平時下載應用程序就是一個非常典型采用TCP協議進行連接的例子,若是采用UDP進行連接,可靠性將得不到保障,大家都知道,對于一個應用程序而言,若是傳輸過程中少了一個即使一個字節,都可能會使這個應用程序跑不起來。UDP是非面向連接,但速度非常高效的連接,最典型的就是通過QQ發送的短消息,無需要對方在線,只要將信號往網絡中一發,完事。即使對方收不到,也可以重發一次,無需非??量痰目煽啃?。

應用層:

其實,說主機與主機之間的通信,是不精確的,在本質上,通信都是進程與進程的通信。不同的進程,監聽在不同的端口號上,比如HTTP服務,監聽于80端口,MYSQL服務,監聽于3306端口,SSHSecure shell)服務,監聽于22端口,FTP服務,監聽于21端口。不同的服務之間進行通信,也有不同的協議,著名的有http(超文本傳輸)協議,FTP(文件傳輸)協議,DNS(域名解析)協議

 

通過上邊的簡單介紹,相信大家對網絡分層有了一個基本的概念,并且每層是分別完成網絡通信中的什么動作,也有了大體了解。

網絡通信的學習,最難的就是傳輸層與網絡層。下面我們重點是解析一下傳輸層與網絡層。

因為通信是進程與進程之間的通信,數據首先是從應用層進行封裝,再到傳輸層,再到網絡層的,然后是數據鏈路層,再到物理層。

先了解報文是什么:報文(message)是網絡中交換與傳輸的數據單元,它包含了完整的傳輸與交換信息。

并且長度并不是一致的。為什么?因為報文有大小,報文在傳輸的過程中,傳輸到不同的網絡分層時,會被不斷的分解。并且在不同的分層中,它的稱呼也是一不一樣的。

應用層的一個報文,到傳輸層時,若是傳輸層的TCP協議進行傳輸,因為tcp是面向連接,可靠的,可重傳的協議,為了保證可靠性,報文就會被分段進行傳輸,形成一個一個的數據段(seqment),若是對方沒有收到某個段,則再重新發送此數據段。若是用UDP進行傳輸,則是無論大小,直接以數據報(datagram)的方式進行傳輸,傳完即可,十分高效,也不需要關心對方是否在線,對方是否接收到報文。

無論是以TCP或是UDP方式進行傳輸,到達網絡層時若數據段或數據報太大,將會被分成許多小的數據包進行傳輸,因為路由器的MTUMax Transmission Unit)是有限制的。

到了數據鏈路層,每個數據包加上偵頭與偵尾之后,就形成了偵(frame),并以偵的方式進行傳輸。

到了物理層,再以位(bit)的方式進行傳輸。

 

他們的包含關系大體如下。

網絡分層基礎概念與TCP,IP協議解析

 

先說說傳輸層。傳輸層,就是講應用層下來的報文,如何進行傳輸,是通過TCP,還是UDP

當通過tcp時,報文都被拆分成數據段(sqement)的方式進行傳輸。這些數據段內部的結構如下圖。

 

網絡分層基礎概念與TCP,IP協議解析

TCP的數據段部分主要包含了應用層報文的應用層首部與應用層數據報文。

我們重要解析一下TCP的首部組成。

網絡分層基礎概念與TCP,IP協議解析

網絡分層基礎概念與TCP,IP協議解析先說端口,大家有沒有想過,在應用層上,進程與進程之間的通信,是如何分辨眾多進程中,發起通信的進程是如何在另一臺主機上找到另一個它要通信的進程呢?

靠的就是端口。TCPUDP都向上層的進程提供了不同的端口號。并且這些端口號是固定的,如HTTP進程,就應該監聽在TCP提供的80端口上,雖然這不是強制規定,但卻是一種共識。不然就無法進行通信,當然這指的是服務端的HTTP進程。客戶端的進程是臨時由內核指派的。所以想要進行進程間的通信,就先要指明端口號。

接下來是序號,需要注意的是序號是相對的,兩個進程開始通信,相對來講序號都是從0開始。

再到確認號,這個有些特殊,意為收到了對方的數據,并且值是希望對方下次發的那個數據的序號。比如上次對方發的是x,那確認號應該為ack=x+1。

數據偏移:現在我們知道,在TCP協議的傳輸中,為了保證可靠性,數據是分組傳輸的,分組傳輸之后這些數據如何恢復呢?就是靠偏移量來計算的。

標記位:都是一個字節,值當然不是1就是0了。

標記位主要有:

UGR:緊急數據

ACK:確認號

PSH:是否緩存

RST:連接出現嚴重錯誤,需要重傳

SYN:同步序號。當SYN=1 ACK=0時意為請求連接,SYN=1,ACK=1時意為同意連接。一般用在TCP前兩次握手中。

FIN:請求結束標記

窗口:我們知道,主機與主機之間,根據網卡的性能,網絡的速度,接收報文的吞吐量是不同的,這時就要靠“滑動窗口”來調整大小,先發較小單位的數據,慢慢增加,若對方表示已經到達上限,則停止增加,雙方達到最佳傳輸速度。

緊急指針:我們知道,內核處理數據也是需要時間的,當URG1 時,表示此報文需要立即處理,不能等待,相當于能插隊的意思。

要分析TCP就不能不說TCP的三次握手與四次斷開。

TCP號稱面向連接,是可靠的,有錯誤檢測,可重傳的連接,就是靠這些復雜的確認機制來實現的。

那么他們是如何工作的呢?

TCP建立連接的時候,我們稱為三次握手。

這要求,對方必須在線,這就是面對連接的由來。

網絡分層基礎概念與TCP,IP協議解析

三次握手與主機狀態的變化:

先了解這些單詞是如何來的:

SYN: sync 同步

ACKacknowledgement  標記位確認號

seq: sequence  序號

ack: acknowledgement 數據段確認號

解析:

1:當客戶端請求連接時,發出一個SYN=1的同步信號,相當于說“我準備好啦,通信嗎?”,并且發送序號為x的數據段過去。即seq=x,同時發送一個ack=y,意為請求對方下次發送一個序號為y的包過來。SYN=1 ACK=0 seq=x ack=y

客戶主機的狀態由CLOSE(關閉)狀態進入SYN-SENT(同步——已發送)狀態。

2:服務器端收到請求之后,若服務器端同意,也發一個SYN=1的同步信號,相當于說“我也準備好啦,可以通信!”,并且發送一個ACK=1的確認報文,表示客戶端上次發送的報文服務器端已經收到,seq=y表示服務器響應給客戶端請求,將序號為y的數據段發送出去。并且再發送一個ack=x+1表示客戶發過來的x數據段已經收到,請求客戶端下次發送序號為x+1的數據段過來。SYN=1 ACK=1 seq=y ack=x+1

由于服務器是被請求方,所以是被動打開,并且進入監聽狀態,監聽來自客戶端報文。當服務器發送完同意請求的報文后,就進入了SYN-RCVD(同步—已接收)狀態。

(大寫的ACK是確認號,小寫的ack是數據段的相對序號,并且當SYN=1時,發送的數據段不能攜帶數據,即發送的是空的數據段,但要占一個序號。)

3:通過前面兩次同步,得知雙方都在線,第三次就不必再發SYN標記了??蛻舳耸盏椒掌鞯捻憫獔笪暮?,發送一個ACK=1的確認信號,并且發送一個ack=y+1表示服務器發送過來的序號為y的數據段已經收到,請求服務器發送序號為Y+1的數據段,同時發送sqe=x+1,即將服務器請求的x+1的數據段發送出去。

ACK=1 ack=y+1 seq=x+1

此時客戶端已經得到服務器端同意請求的回應,于是從SYN-SENT(同步發送狀態)進入連接狀態,并且發送一個ACK=1的報文告訴服務器可以進行連接狀態了。服務器端收到ACK=1信號后,也從SYN-RCVD(同步接收狀態)進入連接狀態。

 

這時大家可能有一個疑問,第一,第二次握手時,同步狀態都已經確認了,為什么還要再來第三次?這里有一種情況需要說明一下。若是網絡上出現延遲,假設client端發送的請求很長時間才到達service端,在這段時間內client由于得不到回應而進入close。而這個請求并沒有在網絡上消失,只是在網絡上延遲送達,當service收到請求后,并不知道client已經進入close狀態,于是同意發送建立連接響應,并進入syn-rcvd狀態。注意,由于client已經釋放了上一次的請求并進入close狀態,是根本不會收到service的同意建立連接的響應的,自然談不上去響應service。而此時serivce一直處于listen狀態,白白浪費資源。所以才需要第三次握手來再次確認是否真的要建立連接。

通信上述解析,相信大家對于TCP協議的原理也有了一個大概的了解。

有握手就有斷開,我們再來聊聊TCP協議的四次斷開時,標記位的變化與主機機狀態的切換。

網絡分層基礎概念與TCP,IP協議解析

四次斷開:

1:客戶端請求斷開,并且從連接狀態進入fin-wait-1。此刻發送的數據段標記位的值為:FIN=1 sqe=x

2: 服務器立即確認收到信號,但并不會立即斷開,因為可能還有數據沒傳完呢。所以響應的數據段的標記位值為:ACK=1 sqe=v ack=u+1。并且也從連接狀態進入close-wait狀態同時繼續將未完的數據段繼續傳輸。

而客戶端收到確認信號后,也從fin-wait1進入fin-wait狀態,等待服務器數據傳輸完成之后發送斷開確認信號。

3:當服務器數據傳輸完畢后,就會發送斷開連接確認,此時的標記位的值為:FIN=1 ACK=1 sqe=w ack=u+1。并且從close-wait狀態,進入last-ack狀態。

(seq此時為為v+1是因為服務器給客戶端發送了許多數據段)

4:客戶端收到確認斷開連接的信號后,立即跟服務器發確認信號:ACK=1 seq=u+1 ack=w+1表示服務器可以斷開連接,并且自己也進入time-wait狀態等待一定的時間后自動進入close狀態。

 

 

 

呼,費了一大通力氣解釋TCP,大家有沒有一個大概的了解?

下面我們來解析一下UDP協議的工作機制。

UDP的工作特性:

優點:高效

缺點:提供網絡通信并不可靠,無錯誤檢查,無數據恢復特性。

 

UDP首部:源端口,目標端口,數據報長度,校驗值。

網絡分層基礎概念與TCP,IP協議解析

UDP全稱User Datagram Protocol,它所發送的報文,并不分段,是無論大小直接向網絡上扔出去的,所以上層的報文進入UDP協議后稱為數據報。

并且UDP首部相對簡單許多。只有源端口,目標端口,報文長度,檢驗和。他并不像是TCP有一系列復雜的確認機制,也無需要對方是否在線,直接往網絡中發送,所以并不能保證通信的可靠性,不面向連接,自然無從談錯誤檢測和數據重傳了。

講完傳輸層的兩大重要協議,下面我們再來講講網絡層的ip協議。

先來思考一個問題:

A網絡中的1主機,要與B網絡中的2主機進行通信,他們之間要如何進行通信呢?

可能大家會說,可以基于MAC地址進行通信。若1知道2MAC地址,自然可以通信,但前提得先要他們在同一局域網中,不然既然1知道2MAC地址,通過交換機在局域網上進行廣播,2主機不在1主機的A網絡中,是不可能響應這個廣播的。

1主機與2主機根本不在同一網絡中,他們之間要進行通信,就要先解決A網絡與B網絡的互聯。

一個新的問題又來了。

1主機與2主機又是如何得知他們不是在同一個網絡中的呢?

這就需要一個判斷機制。

光有MAC地址,只能標記主機是唯一的,并不能標識應該主機所在的網絡,我們需要邏輯上的一層地址,來對網絡中的已經有唯一標識的主機進行地址界定。這就是IP協議的由來。

有了IP地址之后,12就能通過IP判斷對方是否與自己在同一網絡中了。假設1IP192.168.22.168,2ip192.168.33.168。通過網段的比較,1就知道2根本不與自己在同一網絡中,自然不會發廣播,而是直接將報文發給默認網關,讓網關幫忙將報文一個網絡中的2主機所在的B網絡。從而讓2主機收到報文。

IP協議是如何對不同的網絡進行標識的呢?

這個問題有點復雜,我們得先要了解一些IP地址的分類。

主要有三類:

A1.0.0.0  —  126.255.255.255

B:  128.0.0.0 –191.255.255.255

C:  192.0.0.0 –223.255.255.255

DE由于不常見,就不討論。

0.0.0.0用于主機剛剛開機還沒有IP的時候,DHCP就要靠這個申請IP。

255.255.255.255限制廣播地址,對本機來說,這個地址是指本網段且同一廣播域內的的所有主機。

127.0.0.1–127.255.255.254用于本地回環,主要有測試的功能。

10.0.0.0A類網的私有地址,172.16.0.0 — 172.32.0.0B類網的私有地址,192.168.0.0—192.168.255.0C類網的私有地址。這三種私有地址都能在局域網中進行通信,但是不能在廣域網中進行通信。

組播地址,在高可用集群服務中有應用。

 

 

子網掩碼:主要用于界定網絡ID與主機ID。A類網的掩碼為255.0.0.0。B類網的掩碼為255.255.255.0C類網的掩碼為255.255.255.0。

 

 

給定一個IP地址,通過與子網掩碼進行與運算,就能得到網絡ID。計算機就是靠先將自己的IP地址與子網掩碼進行與運算得出網絡ID后,再將目標的IP地址與自己的掩碼相與,若得出的網絡ID一樣,則知道這IP是與自己在同一網段上,于是直接在本網段發廣播,若得到的網絡ID不一樣,則發送到默認網關處,讓網關路由,將報文傳輸到目標IP。

先了解當上層的TCP/UDP數據段或是數據報到達這一層后,是如何傳輸的。

上層的數據,到達這一層后,通常會被分成一個一個的包傳送,稱為數據包。

而每一個數據包,也是包頭與數據部分組成的。如下圖。

 網絡分層基礎概念與TCP,IP協議解析

我們重點分析一下,IP首部到底包含了哪些信息。


網絡分層基礎概念與TCP,IP協議解析




版本號:通常有IPV4 IPV6兩種。占4位。

首部長度: 用來標識IP首部長度的。占4位。首部長度一般為20字節,但妝IP有填充時,就不一定了,但最多可有60字節。

總長度:占16位,標識整個數據包的長度的,包括數據部分長度。由此可知整個數據包最大可為2^16減去1。即65535個字節。

標識:由上可知,即數據包最大只能為65536字節,那如果我們要傳輸一個傳輸層的UDP協議下來的總共大小為1MN個數據報,這1M的數據報就要被切割成1M/65535B個數據包。這些來自同一個數據報的數據包就要打上相同的標識,好讓對方主機收到之后,能在網絡層的拆包時根據標識來識別應該將哪些數據包合成一個數據報,一般情況下,TCP由于MSS大小的限制,都會先將報文分段,而分段的大小都是小于MTU限制的,所以TCP的數據段在網絡層一般都不會被分片傳輸。

片偏移:光打上標識還不夠,打上標識僅能表明這些數據包是同一數據報的,對方對到之后,還要靠片偏移來將同一個數據報的數據包進行有序組合,才能對數據報進行還原。

標志:主要標志數據包是否經過分片的。有時傳輸層下來的數據段,數據報,并不需要再切割分片,就要靠標志位來標志。

壽命:Time to live,數據包也是有生命周期的,linux64windows128。它是以經過的路由器的個數算的,每經過一個路由器值就減1,為0時將不再被路由,直接丟棄。

協議:標明上層用的是什么協議。

 

 

 

 

好了,以上就是TCP/IP協議棧中最主要的兩層的介紹,以及各層協議的分析。希望對大家有用。

 

原創文章,作者:old_radish,如若轉載,請注明出處:http://www.www58058.com/74758

(1)
old_radishold_radish
上一篇 2017-05-04
下一篇 2017-05-04

相關推薦

  • Memcached + MSM 實現Tomcat Session保持

    Memcached + MSM 實現Tomcat Session保持 tomcat memcached 前言 Memcached介紹 MSM介紹 實驗拓撲 實驗環境 實驗步驟 安裝配置Tomcat 安裝配置Nginx負載均衡 安裝配置Memcached + MSM 總結 前言 上篇文章我們實現了session sticky和session clus…

    2016-04-22
  • 第六周學習總結

    寫在前面 在互聯網+的時代,網絡顯得越發重要,如果現在你一頓不吃飯可能還沒事但是一個小時沒網絡,估計你都要瘋了。那么網絡到底是個啥呢?看不見又摸不著。拿著一臺電腦怎么和網絡建立連接呢?那么下面要講解的內容或許可以給你解決個大概。 閑聊網絡 如果讓你修一棟房子你會一層一層的往上修,并且規劃好一層用來開商鋪,二層用來開超市,上面一層用來干嘛等等,其實網絡也是一樣…

    2018-01-08
  • M22 Centos環境設置

    Centos有4個地方存儲環境變量:/etc/profile /etc/bashrc ~/.bash_profile ~/.bashrc /etc/profile:定義了系統環境變量pathmunge()函數如果第二個參數是“after”,PATH=$PATH:$1設置MAIL路徑為/var/spool/mail/$USER設置root帳號的環境變量設置HI…

    Linux干貨 2017-03-05
  • (一)Linux發行版及基礎命令簡述

    計算機 Linux 發行版 命令 幫助

    2017-12-11
  • 由摩根定律引發的思考

    在Linux中,我們常常需要對一些條件進行判斷,而對于多個條件的組合判斷是基于摩根定律而進行的。所以理解摩根定律對于我們學習條件判斷是很有必要的,下面我們就先介紹摩根定律進而引出其在一些具體場景上的應用。   一、摩根定律 在Linux中的條件判斷中,摩根定律可以以下式來表示: !( A || B )=!A && !B !( A &…

    Linux干貨 2016-08-16
  • 8月22日shell腳本編程之循環和函數

    shell腳本編程 本章內容 編程基礎 腳本基本格式 變量 運算 條件測試 流程控制 函數 數組 高級字符串操作 高級變量 配置用戶環境 編程基礎 程序:指令+數據 編程程序風格:   過程式:以指令為中心,數據服務于指令   對象式:以數據為中心,指令服務于數據 shell程序:提供了編程能力,解釋執行 程序的執行方…

    Linux干貨 2016-08-24
欧美性久久久久