前端進階必須懂得TCP/IP知識

上帝的眼發表於2018-08-17

TCP/IP四層協議

計算機網路的結構分層

OSI七層模型 TCP/IP協議族層次 功能 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
  • 物理層,相當於是那些物流公司裡的送貨汽車
  • 資料鏈路層,可以看作是物流公司的司機,他們駕駛著汽車,將打包好的貨物(資料幀)從一個城市(物理節點)運輸到另一個城市。
  • 網路層,這好比是物流公司的路線規劃者。物流公司有很多集散中心,根據集散中心的情況(是否擁堵),找出一條經過n個集散中心的路徑將貨物(資料)沿路運過去。
  • 傳輸層,可以將其看作是物流公司的跟單員。負責任的跟單員(使用 TCP 協議)會保證資料送到客戶手上,如果送不到(需要三次握手,四次揮手)就讓公司再發一次。不負責任的跟單員(使用 UDP 協議)層只管將快遞送到客戶指定的地方,不管快遞是否送到客戶手上。
  • 會話層,可看作是物流公司的排程員。他管理著這次物流的相關的資訊。例如這次客戶要發很多資料,發到哪,到底是一車一車發、還是用輪船一次運過去。這些都是他的職責。而運完之後,相關資訊(連線)也可以被銷燬了,這也是排程員的職責。
  • 表示層,相當於物流公司的打包員。如果快遞(資料)太臃腫,他會在不破壞快遞的情況下壓扁(壓縮)它。如果客戶注重安全線,全能的快遞公司還能用密碼箱( SSL/TLS)打包快遞再快送。當然,打包員會確定,目的地快遞站的拆包員,能無損地拆開包裹,將快遞交給使用者。
  • 應用層,可以想象成物流公司的收件員,當客戶(應用)打電話(發起請求)給收件員(應用層)時,收件員可以根據使用者的不同需求提供不同的服務(不同協議),比如隔天送達、指定時間送達等等。

TCP/IP協議族

  • TCP/IP從上往下走的時候,會分層的傳輸進行通訊。
  • 傳送端是從應用層鏈路層,接收端是從鏈路層往上到應用層取資料。
  • 其中通過各種首部的包裝來讓相應的層進行識別
  • 這裡我拿了網上copy的一張通用的圖來看一下。

前端進階必須懂得TCP/IP知識

  • 每層協議需要實現的功能:
    • 將上層協議傳遞的資料包包裝為滿足該層協議的資料包
    • 將下層協議傳遞的資料包解析為滿足上層協議的資料包
    • 處理其他層的互動

前端進階必須懂得TCP/IP知識

  • 這和上圖要表達的意思差不多,需要注意的是
    • 從底往上傳的二進位制包,只要該層能處理就不需要按照嚴格意義上的分層解析
    • 比如說,網路層往上傳二進位制包的時候,你可以在傳輸層包一層tcp頭,也可以不包,直接交給應用層解析

資料包

幀、資料包、段、訊息(傳輸資料單位)

  • 幀:用於表示資料鏈路層中包的單位;
  • 資料包: IP 和 UDP 等網路層以上的分層中包的單位;
  • 段:表示 TCP 資料流中的資訊;
  • 訊息:指應用協議中資料的單位。

資料在每個分層中的體現

  • 每個分層中,都會對所傳送的資料附加一個首部
  • 在這個首部中包含了該層必要的資訊,如傳送的目標地址以及協議相關資訊。
  • 通常,為協議提供的資訊為包首部,所要傳送的內容為資料。在下一層的角度看,從上一層收到的包全部都被認為是本層的資料。

前端進階必須懂得TCP/IP知識

在上面我們就能直觀地看到,每一層的資料之外,其實包了很多層協議的首部

資料鏈路層

探究:資料鏈路層到底幹了什麼?

前端進階必須懂得TCP/IP知識

  • 主要是做了接受IP資料包,併傳送IP資料包至IP模組
  • 與ARP及RARP模組互動
  • 它的結構可以分為如下
    • 業務區:最底下的那些物理機構成的區域,是物理層流出的起點。
    • 接入層:業務區往上的千兆交換機,這裡的物流機如果想互相通訊,就必須通過這個交換機。
    • 核心交換機:由一組千兆交換機組成。
    • IDC路由骨幹:路由器組成。

Wireshark抓包,看看資料鏈路層在傳輸時變成了什麼?

前端進階必須懂得TCP/IP知識

  • 首先這個是Wireshark給我們解析出來的TCP/IP協議族的四層。
  • 從上至下,分別是鏈路網路傳輸應用
  • 我們著重看鏈路層,因為鏈路層在網路層之下,此時的地址都為硬體地址。
  • 只有通過硬體地址,物理層才能將資料包通過路由傳至目標地址。
  • 這裡就會有一個問題:怎麼通過IP地址去獲取硬體地址呢?

ARP協議

作用:

  • 將32bit的IP地址,轉換為48bit的乙太網地址。
  • 傳送ARP廣播,獲得目的端的IP地址和硬體地址。

前端進階必須懂得TCP/IP知識

要注意的問題

  • 訪問不存在的主機地址超過時間一般為75s,這個時間其實一般就是TCP連線請求的超時時間。
  • 如果ARP回答未返回,那麼任何TCP報文段都不會傳送。

如何捕獲ARP資料?

  • telnet
  • tcpdump(相當於無介面的Wireshark)
  • 命令:
    • arp -a:檢視arp快取記憶體。(每個已經找到的mac地址都會在arp中快取
    • tcpdump -i 網路介面arp:監聽網路介面的ARP
    • tcpdump -D:檢視可監聽的網路介面。

MTU是什麼?

最大傳輸單元。

前端進階必須懂得TCP/IP知識

  • IPMTU就是最大的傳輸單元
  • 每個路由都會有一個規定的MTU大小
  • 如果我們傳送的IP資料包大於這個MTU,就會漏傳
  • 需要遵循短板原理,根據最小的MTU來設定IP資料包大小。

總結

  • 主要就是通過傳送端的IP地址,在內網(區域網)中通過廣播的方式,去詢問對應IP的乙太網地址
  • 如果訪問不到,超過75s,就不會繼續廣播
  • MTU控制我們傳輸的大小。
  • 如果我們訪問的不是區域網,屬於公網,那麼我們還通過ARP來尋找mac地址嗎?如果是這樣,那麼我們將會給每個公網傳送一個廣播,那得有多恐怖,所以ARP只存在區域網
  • 上面這種情況,我們先通過DNS解析得到對應的網路IP地址,再通過找上層的路由去尋找,此時路由發現不是區域網,將會在往上尋找ISP(Internet Service Provider),最後找到對應的mac地址

網路層(IP協議)

上面說到的路由,和它息息相關的就是我們的網路層,最為核心的一層。

前端進階必須懂得TCP/IP知識

協議組成(必須嚴格遵守順序)

  • 版本:4位
  • 首部長度:4位,⚠️注意,這裡的每1位表示10進位制x4個位元組的數目。因為4位最大的個數為1111,即15,所以首部最長為15x4,60位元組
  • 服務型別:8位,大部分實現不支援,無需關注
  • 總長度:16位,所以最大的IP包為65536
  • 標識:16位,唯一標識主機傳送的每一份資料包
  • 3位標誌+13位片偏移:暫時不關注
  • 生存時間:8位,資料包最多可經過的路由數(如果不設定這個,就會無限回傳)。
  • 上層協議:8位,表明該IP資料包對應的上層協議是什麼。
  • 首部校驗和:16位,保證IP資料包傳輸正確。
  • 源IP地址:32位。
  • 目的IP地址:32位。

前端進階必須懂得TCP/IP知識

  • 上面是Wireshark抓的包的IP層,可以清楚看到每個協議的組成。
  • 需要注意⚠️
    • 假如我們發的是公網IP,此時我們無法用ARP找到遠端mac地址
    • 需要通過傳送給路由,所以我們需要路由的mac地址
    • 本來資料鏈路層乙太網首部放的是本機mac地址和目標mac地址
    • 現在放的是本機mac地址和路由mac地址
    • 而我們的目標IP地址源IP地址則是包在IP首部之中,最後交給路由,讓路由處理。

路由選擇

  • 每一個IP資料包在網路中進行傳輸的目的,要找到目的IP的主機地址,並最終到達該主機。所以IP資料包經過的每一個節點都相當於是一個中轉站,也就是路由
  • IP資料包被路由節點的操作稱為路由選擇
    • 動態選路:根據當前網路狀況權值,選出一條最佳路徑。
    • 靜態選路:以手工方式為每臺路由器的路由選擇表新增路由。
  • 常規的路由機制
    • 目的主機與源主機直接相連,或處於共享網路,直接送達目標主機(相同內網下)。
    • 預設轉發至該網路存在的路由器上,再由其統一處理。
  • 路由匹配演算法
    • 路由表中存在與目的IP地址完全相同的條目,直接傳送至下一跳。
    • 路由表中存在與目的IP地址網路號相同的條目,傳送至該條目指定的下一跳。
    • 以上條件均不成立,尋找預設條目,傳送至該條目指定的下一跳。
    • 均不成立,返回主機或網路不可達。

前端進階必須懂得TCP/IP知識

  • 假如我們此時的目標IP地址為192.168.0.100,此時會匹配第一條,他的Gateway就是目標的mac地址,en0是網路卡,我們可以通過ifconfig檢視(windows用ipconfig)
  • 假如我們此時目標IP地址為192.168.0.103,此時路由表沒有對應IP地址,則會去尋找相同網路號,此時找到第二條,他的Gatewaylink#8相當於廣播出去。
  • 假如我們此時目標IP地址為192.168.1.2,此時無法在路由表中匹配,則走default,對應第三條,他的Gateway對應192.168.0.1192.168.0.1其實就是我們的路由器

上面有提到判斷網路號相同,這個我們怎麼來做呢?


如何判斷兩個IP地址網路號相同

IP地址的分類

類別 最大網路數 IP地址範圍 最大主機數 私有IP地址範圍
A 126(2^7-2) 0.0.0.0-127.255.255.255 16777214 10.0.0.0-10.255.255.255
B 16384(2^14) 128.0.0.0-191.255.255.255 65534 172.16.0.0-172.31.255.255
C 2097152(2^21) 192.0.0.0-223.255.255.255 254 192.168.0.0-192.168.255.255
  • IP 地址分為五個級別,分別為A類、B類、C類、D類、E類。它根據 IP 地址中從第 1 位到第 4 位的位元列對其網路標識和主機標識進行區分。D、E類屬特殊地址。
  • A 類 IP 地址是首位以 “0” 開頭的地址。從第 1 位到第 8 位是它的網路標識。用十進位制表示的話,0.0.0.0~127.0.0.0 是 A 類的網路地址。A 類地址的後 24 位相當於主機標識。因此,一個網段內可容納的主機地址上限為16,777,214個。
  • B 類 IP 地址是前兩位 “10” 的地址,一般是公網。從第 1 位到第 16 位是它的網路標識。用十進位制表示的話,128.0.0.0~191.255.0.0 是 B 類的網路地址。B 類地址的後 16 位相當於主機標識。因此,一個網段內可容納的主機地址上限為65,534個。
  • C 類 IP 地址是前三位為 “110” 的地址。從第 1 位到第 24 位是它的網路標識。用十進位制表示的話,192.0.0.0~223.255.255.0 是 C 類的網路地址。C 類地址的後 8 位相當於主機標識。因此,一個網段內可容納的主機地址上限為254個。

子網掩碼

  • 為了細分更小力度的網路。
  • 他讓A、B、C類地址的主機地址部分用作子網地址,可以將原網路分為多個物理網路的一種機制
  • 每類的都有自己預設的網路地址
類別 子網掩碼
A 255.0.0.0
B 255.255.0.0
C 255.255.255.0
  • 通過和IP地址進行運算(1&0=0;0&0=0;1&1=1)來得到網路號,這裡的操作需要將IP地址轉為二進位制在進行

為什麼細分了網路?

前端進階必須懂得TCP/IP知識

從上面的圖,我們可以看出,每類地址的網路分段

  • 題目
    • 1、10.0.0.1和10.1.1.1的網路號相同嗎?
    • 2、172.16.0.1和172.16.1.1的網路號呢?
    • 3、192.168.10.103和192.168.0.102呢?
  • 答案
    • 1、相同。首先我們知道這兩個IP地址同屬A類,再將他們和預設子網掩碼(255.0.0.0),得到結果兩個都是10.0.0.0,這就是他們的網路號,也正好符合圖中的前8位,10轉為二進位制就是00001010
    • 2、同理可得,屬於B類,相同,並且網路號為172.16.0.0
    • 3、屬於C類,網路號不同,分別為192.168.10.0192.168.0.0

上面的題目都是在預設的子網掩碼之下,那麼如果我們改了子網掩碼呢?

  • 題目
    • 1、172.16.0.1和172.16.1.1的子網掩碼是255.255.255.0,此時網路號相同嗎?
  • 答案
    • 1、不同,此時我們在算一次,把每個IP地址都和255.255.255.0,此時網路號分別為,172.16.0.0172.16.1.0,則不同。
  • 我們可以看到經過子網掩碼,把我們本來相同網段IP地址,劃為不通網段的地址,這樣就細分了網路,有更多的物理網路

IP分片

當我們的MTU最大傳輸單元(1500位元組,去掉乙太網首部,就是1480位元組)滿足不了我們的需求時,我們就需要IP分片(分成一片片傳輸)。

  • 回顧IP協議組成中的:標誌欄位、片偏移
    • 16位標識()IP分片時,該值被複制每一個分片中,相當於每個分片的id
    • 三位標誌
      • 首位:保留欄位,一般為0。
      • 中間位:不進行IP分片時為0,進行時為1。
      • 末位:假如此時有3片IP分片,前兩片末位都為1,最後一片末位為0。
    • 13位片偏移:該片偏移原始資料包開始處的位置。假如此時5片IP分片,那麼第一片的13位片偏移為1,第二片為2,讓路由知道先後順序

前端進階必須懂得TCP/IP知識

  • 錯誤處理
    • IP分片時,只丟失一片資料,也需要重傳整個IP資料包。
    • 當給定資料包的第一個資料包片到達時,開始定時器過期丟棄所有資料包片。

ICMP協議

  • 屬於IP協議的一部分
  • 確認 IP 包是否成功送達目標地址,通知在傳送過程當中 IP 包被廢棄的具體原因,改善網路設定等。
  • IP包首部有一個欄位TTL,每經過一個路由器就會減1,直到減到0時IP報就會被丟棄。
  • 此時,IP路由器將會傳送一個ICMP超時的訊息給傳送端,通知該包已被丟棄
  • traceroute命令的原理就是通過ICMP超時訊息來顯示傳送主機到達特定主機之前經歷了多少路由器。

前端進階必須懂得TCP/IP知識

總結:

  • 處理資料包在網路中的行為(路由選擇)。
  • 承載端到端的資料互動方式(兩個ip的host之間的傳遞資料)。
  • 缺點:
    • 只是保證資料基本達到,資料可能是無序的。
    • 可能是缺失的。

傳輸層(TCP協議)

解決IP層的痛點,是一種安全的協議,主要通過連線疏通了整一個通道,安全傳輸。

三次握手和四次揮手

前端進階必須懂得TCP/IP知識

三次握手

  • 看前三個箭頭
    • 客戶端傳送SYN A1請求建立連線,SYN就是synchronization(同步),而且此時A1是被傳在sequence(序列)中的,此時服務端接收到客戶端傳來的A1訊號。
    • 服務端迴應客戶端我接收到了,所以傳送ACK A2(只是確認應答,所以只需在原有的A1+1=A2),這裡的ACK就是acknowledge(確認)。並且請求客戶端建立連線, 此時傳送一個訊號SYN B1
    • 客戶端接受並確認應答,告知服務端接收到了訊號,所以傳送ACK B2(因為上次推過來的SYN B1)

四次揮手

  • 看後四個箭頭
    • 客戶端傳送結束訊號FIN C1
    • 服務端接收到結束訊號,迴應接收到了,此時傳送訊號ACK C2,客戶端已經關閉,但是伺服器處於半關閉狀態(客戶端不能向伺服器傳送請求,伺服器還是能接受客戶端請求)
    • 服務端向客戶端傳送結束訊號FIN D1
    • 客戶端接收到結束訊號,迴應接收到了,此時傳送訊號ACK D2,伺服器也關閉。

通過序列號與確認應答提高可靠性

  • 序列號是按照順序給傳送資料的每一個位元組(8位位元組)都標上號碼的編號。接收端查詢接收資料TCP首部中的序列號資料的長度,將自己下一步應該接收的序列號作為確認應答返送回去。通過序列號確認應答號,TCP能夠識別是否已經接收資料,又能夠判斷是否需要接收,從而實現可靠傳輸。

重發超時的確定

  • 重發超時是指在重發資料之前,等待確認應答到來的那個特定時間間隔。如果超過這個時間仍未收到確認應答,傳送端將進行資料重發。最理想的是,找到一個最小時間,它能保證“確認應答一定能在這個時間內返回”。
  • TCP 要求不論處在何種網路環境下都要提供高效能通訊,並且無論網路擁堵情況發生何種變化,都必須保持這一特性。為此,它在每次發包時都會計算往返時間及其偏差。將這個往返時間和偏差時間相加,重發超時的時間就是比這個總和要稍大一點的值。
  • 在 BSD 的 Unix 以及Windows系統中,超時都以0.5秒為單位進行控制,因此重發超時都是0.5秒的整數倍。不過,最初其重發超時的預設值一般設定為6秒左右。
  • 資料被重發之後若還是收不到確認應答,則進行再次傳送。此時,等待確認應答的時間將會以2倍、4倍的指數函式延長
  • 此外,資料也不會被無限、反覆地重發。達到一定重發次數之後,如果仍沒有任何確認應答返回,就會判斷為網路或對端主機發生了異常,強制關閉連線。並且通知應用通訊異常強行終止

以段為單位傳送資料

  • 在建立TCP連線的同時,也可以確定傳送資料包的單位,我們也可以稱其為“最大訊息長度”(MSS)。最理想的情況是,最大訊息長度正好是IP中不會被分片處理的最大資料長度。
  • TCP在傳送大量資料時,是以MSS的大小將資料進行分割傳送。進行重發時也是以MSS為單位。
  • MSS在三次握手的時候,在兩端主機之間被計算得出。兩端的主機在發出建立連線的請求時,會在TCP首部中寫入MSS選項,告訴對方自己的介面能夠適應的MSS 的大小。然後會在兩者之間選擇一個較小的值投入使用。

利用視窗控制提高速度

  • TCP 以1個段為單位,每傳送一個段進行一次確認應答的處理。這樣的傳輸方式有一個缺點,就是包的往返時間越長通訊效能就越低。
  • 為解決這個問題,TCP引入了視窗這個概念。確認應答不再是以每個分段,而是以更大的單位進行確認,轉發時間將會被大幅地縮短。也就是說,傳送端主機,在傳送了一個段以後不必要一直等待確認應答,而是繼續傳送
  • 視窗大小就是指無需等待確認應答而可以繼續傳送資料的最大值。這個機制實現了使用大量的緩衝區,通過對多個段同時進行確認應答的功能。

總結:

  • 抽象出連線的概念,在一個TCP連線中,僅有兩方彼此通訊
  • 保證了可靠資料傳輸及正確順序的資料處理
  • 提供流量控制(Node.js中的流)

應用層(HTTP協議)

我會留到下一篇再講,同時我會結合node來講解其中的http的應用和原理,敬請期待。

相關文章