互聯網的實現,分爲好幾層,每一層都有本身特有的功能,並且每一層都靠下一層支持。用戶接觸到的,只是最上面的一層,咱們稱爲應用層,要理解互聯網,必須從最下層開始,自下而上的理解每一層的功能。html
咱們常見的網絡模型,有如下三種:編程
OSI七層模型緩存
理論五層模型安全
TCP/IP四層模型服務器
它們之間的關係以下圖所示 markdown
其中,理論五層模型
是綜合OSI七層
和TCP/IP四層
的優勢,採用的一種原理體系結構。咱們接下來的探討也是基於理論五層模型
來展開的。網絡
理論五層模型
的結構以下圖 架構
各層的做用以下:socket
HTTP、HTTPS、SMTP、TELNET
等端到端
服務,使它們看不到傳輸層如下的數據通訊的細節。端到端
意思是數據來自某個端口
,再傳送給指定的端口
端口
:一個0到65535間的整數,用來指定特定應用程序TCP、UDP
等IP
協議幀
,肯定電信號的數據包格式。以太網
協議0和1
的電信號進行傳輸的。簡單說,越下面的層,越靠近硬件;越上面的層,越靠近用戶。oop
每一層都是爲了完成某一種功能。爲了實現這些功能,須要遵照一些共同的規則,這些規則就是協議(protocol)
。
互聯網的每一層,都定義了不少協議。這些協議的總稱,叫作互聯網協議(Internet Protocol Suite)
,它們是互聯網的核心。
下面的內容中,咱們經過每一層的功能的介紹,對每一層中的主要協議所起做用進行講解。
電腦要進行聯網,須要把電腦經過各類設備鏈接進網絡,設備有光纜、電纜、雙絞線、無限電波等方式。 這就是
物理層
,它就是把電腦鏈接起來的物理手段,它主要規定了網絡的一些電氣特性,做用是傳輸0和1
的電信號。
物理層是用於傳輸信號的介質,它傳輸的是0和1
的電信號。可是關於電信號如何分組,每一個信號位有何意義並無規定。
這就是數據鏈路層
的功能,它在物理層
的上方,肯定了0和1的分組方式,用於兩個設備(同一種數據鏈路結點)之間進行信息傳遞。
早期的時候,每家公司都有本身的電信號分組方式。逐漸地,一種叫作以太網(Ethernet)
的協議,佔據了主導地位。
以太網規定,一組電信號構成一個數據包,叫作幀(frame)
,每一幀分爲兩個部分:標頭(Head)
和數據(Data)
。
標頭
的長度,固定爲18字節
;數據
的長度,最短爲46字節
,最長爲1500字節
。所以,整個幀
最短爲64字節
,最長爲1518字節
。若是數據很長,就必須分割成多個幀發送。MTU是鏈路層對物理層的限制。
最大值1500字節
稱爲以太網的最大傳輸單元(MTU),不一樣的網絡類型有不一樣的MTU。因爲鏈路層存在MTU的限制,致使網絡層的報文若是超過1500字節,就必要要對其進行分片發送。
IP協議頭
的3
位標誌字段中, 第2
位MF置爲0
, 表示容許分片
, 第3
位DF來表示結束標記
(當前是不是後一個小包, 是的話置爲1, 不然置爲0)。任意一個小包丟失
,接收端的重組就會失敗
,可是IP層不會負責從新傳輸數據。1472(1500 - 20(IP首部) - 8(UDP首部))
,那麼就會在網絡層分紅多個IP數據報
。任意一個丟失
,都會引發接收端網絡層重組失敗
。那麼這就意味着,若是UDP數據報在網絡層被分片,整個數據被丟失的機率就大大增長。局域網環境下
,建議UDP數據控制在1472字節如下
;在Internet環境下
,建議將UDP數據控制在548字節如下
。MSS(Max Segment Size)
。鏈接
時,首先會和對方協商MSS
的大小(也只能在三次握手時協商,不然就是默認值536字節)。理想的狀況下,MSS的值正好是在IP不會被分片處理的大長度(這個長度仍然是受制於數據鏈路層的MTU)選擇較小的做爲最終的MSS
。MSS的值就是在TCP首部的40字節變長選項中(kind=2)。MSS = MTU - TCP首部 - IP首部
,既TCP報文的數據長度。上面咱們提到,以太網數據包的標頭
,包含了發送者和接受者的信息。那麼,發送者和接受者是如何標識呢?
以太網規定,連入網絡的全部設備,都必須具備網卡
接口。數據包必須是從一塊網卡,傳送到另外一塊網卡。網卡的地址,就是數據包的發送地址和接收地址,這叫作MAC地址
。
每塊網卡出廠的時候,都有一個全世界獨一無二的MAC地址
,長度是48個二進制位
,一般用12個十六進制數
表示。
前6個十六進制數是廠商編號,後6個十六進制數是該廠商的網卡流水號。有了MAC地址,就能夠定位網卡和數據包的路徑了。
定義地址只是第一步,後面還有更多的步驟:
1)首先:一塊網卡怎麼會知道另外一塊網卡的MAC地址?
回答是有一種ARP協議
,能夠解決這個問題。這個在本文網絡層中介紹,這裏只須要知道,以太網數據包必須知道接收方的MAC地址,而後才能發送。
2)其次:就算有了MAC地址,系統怎樣才能把數據包準確送到接收方?
回答是以太網採用了一種很原始的方式,它不是把數據包準確送到接收方,而是向本網絡內全部計算機發送
,讓每臺計算機本身判斷,是否爲接收方。
上圖中,5號計算機向3號計算機發送一個數據包
,同一個子網絡的1號、2號、3號、4號、6號計算機都會收到
這個包。它們讀取這個包的標頭
,找到接收方的MAC地址
,而後與自身的
MAC地址相比較
,若是二者相同
,就接收這個包
,作進一步處理,不然就丟棄
這個包。這種發送方式就叫作廣播
(broadcasting)。
有了數據包的定義、網卡的MAC地址、廣播的發送方式,"連接層"就能夠在多臺計算機之間傳送數據了。
以太網協議,依靠MAC地址發送數據。理論上,單單依靠MAC地址,成都的網卡就能夠找到休斯頓的網卡了,技術上是能夠實現的。
可是,這樣作有一個重大的缺點。以太網
採用廣播
方式發送數據包
,全部成員人手一包,不只效率低
,並且侷限在發送者所在的子網絡
。也就是說,若是兩臺計算機不在同一個子網絡,廣播是傳不過去的。這種設計是合理的,不然互聯網上每一臺計算機都會收到全部包,那會引發災難。
互聯網是無數子網絡共同組成的一個巨型網絡,很像想象成都和休斯頓的電腦會在同一個子網絡,這幾乎是不可能的。
所以,必須找到一種方法,可以區分哪些MAC地址屬於同一個子網絡,哪些不是。若是是同一個子網絡
,就採用廣播
方式發送,不然
就採用路由
方式發送。(路由
的意思,就是指如何向不一樣的子網絡分發數據包,這是一個很大的主題,本文不涉及。)遺憾的是,MAC地址自己沒法作到這一點。它只與廠商有關,與所處網絡無關。
這就致使了網絡層
的誕生。它的做用是引進一套新的地址
,使得咱們可以區分
不一樣的計算機是否屬於同一個子網絡
。這套地址就叫作網絡地址
,簡稱網址
。
因而,網絡層
出現之後,每臺計算機有了兩種地址
,一種是MAC地址
,另外一種是網絡地址
。兩種地址之間沒有任何聯繫,MAC地址是綁定在網卡上的,網絡地址則是管理員分配的,它們只是隨機組合在一塊兒。
網絡地址幫助咱們肯定計算機所在的子網絡,MAC地址則將數據包送到該子網絡中的目標網卡。所以,從邏輯上能夠推斷,一定是先處理網絡地址,而後再處理MAC地址。
規定網絡地址的協議,叫作IP協議
。它所定義的地址,就被稱爲IP地址
。目前,普遍採用的是IP協議的第四版和第六版,分別稱爲IPv4和IPv6。
32個二進制位
組成;分紅四段的十進制數
表示IP地址,從0.0.0.0一直到255.255.255.255。互聯網上的每一臺計算機,都會分配到一個IP地址。這個地址分紅兩個部分
,前一部分表明網絡,後一部分表明主機
。好比,IP地址14.215.177.39,這是一個32位的地址,假定它的網絡部分是前24位(14.215.177),那麼主機部分就是後8位(最後的那個1)。處於同一個子網絡的電腦,它們IP地址的網絡部分一定是相同的,也就是說14.215.177.2應該與14.215.177.1處在同一個子網絡。
可是,問題在於單單從IP地址,咱們沒法判斷網絡部分。仍是以14.215.177.39爲例,它的網絡部分,究竟是前24位,仍是前16位,甚至前28位,從IP地址上是看不出來的。
那麼,怎樣才能從IP地址,判斷兩臺計算機是否屬於同一個子網絡呢?這就要用到另外一個參數子網掩碼
(subnet mask)。
子網掩碼:
按位與
運算(兩個數位都爲1,運算結果爲1,不然爲0),而後比較結果是否相同,若是是的話,就代表它們在同一個子網絡中,不然就不是。咱們知道,IPv4的地址只有32位,地球上網民數量已經遠遠超出這個數字,那麼,爲啥至今還沒出現地址枯竭呢?
由於咱們還有一些技術,能夠變相的緩解地址不足,好比NAT技術。
NAT(Network Address Translation,網絡地址轉換)
八組、每組四位16進制數字
組成,每組之間由:
來分隔
。壓縮前導零
的表示方法,如圖中的地址可寫爲:2001:D12:0:0:2AA:987:FE29:9871連續幾段數值0的位段
時,這些段能夠壓縮爲雙冒號(::)
的表示,因此咱們獲得了最終的簡化格式:2001:D12::2AA:987:FE29:9871IPv6擁有128位巨大的地址空間,對於那麼大的空間,也不是隨意的劃分,而是使用按照bit位進行號段劃分。
IPv6地址結構以下圖
例如RFC4291中定義了n=48, m=16,也就是子網和接口ID與各佔64位。
IPv6沒有子網掩碼mask的概念,它支持的是子網前綴標識方法
。
使用IPv6地址/前綴長度
表示方法,例如:
能夠看到,一個IPv6的地址有子網前綴+接口ID構成,子網前綴由地址分配和管理機構定義和分配,而接口ID能夠由各操做系統實現生成。
IPv6是用來解決IPv4地址枯竭
問題的,IPv4地址爲32位,而IPv6地址爲128位
除了地址數量之外,IPv6還有不少優勢,例如:
IPv6
數據鏈路層的type字段標識爲0x86dd
,IPv4
數據鏈路層的type字段標識爲:0x0800
IPv6報文頭
部固定爲40字節
,IPv4報文頭
部是20到60字節
。這個意味着,寫代碼處理IPv6數據報文的效率會提升不少取消了校驗和字段
,提升了路由器的轉發效率。不過,值得一提的是,在IPv6協議下,傳輸層協議UDP、TCP是強制須要進行校驗和的(IPv4是可選的)ICMPv六、TCP、UDP
等的時候,Next Heade
r的值分別爲5八、六、17
,這個時候和IPv4報文頭部中的Protocol字段很相似擴展頭部
。擴展頭部是IPv6引入的一個新的概念,每一個IPv6的數據報文能夠承載0個或多個擴展頭部,擴展頭部經過鏈表的形式組織起來。當IPv6數據報文承載着擴展頭部的時候,Next Header的數值爲擴展頭部的類型值。爲何要引入擴展頭部這個概念,這裏也是IPv6對IPv4改進的一個方面,用擴展頭部取代了IPv4的可選項信息,精簡了IPv6的頭部,加強了IPv6的擴展性。當發送一個分片IPv6數據報文的時候,IPv6使用的是擴展頭部的形式組織各個分片的信息,如圖IPv6報文頭部Next Header字段值爲44表示存在擴展頭部,擴展頭部是IPv6分片數據信息。對比IPv4,分片信息
是記錄在IPv4報文頭部
的分片字段
中。如上所述,IP協議的做用主要有兩個:
根據IP協議發送的數據,就叫作IP數據包
。咱們直接把IP數據包直接放進以太網數據包的"數據"部分,不用修改以太網的規格。這就是互聯網分層結構的好處:上層的變更徹底不涉及下層的結構。
具體來講,IP數據包也分爲標頭
和數據
兩個部分: 其中,標頭
範圍爲20-60字節
(IPv6固定爲40字節
),整個
數據包的總長度最大爲65535字節
。所以,理論上
,一個IP數據包的數據部分
,最長爲65515字節
。
如圖所示,標頭中20字節是固定不變的
,它包含了版本、長度、IP地址等信息,另外還有可變部分的標頭可選。而數據則是IP數據包的具體內容。
將它放入以太網數據包後,以太網數據包就變成了下面這樣:
在以太網協議中,以太網數據包的數據部分,最長只有1500字節。所以,若是IP數據包超過了1500字節,它就須要分割成幾個以太網數據包,分開發送了。
關於網絡層,還有最後一點須要說明。由於IP數據包是放在以太網數據包裏發送的,因此咱們必須同時知道兩個地址
,一個是對方的MAC地址
,另外一個是對方的IP地址
。一般狀況下,對方的IP地址是已知的,可是咱們不知道它的MAC地址
。
因此,咱們須要一種機制,可以從IP地址獲得MAC地址。
這裏又能夠分紅兩種狀況:
不在同一個子網絡
,那麼事實上沒有辦法
獲得對方的MAC地址
,只能把數據包傳送到
兩個子網絡鏈接處的網關
(gateway),讓網關去處理;同一個子網絡
,那麼咱們能夠用ARP協議
,獲得對方的MAC地址
。ARP協議也是發出一個數據包
(包含在以太網數據包中),其中包含它所要查詢主機的IP地址,在對方的MAC地址
這一欄,填的是FF:FF:FF:FF:FF:FF
,表示這是一個廣播地址
。它所在子網絡的每一臺主機,都會收到這個數據包,從中取出IP地址
,與自身
的IP地址進行比較
。若是二者相同
,都作出回覆
,向對方報告本身的MAC地址
,不然就丟棄
這個包。總之,有了ARP協議以後,咱們就能夠獲得同一個子網絡內的主機MAC地址,能夠把數據包發送到任意一臺主機之上了。
ARP攻擊是利用ARP協議設計時缺少安全驗證漏洞來實現的,經過僞造ARP數據包來竊取合法用戶的通訊數據,形成影響網絡傳輸速率和盜取用戶隱私信息等嚴重危害。
ARP攻擊主要是存在於局域網網絡中,局域網中如有一臺計算機感染ARP木馬,則感染該ARP木馬的系統將會試圖經過「ARP欺騙」手段截獲所在網絡內其它計算機的通訊信息,並所以形成網內其它計算機的通訊故障。
局域網中比較常見的ARP攻擊包括:上網時斷時續,拷貝文件沒法完成,局域網內的ARP包激增。出現不正常的MAC地址,MAC地址對應多個IP地址,網絡數據發不出去了,網上發送信息被竊取,我的PC中毒局域網內MAC地址泛洪使MAC地址緩存表溢出等問題。據包的協議地址不匹配,從而在網絡中產生大量的ARP。
在局域網環境中,ARP攻擊是主要的安全威脅,在傳統網絡中主要是經過靜態綁定的方式來解決,可是這種方式限制了網絡擴展的易用性。
有了MAC地址和IP地址,咱們已經能夠在互聯網上任意兩臺主機上創建通訊。
接下來的問題是,同一臺主機上有許多程序都須要用到網絡,好比,你一邊瀏覽網頁,一邊與朋友在線聊天。當一個數據包從互聯網上發來的時候,你怎麼知道,它是表示網頁的內容,仍是表示在線聊天的內容?
也就是說,咱們還須要一個參數,表示這個數據包到底供哪一個程序(進程)
使用。這個參數就叫作端口
(port),它實際上是每個使用網卡的程序的編號。每一個數據包都發到主機的特定端口,因此不一樣的程序就能取到本身所須要的數據。
**端口是0到65535之間的一個整數,正好16個二進制位。0到1023的端口被系統佔用,用戶只能選用大於1023的端口。**無論是瀏覽網頁仍是在線聊天,應用程序會隨機選用一個端口,而後與服務器的相應端口聯繫。
傳輸層
的功能,就是創建端口到端口
的通訊。相比之下,網絡層
的功能是創建主機到主機
的通訊。只要肯定主機和端口,咱們就能實現程序之間的交流。所以,Unix系統就把主機+端口,叫作套接字
(socket)。有了它,就能夠進行網絡應用程序開發了。
如今,咱們必須在數據包中加入端口信息,這就須要新的協議。最簡單的實現叫作UDP協議,它的格式幾乎就是在數據前面,加上端口號。
UDP數據包,也是由標頭和數據兩部分組成: 如圖所示,UDP的標頭固定爲
8字節
,包含了16位源端口和16位目的端口,以及16位的UDP長度和16位的UDP檢驗和。而後,把整個UDP數據包放入IP數據包的數據部分,而前面說過,IP數據包又是放在以太網數據包之中的,因此整個以太網數據包如今變成了下面這樣:
UDP數據包很是簡單,標頭部分一共只有8個字節,總長度不超過65,535字節,正好放進一個IP數據包。
局域網環境下,建議將UDP數據控制在1472字節如下
以太網
(Ethernet)數據幀的長度必須在46-1500字節之間,這是由以太網的物理特性決定的,這個1500字節
被稱爲鏈路層的MTU(最大傳輸單元)。但這並非指鏈路層的長度被限制在1500字節,其實這這個MTU指的是鏈路層的數據區,並不包括鏈路層的首部和尾部的18個字節。
因此,事實上這個1500字節就是網絡層IP數據報的長度限制。由於IP數據報的首部最小爲20字節,因此IP數據報的數據區長度最大爲1480字節。而這個1480字節就是用來放TCP傳來的TCP報文段或UDP傳來的UDP數據報的。
又由於UDP數據報的首部8字節
,因此UDP數據報
的數據區最大長度爲1472字節
。這個1472字節就是咱們可使用的字節數。
當咱們發送的UDP數據大於1472的時候會怎樣呢? 這也就是說IP數據報大於1500字節,大於MTU,這個時候發送方IP層就須要分片(fragmentation)。把數據報分紅若干片,使每一片都小於MTU,而接收方IP層則須要進行數據報的重組。這樣就會多作許多事情,而更嚴重的是,因爲UDP的特性,當某一片數據傳送中丟失時,接收方沒法重組數據報,將致使丟棄整個UDP數據報。
所以,在普通的局域網環境下,我建議將UDP的數據控制在1472字節如下爲好。
Internet編程時,建議將UDP數據控制在548字節如下
進行Internet編程時則不一樣,由於Internet上的路由器可能會將MTU設爲不一樣的值。若是咱們假定MTU爲1500來發送數據,而途經的某個網絡的MTU值小於1500字節,那麼系統將會使用一系列的機制來調整MTU值,使數據報可以順利到達目的地,這樣就會作許多沒必要要的操做。
鑑於Internet上的標準MTU值爲576字節
,因此我建議在進行Internet的UDP編程時, 最好將UDP的數據長度控件在548字節(576-8-20)
之內。
ps:這句話貌似有問題,unix網絡編程第一卷裏說:ipv4協議規定ip層的最小重組緩衝區大小爲576!因此,建議udp包不要超過這個大小,而不是由於internet的標準MTU是576!
UDP協議的優勢是比較簡單,容易實現,可是缺點是可靠性較差,一旦數據包發出,沒法知道對方是否收到。爲了解決這個問題,提升網絡可靠性,TCP協議就誕生了。這個協議很是複雜,但能夠近似認爲,它就是有確認機制的UDP協議,每發出一個數據包都要求確認。若是有一個數據包遺失,就收不到確認,發出方就知道有必要重發這個數據包了。
所以,TCP協議可以確保數據不會遺失。它的缺點是過程複雜、實現困難、消耗較多的資源。 如圖所示,TCP標頭在20-60字節之間,除了源端口號和目的端口號以外,還包含了序號、確認號等各類信息,用於保證可靠鏈接與數據重發。
TCP數據包和UDP數據包同樣,都是內嵌在IP數據包的數據部分。TCP數據包沒有長度限制,理論上能夠無限長
,可是爲了保證網絡的效率,一般
TCP數據包的長度不會超過IP數據包的長度
,以確保單個TCP數據包沒必要再分割。
應用程序收到傳輸層的數據,接下來就要進行解讀。因爲互聯網是開放架構,數據來源五花八門,必須事先規定好格式,不然根本沒法解讀。應用層的做用,就是規定應用程序的數據格式。
舉例來講,TCP協議能夠爲各類各樣的程序傳遞數據,好比Email、WWW、FTP等等。那麼,必須有不一樣協議規定電子郵件、網頁、FTP數據的格式,這些應用程序協議就構成了應用層。這是最高的一層,直接面對用戶。它的數據就放在TCP數據包的數據部分。
所以,如今的以太網的數據包就變成下面這樣: