TCP/IP 協議族

淺淺藍qsl發表於2018-06-07

瞭解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 協議族
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報文格式

TCP/IP 協議族
協議組成:

  • 以太⽹⾸部

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

    • 硬體型別
    • 協議型別
    • 硬體地址⻓長度
    • 協議地址⻓長度
    • 操作
    • 傳送端以太⽹地址
    • 傳送端IP地址
    • ⽬的端以太⽹地址
    • ⽬的端IP地址 要注意的問題:
  • 訪問不存在的主機地址超時時間⼀般為75s,這個時間其實⼀ 般就是TCP連線請求的超時時間

  • 如果arp回答未返回,那麼任何TCP報⽂段都不會傳送 如何捕獲arp資料

    • 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等。

  • IP協議及IP資料包
    • IP協議是TCP/IP協議的核心,所有的TCP,UDP,IMCP,IGCP的資料都以IP資料格式傳輸。IP協議用於將多個包交換網路連線起來,它在源地址和目的地址之間傳送一種稱之為資料包的東西,並提供對資料大小的重新組裝功能,以適應不同網路對包大小的要求。要注意的是,IP不是可靠的協議,這是說,IP協議沒有提供一種資料未傳達以後的處理機制——>這被認為是上層協議:TCP或UDP要做的事情。所以這也就出現了TCP是一個可靠的協議,而UDP就沒有那麼可靠的區別。
    • IP資料包格式如下:

TCP/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/IP 協議族

  • 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的三次握手四次斷開

1、tcp三次握手

TCP在建立連線的時候使用埠號來完成與應用程式的對應。當一臺計算機和其他計算 機進行連線、通訊時使用IP地址和埠號。連線的每一方都是由一個IP地址和一個埠號組成的。比如通過IE瀏覽器上網時,通過解析輸入的URL地址可以得到IP地址,這時還有一個隱含的埠號80。這樣就構成了連線的伺服器方。同樣,連線的客戶端也會有自己的IP地址和埠號。在計算機上可以通過命令netstat-n來檢視目前存在的連線程式。TCP建立連線的過程稱為3次握手。建立連線的過程如下圖所示:

TCP/IP 協議族

  • 第1次握手是客戶端通過將一個含有“同步序列號”(SYN)標誌位的資料段傳送給伺服器而開始請求連線。通過該資料段,客戶端告知伺服器兩點:我希望跟你建立連線,同時告訴伺服器使用哪個序列號作為資料傳輸時資料段的起始。
  • 第2次握手是伺服器用一個帶有“確認應答”(ACK)和“同步序列號”(SYN)標誌位的資料段相應客戶端。它也有兩個目的:傳送ACK通知客戶端我收到了資料段;通知客戶端從哪個序列號開始給資料段做標記。
  • 第3次握手是客戶端再次傳送一個資料段,確認收到了伺服器的資料段,這時就可以開始傳送實際資料了。
  • 這樣3次握手就全部完成了,資料將開始傳輸了。

3次握手有如下特點:

  • 沒有應用層資料。
  • SYN這個標誌位只有TCP建立連線時才被置為1。
  • 握手完成後SYN標誌位被置為0。

2、tcp四次斷開

TCP建立一個連線時進行了3次握手,而終止一個連線要經過4次。這是由TCP的半關閉(half-close)造成的。什麼是TCP的半關閉呢?

因為一個TCP連線是全雙工的(即資料可在兩個方向上同時傳遞),所以進行關閉時每個方向必須單獨地進行關閉。這個單方向的關閉都稱為半關閉。關閉的方法是一方完成它的資料傳送任務後,就傳送一個FIN來向另一方通告將要終止這個方向連線。當一端收到一個FIN,它必須通知應用層TCP連線已經終止了那個方向的資料傳送。傳送FIN通常是應用層進行關閉的結果。

TCP的斷開要經過4步,但後兩步和前兩步很相似,只是關閉連線的雙方調換角色而已

  • 客戶端將控制位FIN置為1,提出停止TCP連線的請求。
  • 伺服器收到FIN後對其做出響應,確認這一方向上的TCP連線將關閉。
  • 由伺服器再提出反方向的關閉要求,將FIN置為1。
  • 由客戶端對伺服器端提出的關閉做出應答,雙方向的關閉結束。

這樣一共經過4個步驟後,TCP全雙工的雙向連線都得到了正常的關閉。

TCP/IP 協議族

  • 在資料傳輸階段,客戶端向伺服器傳送了序列號為100的資料段,伺服器接收到後,傳送了序列號為300、確認號為10l的確認資料段。這時,客戶端與伺服器已經完成了資料的傳輸。
  • 客戶端主動斷開連線,向伺服器傳送序列號為101的資料段,其中將FIN標誌位置為1,同時,確認前一個伺服器傳送來的資料段,確認號為301,並將ACK置1。
  • 伺服器接收到這個斷連請求後,傳送序列號為301、確認號為102的確認資料段,執行被動關閉。這時,完成了客戶端→伺服器的半關閉。
  • 接著伺服器向客戶端發出了序列號為301、FIN置1的斷連請求,要求斷開伺服器→客戶端方向的連線。
  • 客戶端收到這個FIN,應答了一個確認號為302的確認序列,執行被動關閉。這時,完成了TCP的斷開連線的工作。

相關文章