TCP/IP 協議族

瞭解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報文格式安全

協議組成:

  • 以太⽹⾸部服務器

    • 以太⽹⽬的地址
    • 以太⽹源地址
    • 幀類型
  • arp請求/應答網絡

    • 硬件類型
    • 協議類型
    • 硬件地址⻓長度
    • 協議地址⻓長度
    • 操做
    • 發送端以太⽹地址
    • 發送端IP地址
    • ⽬的端以太⽹地址
    • ⽬的端IP地址 要注意的問題:
  • 訪問不存在的主機地址超時時間⼀般爲75s,這個時間其實⼀ 般就是TCP鏈接請求的超時時間數據結構

  • 若是arp回答未返回,那麼任何TCP報⽂段都不會發送 如何捕獲arp數據tcp

    • arp -a:查看arp⾼速緩存
    • tcpdump -i ⽹絡接⼝ arp:監聽⽹絡接⼝的ARP
    • tcpdump -D:查看可監聽的⽹絡接⼝ 數據鏈路層的協議仍是不少的,有咱們最經常使用的以太網(就是平時咱們用的網卡)協議,也有不太常見的令牌環,還有FDDI,固然,還有國內如今至關普及的PPP協議(就是adsl寬帶),以及一個loopback協議。而每一種數據鏈路層協議,都有一個MTU(最大傳輸單元)定義,在這個定義下面,若是IP數據報過大,則要進行分片(fragmentation),使得每片都小於MTU,注意PPP的MTU並非一個物理定義,而是指一個邏輯定義(我的認爲就是用程序控制)。

網絡層

網絡層的主要功能:網絡層識別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也能收到該數據報;若發送受限廣播數據報,則不能收到。 注:通常的廣播地址(直接廣播地址)可以經過某些路由器(固然不是全部的路由器),而受限的廣播地址不能經過路由器。

  • 0.0.0.0

經常使用於尋找本身的IP地址,例如在咱們的RARP,BOOTP和DHCP協議中,若某個未知IP地址的無盤機想要知道本身的IP地址,它就以255.255.255.255爲目的地址,向本地範圍(具體而言是被各個路由器屏蔽的範圍內)的服務器發送IP請求分組。

  • 迴環地址

127.0.0.0/8被用做迴環地址,迴環地址表示本機的地址,經常使用於對本機的測試,用的最多的是127.0.0.1。

  • A、B、C類私有地址

    • 私有地址(private address)也叫專用地址,它們不會在全球使用,只具備本地意義。
    • A類私有地址:10.0.0.0/8,範圍是:10.0.0.0~10.255.255.255
    • B類私有地址:172.16.0.0/12,範圍是:172.16.0.0~172.31.255.255
    • C類私有地址:192.168.0.0/16,範圍是:192.168.0.0~192.168.255.255
  • 子網掩碼 IP地址的定義是網絡號+主機號。可是如今全部的主機都要求子網編址,也就是說,把主機號在細分紅子網號+主機號。最終一個IP地址就成爲網絡號碼+子網號+主機號。

子網掩碼是一個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的斷開鏈接的工做。
相關文章
相關標籤/搜索