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

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 和 UDP 等網絡層以上的分層中包的單位;
  • 段:表示 TCP 數據流中的信息;
  • 消息:指應用協議中數據的單位。

數據在每一個分層中的體現

  • 每一個分層中,都會對所發送的數據附加一個首部
  • 在這個首部中包含了該層必要的信息,如發送的目標地址以及協議相關信息。
  • 一般,爲協議提供的信息爲包首部,所要發送的內容爲數據。在下一層的角度看,從上一層收到的包所有都被認爲是本層的數據。

在上面咱們就能直觀地看到,每一層的數據以外,其實包了不少層協議的首部node

數據鏈路層

探究:數據鏈路層到底幹了什麼?

  • 主要是作了接受IP數據報,併發送IP數據報至IP模塊
  • 與ARP及RARP模塊交互
  • 它的結構能夠分爲以下
    • 業務區:最底下的那些物理機構成的區域,是物理層流出的起點。
    • 接入層:業務區往上的千兆交換機,這裏的物流機若是想互相通訊,就必須經過這個交換機。
    • 核心交換機:由一組千兆交換機組成。
    • IDC路由骨幹:路由器組成。

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

  • 首先這個是Wireshark給咱們解析出來的TCP/IP協議族的四層。
  • 從上至下,分別是鏈路網絡傳輸應用
  • 咱們着重看鏈路層,由於鏈路層在網絡層之下,此時的地址都爲硬件地址。
  • 只有經過硬件地址,物理層才能將數據包經過路由傳至目標地址。
  • 這裏就會有一個問題:怎麼經過IP地址去獲取硬件地址呢?

ARP協議

做用:

  • 將32bit的IP地址,轉換爲48bit的以太網地址。
  • 發送ARP廣播,得到目的端的IP地址和硬件地址。

要注意的問題

  • 訪問不存在的主機地址超過期間通常爲75s,這個時間其實通常就是TCP鏈接請求的超時時間。
  • 若是ARP回答未返回,那麼任何TCP報文段都不會發送。

如何捕獲ARP數據?

  • telnet
  • tcpdump(至關於無界面的Wireshark)
  • 命令:
    • arp -a:查看arp高速緩存。(每一個已經找到的mac地址都會在arp中緩存
    • tcpdump -i 網絡接口arp:監聽網絡接口的ARP
    • tcpdump -D:查看可監聽的網絡接口。

MTU是什麼?

最大傳輸單元。算法

  • IPMTU就是最大的傳輸單元
  • 每一個路由都會有一個規定的MTU大小
  • 若是咱們傳送的IP數據包大於這個MTU,就會漏傳
  • 須要遵循短板原理,根據最小的MTU來設置IP數據包大小。

總結

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

網絡層(IP協議)

上面說到的路由,和它息息相關的就是咱們的網絡層,最爲核心的一層。windows

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

  • 版本: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位。

  • 上面是Wireshark抓的包的IP層,能夠清楚看到每一個協議的組成。
  • 須要注意⚠️
    • 假如咱們發的是公網IP,此時咱們沒法用ARP找到遠端mac地址
    • 須要經過發送給路由,因此咱們須要路由的mac地址
    • 原本數據鏈路層以太網首部放的是本機mac地址和目標mac地址
    • 如今放的是本機mac地址和路由mac地址
    • 而咱們的目標IP地址源IP地址則是包在IP首部之中,最後交給路由,讓路由處理。

路由選擇

  • 每個IP數據報在網絡中進行傳輸的目的,要找到目的IP的主機地址,並最終到達該主機。因此IP數據報通過的每個節點都至關因而一個中轉站,也就是路由
  • IP數據報被路由節點的操做稱爲路由選擇
    • 動態選路:根據當前網絡情況權值,選出一條最佳路徑。
    • 靜態選路:以手工方式爲每臺路由器的路由選擇表添加路由。
  • 常規的路由機制
    • 目的主機與源主機直接相連,或處於共享網絡,直接送達目標主機(相同內網下)。
    • 默認轉發至該網絡存在的路由器上,再由其統一處理。
  • 路由匹配算法
    • 路由表中存在與目的IP地址徹底相同的條目,直接發送至下一跳。
    • 路由表中存在與目的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地址轉爲二進制在進行

爲何細分了網絡?

從上面的圖,咱們能夠看出,每類地址的網絡分段安全

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

上面的題目都是在默認的子網掩碼之下,那麼若是咱們改了子網掩碼呢?服務器

  • 題目
    • 一、172.16.0.1和172.16.1.1的子網掩碼是255.255.255.0,此時網絡號相同嗎?
  • 答案
    • 一、不一樣,此時咱們在算一次,把每一個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,讓路由知道前後順序

  • 錯誤處理
    • IP分片時,只丟失一片數據,也須要重傳整個IP數據報。
    • 當給定數據報的第一個數據報片到達時,開始定時器過時丟棄全部數據報片。

ICMP協議

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

總結:

  • 處理數據報在網絡中的行爲(路由選擇)。
  • 承載端到端的數據交互方式(兩個ip的host之間的傳遞數據)。
  • 缺點:
    • 只是保證數據基本達到,數據多是無序的。
    • 多是缺失的。

傳輸層(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的應用和原理,敬請期待。tcp

相關文章
相關標籤/搜索