勞於讀書,逸於做文。html
原文地址:internet協議入門git
博主博客地址:Damonare的我的博客github
博主以前寫過一篇博客:網絡協議分析,在這篇博客裏經過抓包,具體的分析了不一樣網絡協議的傳送的數據和傳送的方式。而此篇博客則用來做爲一個大綱式的內容,按照層級劃分,逐步介紹各層級的協議以及他們所起的做用。如有錯誤之處,歡迎批評指正。數據庫
互聯網的實現,分紅好幾層。每一層都有本身的功能,就像建築物同樣,每一層都靠下一層支持。服務器
首先咱們須要明白的事互聯網的實現是分層級的,那麼這個層級的劃分根據不一樣的模型又有一些不一樣。其中又有兩個模型的劃分是咱們最多見到的,一個是OSI七層劃分,另外一個是TCP/IP五層劃分。他們分別把互聯網分紅了七層和五層。微信
OSI和TCP/IP模型是很基礎但又很是重要的網絡基礎知識網絡
OSI七層模型架構
OSI的層 | 功能 | TCP/IP協議族 |
---|---|---|
應用層 | 文件傳輸,電子郵件,文件服務,虛擬終端 | TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet |
表示層 | 數據格式化,代碼轉換,數據加密 | 沒有協議 |
會話層 | 解除或創建與別的接點的聯繫 | 沒有協議 |
傳輸層 | 提供端對端的接口 | TCP,UDP |
網絡層 | 爲數據包選擇路由 | IP,ICMP,RIP,OSPF,BGP,IGMP |
數據鏈路層 | 傳輸有地址的幀以及錯誤檢測功能 | SLIP,CSLIP,PPP,ARP,RARP,MTU |
物理層 | 以二進制數據形式在物理媒體上傳輸數據 | ISO2110,IEEE802,IEEE802.2 |
每一層都是爲了完成一種功能。爲了實現這些功能,就須要你們都遵照共同的規則。
你們都遵照的規則,就叫作"協議"(protocol)。
這個協議就是咱們所說的互聯網協議
(internet protocol),每一層都有若干個協議,他們共同構成了咱們所要講的互聯網協議。
由以上表格咱們能夠看出,在OSI七層協議
模型裏會話層和表示層是沒有協議的,這裏咱們取的是TCP/IP
模型,分紅五層也比較容易解釋。
那麼這五層又都是什麼呢?從上到下分別是:socket
層級 | 網絡設備 |
---|---|
應用層 | 也就是用戶使用的應用了。 |
傳輸層 | 四層交換機、也有工做在四層的路由器 |
網絡層 | 路由器、三層交換機 |
數據鏈路層 | 網橋(現已不多使用)、以太網交換機(二層交換機)、網卡(其實網卡是一半工做在物理層、一半工做在數據鏈路層) |
物理層 | 網卡,光纖,CAT-5線,中繼器、集線器、還有咱們一般說的雙絞線也工做在物理層 |
如上表格所示,最底下的一層叫作物理層
(Physical Layer),最上面的一層叫作應用層
(Application Layer),中間的三層(自下而上)分別是數據鏈路層
(Data Link Layer)、網絡層
(Network Layer)和傳輸層
(Transport Layer)。越下面的層,越靠近硬件;越上面的層,越靠近用戶。下面來介紹每一層的功能,着重介紹每一層的主要協議分佈式
物理層規定:爲傳輸數據所須要的物理鏈路建立、維持、拆除,而提供具備機械的,電子的,功能的和規範的特性 ——物理層(維基百科)
上面維基百科對於物理層的解釋說白了就是要把電腦連在一塊,方法呢,能夠用光纜、電纜、雙絞線、無線電波等方式。
物理層
就是把電腦鏈接起來的物理手段。它主要規定了網絡的一些電氣特性,做用是負責傳送0和1的電信號。
在兩個網絡實體之間提供數據鏈路鏈接的建立、維持和釋放管理。構成數據鏈路數據單元(frame:數據幀或幀),並對幀定界、同步、收發順序的控制。 ——數據鏈路層(維基百科)
上面說的網絡實體也就是咱們平常用到的手機電腦等聯網設備了,咱們剛剛瞭解到不一樣網絡實體之間經過一些物理手段(光纜,雙絞線,無線電波等)鏈接在了一塊兒,來進行傳輸0和1電信號。單純的傳輸0和1沒有任何意義,確定是要規定電信號的解讀方式,多少個電信號是一組?每一組表明的意義又是什麼?
這就是數據鏈路層的功能,規定這些電信號的分組方式。
剛剛開始的時候,每一家公司都有本身的一套對於電信號的解讀方式,後來隨着時間的推移,一種叫作以太網
(Ethernet)的協議,佔據了主導地位。
以太網規定,一組電信號構成一個數據包,叫作"幀"(Frame)。每一幀分紅兩個部分:標頭(Head)和數據(Data)。
標頭
包含數據包的一些說明項,好比發送者、接受者、數據類型等等;數據
則是數據包的具體內容。
標頭
的長度,固定爲18字節。數據
的長度,最短爲46字節,最長爲1500字節。所以,整個幀
最短爲64字節,最長爲1518字節。若是數據很長,就必須分割成多個幀
進行發送。
我想在平常上網過程當中,最爲熟悉的就是用一根網線鏈接端口和電腦了吧,網線鏈接電腦其實是鏈接的這個玩意兒:
上面就是咱們所說的網卡了,它在物理層和數據鏈路層兩個層級工做,正所謂能力越大責任越大,網卡的重要性天然不言而喻了。前面說,以太網規定每個數據包都有一個標頭
(Head)來講明發送者,接受者信息,數據類型等信息。而網卡就是以太網規定的來標明發送者和接受者信息的工具。
網卡的地址,就是數據包的發送地址和接收地址,這叫作MAC地址。
這個Mac地址天然就是發送者,接受者信息的了,經過這個每臺電腦獨一無二的地址計算機就能經過一些方式找到另外一臺電腦了。每塊網卡出廠的時候,都有一個全世界獨一無二的MAC地址,長度是48個二進制位,一般用12個十六進制數表示。有了MAC地址,就能夠定位網卡和數據包的路徑了。
咱們如今有了網卡,也知道每一塊網卡都有一個世界上獨一無二的Mac地址,那發送者應該怎麼去找接受者這臺設備呢,換句話說發送者怎麼才能知道接受者的Mac地址呢?這就須要另外一個協議了叫作ARP協議,這個協議留在後面介紹。這裏咱們只須要知道,發送者必需要知道接受者的Mac地址才能準確的發送數據。
以太網採用了一種廣撒網的方式,發送者發送的數據包會發送給本網絡內全部的計算機,而後由接收到數據包的計算機來判斷本身是否是接收方。
圖片來自維基百科廣播),如圖所示,紅色主機是發送方,綠色某一臺是接收方,數據包會發送給同一個子網絡的全部綠色主機,而後由綠色主機根據數據包的標頭來判斷本身是否是接收方。若是是,就接受這個包,不是則丟棄。這種發送數據的方式就是廣播
。
綜上,有了對於數據包的定義,網卡的Mac地址,廣播的發送方式,數據鏈路層基本就算完整了,而後不一樣計算機之間就能夠傳送數據了。
網絡層使兩終端系統可以互連且決定最佳路徑,並具備必定的擁塞控制和流量控制的能力。 ——網絡層(維基百科)
走到這裏咱們實現的只是在一個子網絡裏傳送數據。但咱們知道,互聯網其實是由大大小小的子網絡組成的:
大到一個ISP(因特網服務提供商,國內較大的好比移動電信等),小到一個公司的局域網,正事這些大大小小的子網絡組成了龐大的互聯網體系。但實際上,廣播的方式只能在子網絡內進行,不一樣子網絡之間廣播方式是行不通的。
所以咱們須要一種方法可以判斷兩臺主機是否在同一個子網絡以內,若是在同一個子網絡就以廣播的方式傳輸數據,若是不在同一個子網絡就以路由
的方式傳輸(路由是個比較大的概念,本文不涉及),關於路由協議的瞭解戳這裏,MAC地址作不到這一點,它只和廠商有關,和計算機所處的網絡並無關係。
這就致使了"網絡層"的誕生。它的做用是引進一套新的地址,使得咱們可以區分不一樣的計算機是否屬於同一個子網絡。這套地址就叫作"網絡地址",簡稱"網址"。
網址的出現,使得每臺計算機都有了兩個地址,一個是出生就帶着不會改變的Mac地址,一個是後期網絡管理員分配的可變的網絡地址。網址判斷兩臺計算機是否在同一個子網絡,Mac地址則是將數據準確的傳遞到目標計算機中。所以邏輯上能夠判斷一定是先處理網絡地址,再處理Mac地址。
規定網絡地址的協議,叫作IP協議。它所定義的地址,就被稱爲IP地址。
如今普遍採用的是IP協議第四版,簡稱IPv4。這個版本規定,網絡地址由32個二進制位組成,IPV6則是64個二進制組成。
因爲IPV6尚未普遍應用,這裏仍是用IPV4講解。通常咱們用分紅四段(IPV6分紅八段)的十進制數表示IP地址,從0.0.0.0一直到255.255.255.255。這個地址分紅兩部分,前一部分是網絡部分,後一部分表明主機。But!!!網絡部分具體是前16位仍是前24位,咱們無法從IP地址進行判斷,這是咱們就須要另外一參數叫作子網掩碼
。
所謂"子網掩碼",就是表示子網絡特徵的一個參數。它在形式上等同於IP地址,也是一個32位二進制數字,它的網絡部分所有爲1,主機部分所有爲0。好比,IP地址172.16.254.1,若是已知網絡部分是前24位,主機部分是後8位,那麼子網絡掩碼就是11111111.11111111.11111111.00000000,寫成十進制就是255.255.255.0。
知道"子網掩碼",咱們就能判斷,任意兩個IP地址是否處在同一個子網絡。方法是將兩個IP地址與子網掩碼分別進行AND運算(兩個數位都爲1,運算結果爲1,不然爲0),而後比較結果是否相同,若是是的話,就代表它們在同一個子網絡中,不然就不是。
好比,已知IP地址172.16.254.1和172.16.254.233的子網掩碼都是255.255.255.0,請問它們是否在同一個子網絡?二者與子網掩碼分別進行AND運算,結果都是172.16.254.0,所以它們在同一個子網絡。
那麼問題來了,IP地址放在哪裏存儲呢?是的,咱們能夠直接存儲在前面提到的以太網數據包的Data部分。
IP地址長這樣:
"標頭"部分主要包括版本、長度、IP地址等信息,"數據"部分則是IP數據包的具體內容。
如今把它加到以太網數據包裏面:
IP數據包的"標頭"部分的長度爲20到60字節,整個數據包的總長度最大爲65,535字節。所以,理論上,一個IP數據包的"數據"部分,最長爲65,515字節。前面說過,以太網數據包的"數據"部分,最長只有1500字節。所以,若是IP數據包超過了1500字節,它就須要分割成幾個以太網數據包,分開發送了。
如今爲止咱們必須知道兩個地址,一個是IP地址,一個是Mac地址才能把數據發送到目標主機,那麼IP地址是已知的(後文解釋),MAC地址怎麼獲取呢?
咱們須要一種能經過IP地址得知MAC地址的機制,這個極致就是ARP協議。
那麼,這裏又分紅兩種狀況,一種是兩臺計算機在同一個子網絡,那麼咱們能夠用ARP協議,獲得對方的MAC地址。ARP協議也是發出一個數據包(包含在以太網數據包中),其中包含它所要查詢主機的IP地址,在對方的MAC地址這一欄,填的是FF:FF:FF:FF:FF:FF,表示這是一個"廣播"地址。它所在子網絡的每一臺主機,都會收到這個數據包,從中取出IP地址,與自身的IP地址進行比較。若是二者相同,都作出回覆,向對方報告本身的MAC地址,不然就丟棄這個包。
另外一種狀況是兩臺計算機不在同一個子網絡,
那麼事實上沒有辦法獲得對方的MAC地址,只能把數據包傳送到兩個子網絡鏈接處的"網關"(gateway),讓網關(後文解釋)去處理。
這一層爲止,若是目標主機和本機在同一個子網絡,咱們經過IP地址,子網掩碼比較得出在同一個子網絡的結果,在經過ARP協議獲得目標主機的Mac地址,發送!Success!
若是目標主機和本機不在同一個子網絡,咱們經過IP地址,子網掩碼比較得出在同一個子網絡的結果,而後交給本網絡的網關A處理,網關A根據路由協議獲得目標主機所在子網絡的網關B,網關B再經過IP地址判斷得出和目標主機在同一個子網絡,而後再經過ARP協議獲取Mac地址,發送!Success!
該層的協議爲應用進程提供端到端的通訊服務。它提供面向鏈接的數據流支持、可靠性、流量控制、多路複用等服務。——傳輸層(維基百科)
咱們如今成功的實現了主機和主機之間的通訊,那麼問題又來了,主機之間不一樣的程序該怎麼區分這個數據是否是發送給本身的呢。要知道,當你正在QQ聊天的時候,微信發送過來的消息內容呈如今了QQ界面,這會讓計算機懵逼的!太混亂了!
這個時候咱們就須要一個新的參數了!這個參數就是端口
。
可鏈接兩個或兩個以上不一樣之電路裝置使之可以傳遞電子或任何形式訊號之裝置.——端口(維基百科)
它實際上是每個使用網卡的程序的編號。每一個數據包都發到主機的特定端口,因此不一樣的程序就能取到本身所須要的數據。
不一樣的程序在計算機中所佔用的端口是不一樣的,確切的說是不能相同的,不然就混亂了。好比,HTTP所佔用的端口通常是80,HTTPS所佔用的端口通常是443。
端口
是0到65535之間的一個整數,正好16個二進制位。0到1023的端口
被系統佔用,用戶只能選用大於1023的端口
。無論是瀏覽網頁仍是在線聊天,應用程序會隨機選用一個端口
,而後與服務器的相應端口
聯繫。
確切的說,傳輸層實現的是端對端的服務,網絡層實現的僅僅是主機到主機之間的服務。只要肯定主機和端口,咱們就能實現程序之間的交流。所以,Unix系統就把主機+端口,叫作"套接字"(socket)。
如今又出了一個新的數據,就是端口信息。如今以太網數據包裏已經包括髮送者,接受者信息,數據類型,IP地址數據包,UDp數據包。
UDP數據包一樣是由標頭和數據組成:
標頭
部分主要定義了發出端口和接收端口,數據
部分定義了具體的內容。而後把它放在IP地址數據包的數據部分,前面咱們說過IP數據包是放在以太網數據包的數據裏面的,那麼如今整個以太網數據包就成了這樣:
UDP數據包很是簡單,"標頭"部分一共只有8個字節,總長度不超過65,535字節,一個IP數據包正好能夠容納。
爲了解決這個問題,提升網絡可靠性,TCP協議就誕生了。這個協議很是複雜,但能夠近似認爲,它就是有確認機制的UDP協議,每發出一個數據包都要求確認。若是有一個數據包遺失,就收不到確認,發出方就知道有必要重發這個數據包了。
所以,TCP協議可以確保數據不會遺失。它的缺點是過程複雜、實現困難、消耗較多的資源。
TCP數據包和UDP數據包同樣,都是內嵌在IP數據包的"數據"部分。TCP數據包沒有長度限制,理論上能夠無限長,可是爲了保證網絡的效率,一般TCP數據包的長度不會超過IP數據包的長度,以確保單個TCP數據包沒必要再分割。
關於TCP協議的三次握手和四次揮手過程博主在網絡協議分析這篇博客裏有較爲詳細的說明。
應用層直接和應用程序接口並提供常見的網絡應用服務。 ——應用層(維基百科)
應用程序收到"傳輸層"的數據,接下來就要進行解讀。因爲互聯網是開放架構,數據來源五花八門,必須事先規定好格式,不然根本沒法解讀。
"應用層"的做用,就是規定應用程序的數據格式。
舉例來講,TCP協議能夠爲各類各樣的程序傳遞數據,好比Email、WWW、FTP等等。那麼,必須有不一樣協議規定電子郵件、網頁、FTP數據的格式,這些應用程序協議就構成了"應用層"。
這是最高的一層,直接面對用戶。它的數據就放在TCP數據包的"數據"部分。所以,如今的以太網的數據包就變成下面這樣:
上面買的坑改填了,咱們前面說過,咱們對於目標主機的IP地址確定知道的,爲何呢?還有就是當兩臺計算機不在同一個子網絡的時候,咱們須要經過本機所在子網絡的網關A,再經過路由協議獲得目標主機子網絡的網關B,由網關B將咱們要發送給目標主機的數據包發送給目標主機。那麼,網關又是什麼呢?
咱們都知道因爲IP地址不方便記憶,咱們創造了域名這個概念。
DNS(網域名稱系統,Domain Name System,有時也簡稱爲域名)是因特網的一項核心服務,它做爲能夠將域名和IP地址相互映射的一個分佈式數據庫,可以令人更方便的訪問互聯網,而不用去記住可以被機器直接讀取的IP地址數串。
例如,damonare.cn是一個域名,和IP地址119.29.180.47相對應。DNS就像是一個自動的電話號碼簿,咱們能夠直接撥打damonare的名字來代替電話號碼(IP地址)。咱們直接調用網站的名字之後,DNS就會將便於人類使用的名字(如 damonare.cn)轉化成便於機器識別的IP地址(如119.29.180.47)。
已知DNS服務器爲8.8.8.8(這個和IP地址同樣管理員告知或是經過自行設置的),因而咱們向這個地址發送一個DNS數據包(53端口):
DNS服務器作出響應,告訴咱們Google的IP地址是172.194.72.105。因而,咱們知道了對方的IP地址。
網關要區別於路由器(因爲歷史的緣由,許多有關TCP/IP的文獻曾經把網絡層使用的路由器(英語:Router)稱爲網關,在今天不少局域網採用都是路由來接入網絡,所以如今一般指的網關就是路由器的IP),常常在家庭中或者小型企業網絡中使用,用於鏈接局域網和Internet。
前面咱們已經說過發送以太網數據包,須要知道兩個地址:
對方的MAC地址
對方的IP地址
有了這兩個地址,數據包才能準確送到接收者手中。可是,前面說過,MAC地址有侷限性,若是兩臺電腦不在同一個子網絡,就沒法知道對方的MAC地址,必須經過網關(gateway)轉發。
上圖中,1號電腦要向4號電腦發送一個數據包。它先判斷4號電腦是否在同一個子網絡,結果發現不是(後文介紹判斷方法),因而就把這個數據包發到網關A。網關A經過路由協議,發現4號電腦位於子網絡B,又把數據包發給網關B,網關B再轉發到4號電腦。
新買的電腦一般你必須作一些設置,才能上網,有時,管理員(或者ISP)會告訴你下面四個參數,你把它們填入操做系統,計算機就能連上網了:
本機的IP地址
子網掩碼
網關的IP地址
DNS的IP地址
因爲它們是給定的,計算機每次開機,都會分到一樣的IP地址,因此這種狀況被稱做"靜態IP地址上網"。以下圖Window靜態IP上網設置界面:
這樣的設置很專業,但普通用戶望而生畏,並且若是一臺電腦的IP地址保持不變,其餘電腦就不能使用這個地址,不夠靈活。出於這兩個緣由,大多數用戶使用"動態IP地址上網"。
動態IP地址上網使用的協議就是DHCP協議
,這個協議規定,每個子網絡中,有一臺計算機負責管理本網絡的全部IP地址,它叫作"DHCP服務器"。新的計算機加入網絡,必須向"DHCP服務器"發送一個"DHCP請求"數據包,申請IP地址和相關的網絡參數。
前面說過,若是兩臺計算機在同一個子網絡,必須知道對方的MAC地址
和IP地址
,才能發送數據包。可是,新加入的計算機不知道這兩個地址,怎麼發送數據包呢?
DHCP協議
作了一些巧妙的規定。
首先DHCP協議是創建在UDP協議之上,因此整個數據包是這樣的:
(1).最前面的"以太網標頭",設置發出方(本機)的MAC地址和接收方(DHCP服務器)的MAC地址。前者就是本機網卡的MAC地址,後者這時不知道,就填入一個廣播地址:FF-FF-FF-FF-FF-FF。
(2).後面的"IP標頭",設置發出方的IP地址和接收方的IP地址。這時,對於這二者,本機都不知道。因而,發出方的IP地址就設爲0.0.0.0,接收方的IP地址設爲255.255.255.255。
(3).最後的"UDP標頭",設置發出方的端口和接收方的端口。這一部分是DHCP協議規定好的,發出方是68端口,接收方是67端口。
這個數據包構造完成後,就能夠發出了。以太網是廣播發送,同一個子網絡的每臺計算機都收到了這個包。由於接收方的MAC地址是FF-FF-FF-FF-FF-FF,看不出是發給誰的,因此每臺收到這個包的計算機,還必須分析這個包的IP地址,才能肯定是否是發給本身的。當看到發出方IP地址是0.0.0.0,接收方是255.255.255.255,因而DHCP服務器知道"這個包是發給個人",而其餘計算機就能夠丟棄這個包。
接下來,DHCP服務器讀出這個包的數據內容,分配好IP地址,發送回去一個"DHCP響應"數據包。這個響應包的結構也是相似的,以太網標頭的MAC地址是雙方的網卡地址,IP標頭的IP地址是DHCP服務器的IP地址(發出方)和255.255.255.255(接收方),UDP標頭的端口是67(發出方)和68(接收方),分配給請求端的IP地址和本網絡的具體參數則包含在Data部分。
新加入的計算機收到這個響應包,因而就知道了本身的IP地址、子網掩碼、網關地址、DNS服務器等等參數。
應用層比較重要的協議還有大名鼎鼎的HTTP協議,這個在博主的網絡協議分析這篇博客裏對於TCP/HTTP協議有較爲詳細的分析,在這裏就很少作介紹了。
經過整篇博客分析,我想整個互聯網的層級劃分就很清楚了,也應該明白了數據是如何發送的,大概的過程就是如此,但互聯網協議浩如煙海究極一輩子可能也沒法真正理解。此篇博客僅僅做爲一個入門,也算是一個大體的思路。關於數據包數據具體的形式,路由,以及其餘協議就須要讀者本身去進一步發掘理解了。
參考文章: