瞭解OSI七層模型的意義
OSI網絡模型分爲七層,由下至上分別爲:算法
- 1-物理層 (無 網線網卡)
- 2-數據鏈路層* (ARP協議(二進制) mac地址)
- 3-網絡層*(ip協議 ARP協議(二進制))
- 4-傳輸層* (tcp/udp協議(二進制))
- 5-會話層
- 6-表示層 (無 處理數據壓縮及安全問題)
- 7-應用層* (http協議 ftp協議(文本協議))
其中咱們做爲軟件開發者來講須要重點關注「四層」:數據鏈路層,網絡層,傳輸層,應用層 計算機和計算機通訊都是經過tcp/ip來進行的,TCP/IP不是一個協議,而是一個協議族的統稱。裏面包括了IP協議,IMCP協議,TCP協議,以及咱們更加熟悉的http、ftp協議等等。電腦有了這些,就好像學會了外語同樣,就能夠和其餘的計算機終端作自由的交流了。瀏覽器
TCP/IP協議族分層
- 數據鏈路層:處理與物理設備交互的具體細節
- 網絡層:數據在網絡中是分組傳輸的,網絡層處理分組在網絡中的活動
- 傳輸層:也叫運輸層,處理端到端的通訊細節,這裏的端指的是(端口和端口)
- 應用層:處理網絡數據與應用程序的交互細節
TCP/IP協議族按照層次由上到下,層層包裝,每層協議須要實現的功能:將上層傳遞的數據包裝爲滿⾜該層協議的數據包,將下層傳來的數據包解析爲滿⾜上層協議的數據包。最上面的就是應用層了,這裏面有http,ftp,等等咱們熟悉的協議。而第二層則是傳輸層,著名的TCP和UDP協議就在這個層次第三層是網絡層,IP協議就在這裏,它負責對數據加上IP地址和其餘的數據(後面會講到)以肯定傳輸的目標。第四層是叫數據鏈路層,這個層次爲待傳送的數據加入一個以太網協議頭,並進行CRC編碼,爲最後的數據傳輸作準備。再往下則是硬件層次了,負責網絡的傳輸,這個層次的定義包括網線的制式,網卡的定義等等(這些咱們就不用關心了,咱們也不作網卡),因此有些書並不把這個層次放在tcp/ip協議族裏面,由於它幾乎和tcp/ip協議的編寫者沒有任何的關係。發送端主機從上自下將數據按照協議進行封裝,加上首部。而接收數據的主機則按照協議從獲得的數據包解開,層層刪除首部,最後拿到須要的數據。這種結構很是有棧的味道,因此某些文章也把tcp/ip協議族稱爲tcp/ip協議棧。
數據鏈路層
數據鏈路層有三個目的:緩存
- 上層爲網絡層,爲IP模塊發送和 接收IP數據報。
- 爲ARP模塊發送ARP請求和接收ARP應答
- 爲RARP發送RARP請 求和接收RARP應答 ip是網絡層協議,你們應該並不陌生。ARP叫作地址解析協議,是用IP地址換MAC地址的一種協議,他的做用是:將32bit的IP地址,轉換爲48bit的以太⽹地址,發送ARP⼴播,得到⽬的端的IP地址和硬件地址。而RARP則叫作逆地址解析協議。
arp協議
arp報文格式安全
協議組成:
網絡層
網絡層的主要功能:網絡層識別IP地址,可以將信息送到正確的主機和處理數據報在⽹絡中的⾏爲。網絡層的主要協議有:IP協議,ARP協議,RARP協議,因特網報文協議ICMP、因特網組管理協議IGMP等。oop
- IP協議及IP數據報
- IP協議是TCP/IP協議的核心,全部的TCP,UDP,IMCP,IGCP的數據都以IP數據格式傳輸。IP協議用於將多個包交換網絡鏈接起來,它在源地址和目的地址之間傳送一種稱之爲數據包的東西,並提供對數據大小的從新組裝功能,以適應不一樣網絡對包大小的要求。要注意的是,IP不是可靠的協議,這是說,IP協議沒有提供一種數據未傳達之後的處理機制——>這被認爲是上層協議:TCP或UDP要作的事情。因此這也就出現了TCP是一個可靠的協議,而UDP就沒有那麼可靠的區別。
- IP數據報格式以下:
IP數據報由首部和數據部分組成。首部的前一部分是固定長度爲20字節,是數據報必須具備的。在首部的固定部分以後的是一些可選字段,其長度是可變的。
-
協議組成(字段存在嚴格約定的順序):測試
- 版本:4位
- ⾸部⻓長度:4位,須要注意的,是指4位表示的10進制數4個字節的數⽬,154,⾸部最⻓長爲60字節
- 服務類型:8位,⼤部分實現不⽀持,⽆需關注
- 總⻓長度:16位,因此最⼤的IP包爲65536
- 標識:16位,惟⼀標識主機發送的每⼀份數據報
- 3位標誌+13位⽚偏移:暫時不關注
- ⽣存時間:8位,數據報最多可通過的路由數
- 上層協議:8位,代表該IP數據報對應的上層協議是什麼
- ⾸部校驗和:16位,保證IP數據包傳輸正確
- 源IP地址:32位
- ⽬的IP地址:32位
-
路由選擇:
- 每⼀個IP數據報在⽹絡中進⾏傳輸的⽬的,是要找到⽬的IP的主機地址,並 最終到達該主機。因此IP數據包通過的每⼀個節點都至關因而⼀箇中轉 站,也就是路由。因此IP數據報被路由節點的操做被稱爲路由選擇。
- 常規的路由機制:1.⽬的主機與源主機直接相連,或處於共享⽹絡,直接送達⽬標主機 2.默認轉發⾄該⽹絡存在的路由器上,再由其統⼀處理
-
路由匹配算法:
- 路由表中存在與⽬的IP地址徹底相同的條⽬,直接發送⾄下⼀跳
- 路由表中存在與⽬的IP地址⽹絡號相同的條⽬,發送⾄該條⽬指定的下⼀跳
- 以上條件均不成⽴,尋找默認條⽬,發送⾄該條⽬指定的下⼀跳
- 均不成⽴,返回主機或⽹絡不可達的錯誤
-
經常使用命令:
- ifconfig:查看⽹絡接⼝
- netstat -rn:查看路由表
- nststat -in:查看接⼝信息 ip地址:IP地址由網絡號(包括子網號)和主機號組成,網絡地址的主機號爲全0,網絡地址表明着整個網絡。
-
ip地址分類:
- A類地址以0開頭,第一個字節做爲網絡號,地址範圍爲:0.0.0.0~127.255.255.255;
- B類地址以10開頭,前兩個字節做爲網絡號,地址範圍是128.0.0.0~191.255.255.255;
- C類地址以110開頭,前三個字節做爲網絡號,地址範圍是:192.0.0.0~223.255.255.255。
- D類地址以1110開頭,地址範圍是224.0.0.0~239.255.255.255,D類地址做爲組播地址(一對多的通訊);
- E類地址以1111開頭,地址範圍是240.0.0.0~255.255.255.255,E類地址爲保留地址,供之後使用。 注:只有A,B,C有網絡號和主機號之分,D類地址和E類地址沒有劃分網絡號和主機號。
-
255.255.255.255
該IP地址指的是受限的廣播地址。受限廣播地址與通常廣播地址(直接廣播地址)的區別在於,受限廣播地址只能用於本地網絡,路由器不會轉發以受限廣播地址爲目的地址的分組;通常廣播地址既可在本地廣播,也可跨網段廣播。例如:主機192.168.1.1/30上的直接廣播數據包後,另一個網段192.168.1.5/30也能收到該數據報;若發送受限廣播數據報,則不能收到。 注:通常的廣播地址(直接廣播地址)可以經過某些路由器(固然不是全部的路由器),而受限的廣播地址不能經過路由器。
經常使用於尋找本身的IP地址,例如在咱們的RARP,BOOTP和DHCP協議中,若某個未知IP地址的無盤機想要知道本身的IP地址,它就以255.255.255.255爲目的地址,向本地範圍(具體而言是被各個路由器屏蔽的範圍內)的服務器發送IP請求分組。
127.0.0.0/8被用做迴環地址,迴環地址表示本機的地址,經常使用於對本機的測試,用的最多的是127.0.0.1。
子網掩碼是一個32位地址,用於區別兩個IP地址是否屬於同一個子網。若兩個IP地址與其子網掩碼相與後相同,則說明這兩個IP地址屬於同一個子網。 子網掩碼由1和0組成,且1和0分別連續。左邊是網絡位,用二進制數字「1」表示;右邊是主機位,用二進制數字「0」表示。 這樣作的目的是爲了讓掩碼與IP地址作按位與運算時用0遮住原主機數,而不改變原網絡段數字,並且很容易經過0的位數肯定子網的主機數(2的主機位數次方-2,由於主機號全爲1時表示該網絡廣播地址,全爲0時表示該網絡的網絡號,這是兩個特殊地址)。只有經過子網掩碼,才能代表一臺主機所在的子網與其餘子網的關係,使網絡正常工做。
默認分配的子網掩碼每段只有255或0 A類的默認子網掩碼 255.0.0.0 一個子網最多能夠容納1677萬多臺電腦 B類的默認子網掩碼 255.255.0.0 一個子網最多能夠容納6萬臺電腦 C類的默認子網掩碼 255.255.255.0 一個子網最多能夠容納254臺電腦
- IP協議-IP分⽚
- ip根據標誌字段和片偏移進行分片,共16位,IP分⽚時,該值被複制到每⼀個分⽚中
- 其中3位標誌:首位是保留字段,默認爲0;次位當不進行ip分片時爲1,須要分片時爲0;末位除了最後一次分片,其餘片均爲1
- 13位片偏移:標誌該片偏移原始數據包開始的位置
- 注意:當IP分⽚時,只丟失⼀⽚數據,也須要重傳整個IP數據報,當給定數據報的第⼀個數據報⽚到達時,開始定時器,過時丟 棄全部數據報⽚,因此ip協議是不可靠的協議
傳輸層
- 網絡層協議只提供了點到點的鏈接,而傳輸層協議提供一種端到端的服務,即應用進程之間的通訊。網絡層協議提供不可靠、無鏈接和盡力投遞的服務,所以,若是對於可靠性要求很高的上層協議,就須要在傳輸層實現可靠性的保障。傳輸層主要有TCP和UDP協議。
- TCP即傳輸控制協議,是一個可靠的、面向鏈接的協議。它容許網絡間兩臺主機之間無差錯的信息傳輸。TCP協議還進行流量控制,以免發送過快而發生擁塞。
- UDP即用戶數據報協議,它採用無鏈接的方式傳送數據,也就是說發送端不關心發送的數據是否到達目標主機,數據是否出錯等。收到數據的主機也不會告訴發送方是否收到了數據,它的可靠性由上層協議來保障。
- 這兩個協議針對不一樣網絡環境實現數據傳輸,各有優缺點。面向鏈接的TCP協議效率較低,但可靠性高,適合於網絡鏈路很差或可靠性要求高的環境;UDP面向非鏈接,不可靠,但由於不用傳送許多與數據自己無關的信息,因此效率較高,經常使用於一些實時業務,也用於一些對差錯不敏感的應用。這樣就能夠在不一樣的場合和要求下選用不一樣的協議,達到預期通訊目標。下面我將詳細介紹一下tcp。
tcp協議格式
- TCP是面向鏈接的可靠協議,TCP協議爲實現可靠的數據傳輸而提供了一系列的方法 和手段。
- 首先,TCP的數據段採起編號的方式保證數據的正確順序。TCP數據段被封裝在IP數據包中來完成傳輸,而IP數據包通過的路徑有可能不一樣,那麼IP數據包到達時可能會失去原有順序,於是到達的TCP數據段也可能會失序。爲了解決這個問題,TCP對數據段進行編號。對接收到的數據進行從新排序,而後以正確的順序交給應用層
- 其次,因爲到達的IP數據包有可能會發生重複,因此TCP的接收端必須有丟棄重複數據的功能。
- 再次,TCP提供流量控制。
TCP協議的各類功能的實現依賴於它的首部數據結構。在TCP的首部中包含了許多TCP數據段的重要信息,下面就TCP的首部數據結構進行詳細講解。
- 0~15這16位稱爲源端口號;它是TCP數據段發送方進程對應的端口號,這個端口號是由發送方進程產生的隨機數,它惟一地標識了發送端的一個進程。
- 0~15這16位稱爲源端口號;它是TCP數據段發送方進程對應的端口號,這個端口號是由發送方進程產生的隨機數,它惟一地標識了發送端的一個進程。
- 第2行是32位的序列號,它提供0~2^32-1範圍內的一個數字。TCP從應用程序取得數據後,會根據實際傳輸能力把數據劃分紅不一樣的數據段。TCP用這個數字來給數據段打上標記,當數據到達目的地後,接收端會按照這個序列號把數據從新排列,保證數據的正確性。
- 第4行分爲4個部分。
- 第1部分是4位首部長度,用它能夠肯定首部數據結構的字節長度。通常狀況下TCP首部是20個字節,但當要擴展首部長度大小時可使用這個字段,好比把這4個位都置爲1就獲得TCP首部長度的最大值60。4位的最大值是1111換算成十進制是l5,表示首部長度爲l5行。而每行數據有32位即4個字節長,因此首部長度爲15×4=60
- 第2部分是6個保留位。
- 第3部分是6個控制位。這6位有很重要的做用,TCP的鏈接、傳輸和斷開都是受這6個控制位的指揮
- URG:緊急指針有效位,它和第5行的16位緊急指針配合使用,當URG=1時,TCP根據16位緊急指針肯定緊急數據的最後一個字節的位置。這樣接收端就能夠優先準確快速
- ACK:只有當ACK=1時確認序列號字段纔有效。當ACK=0時,確認號無效。
- PSH:標誌位爲1時要求接收方儘快將數據段送達應用層,這個標誌位是爲了加快特殊數據的處理速度。
- RST:值爲1時通知從新創建TCP鏈接。
- SYN:同步序號位。TCP須要創建鏈接時將這個位置爲1。
- FIN:發端完成發送任務位,當TCP完成數據傳輸須要斷開鏈接時,提出斷開鏈接的一方將這個位置爲1。
- 第4部分是1 6位的窗口大小,它說明本地可接收數據段的數目,這個值的大小是可變的,當網絡通暢時這個窗口值變大以加快傳輸速度,當網絡不穩定時減少這個值可保證網絡數據的可靠傳輸,TCP協議中的流量控制機制就是依靠變化窗口的大小實現的
- 第5行中的16位校驗和是用來作差錯控制的,在發送TCP數據段時,由發送端計算TCP數據段全部字節的校驗和。當到達目的地時又進行一次校驗和計算。若這兩次的校驗和一致則說明數據基本是正確的。不然將認爲該數據已被破壞,接收端將拋棄該數據
- 第5行中的16位緊急指針和URG配合使用,當URG=1時有效。用來講明緊急數據的末尾字節的位置。
- 第6行是可選項,只有當4位首部長度大於20時纔有效,那時TCP的首部中會附加更多的信息,通常狀況下沒有可選項。
- 第7行是數據,它是由應用層的數據分段而獲得的一部分數據,是TCP協議服務的對象。在傳輸前TCP協議會給這部分數據加上一個序號,來表示這個部分數據在數據總體中的位置。
TCP是一個面向鏈接的服務,也就是說在數據通訊以前,發送端與接收端要先創建鏈接。等數據發送結束後,雙方再斷開鏈接。一個TCP鏈接不只須要端口,還須要IP地址來肯定通訊的主機。故而IP首部中的發送端IP地址加上發送端端口號就造成了鏈接的發送端;目標端IP地址再加上接收端端口號就肯定了鏈接的接收端。這樣就惟一地肯定了一個TCP鏈接。
在TCP/IP協議中,TCP協議是基於IP協議的。IP協議是對應於網絡層的協議,它是 一個不可靠的協議。TCP協議的可靠性保證給IP協議提供了可靠環境,從而使得IP協議能夠沒必要考慮傳輸的可靠性,專一於網絡層的功能。這也是協議分層的初衷。TCP被認爲是一種流式傳輸層服務。它表示TCP發送端從應用程序接收到字符流,並從這個流中提取適當的長度建立數據段,而後將其發送到網絡上。TCP接收端則接收數據段,從中提取數據,若沒有按序號到達還要對其進行排序,並將其做爲字符流交付給接收端應用程序。這樣就完成了數據的傳輸。
TCP的三次握手四次斷開
一、tcp三次握手
TCP在創建鏈接的時候使用端口號來完成與應用程序的對應。當一臺計算機和其餘計算 機進行鏈接、通訊時使用IP地址和端口號。鏈接的每一方都是由一個IP地址和一個端口號組成的。好比經過IE瀏覽器上網時,經過解析輸入的URL地址能夠獲得IP地址,這時還有一個隱含的端口號80。這樣就構成了鏈接的服務器方。一樣,鏈接的客戶端也會有本身的IP地址和端口號。在計算機上能夠經過命令netstat-n來查看目前存在的鏈接進程。TCP創建鏈接的過程稱爲3次握手。創建鏈接的過程以下圖所示:
- 第1次握手是客戶端經過將一個含有「同步序列號」(SYN)標誌位的數據段發送給服務器而開始請求鏈接。經過該數據段,客戶端告知服務器兩點:我但願跟你創建鏈接,同時告訴服務器使用哪一個序列號做爲數據傳輸時數據段的起始。
- 第2次握手是服務器用一個帶有「確認應答」(ACK)和「同步序列號」(SYN)標誌位的數據段相應客戶端。它也有兩個目的:發送ACK通知客戶端我收到了數據段;通知客戶端從哪一個序列號開始給數據段作標記。
- 第3次握手是客戶端再次發送一個數據段,確認收到了服務器的數據段,這時就能夠開始傳送實際數據了。
- 這樣3次握手就所有完成了,數據將開始傳輸了。
3次握手有以下特色:
- 沒有應用層數據。
- SYN這個標誌位只有TCP創建鏈接時才被置爲1。
- 握手完成後SYN標誌位被置爲0。
二、tcp四次斷開
TCP創建一個鏈接時進行了3次握手,而終止一個鏈接要通過4次。這是由TCP的半關閉(half-close)形成的。什麼是TCP的半關閉呢?
由於一個TCP鏈接是全雙工的(即數據可在兩個方向上同時傳遞),因此進行關閉時每一個方向必須單獨地進行關閉。這個單方向的關閉都稱爲半關閉。關閉的方法是一方完成它的數據發送任務後,就發送一個FIN來向另外一方通告將要終止這個方向鏈接。當一端收到一個FIN,它必須通知應用層TCP鏈接已經終止了那個方向的數據傳送。發送FIN一般是應用層進行關閉的結果。
TCP的斷開要通過4步,但後兩步和前兩步很類似,只是關閉鏈接的雙方調換角色而已
- 客戶端將控制位FIN置爲1,提出中止TCP鏈接的請求。
- 服務器收到FIN後對其作出響應,確認這一方向上的TCP鏈接將關閉。
- 由服務器再提出反方向的關閉要求,將FIN置爲1。
- 由客戶端對服務器端提出的關閉作出應答,雙方向的關閉結束。
這樣一共通過4個步驟後,TCP全雙工的雙向鏈接都獲得了正常的關閉。
- 在數據傳輸階段,客戶端向服務器發送了序列號爲100的數據段,服務器接收到後,發送了序列號爲300、確認號爲10l的確認數據段。這時,客戶端與服務器已經完成了數據的傳輸。
- 客戶端主動斷開鏈接,向服務器發送序列號爲101的數據段,其中將FIN標誌位置爲1,同時,確認前一個服務器發送來的數據段,確認號爲301,並將ACK置1。
- 服務器接收到這個斷連請求後,發送序列號爲30一、確認號爲102的確認數據段,執行被動關閉。這時,完成了客戶端→服務器的半關閉。
- 接着服務器向客戶端發出了序列號爲30一、FIN置1的斷連請求,要求斷開服務器→客戶端方向的鏈接。
- 客戶端收到這個FIN,應答了一個確認號爲302的確認序列,執行被動關閉。這時,完成了TCP的斷開鏈接的工做。