從IP數據包到端口發送究竟經歷了什麼?

我一直覺得IP數據包,到物理層發送這之間再也不有什麼操做性了。由於在日常的交流中談協議,談到IP這一層基本就止住了,彷彿IP打包後就能夠直接發送了是的。然而當我讀了《TCP/IP詳解卷一:協議》後,我才發現其中並無那麼簡單。也許是由於接近真實世界的緣由,不一樣的網絡鏈接方式最終封裝的IP都不太同樣。程序員

以太網和IEEE 802

以太網和IEEE 802是最多見的兩種協議,它們的數據報以下:緩存

IEEE802和以太網數據報

目的地址和原地址指的就是物理地址(MAC地址),它們是經過ARP協議獲取的(下文會介紹)。網絡

咱們將目光放到封裝的數據部分,能夠看到封裝的三種報文(IP、ARP、RARP)類型是一致的,可是後面的數據長度範圍並不一致。IEEE802的最小值是36字節(PAD 表明填充字節的意思),而以太網的是46。學習

在觀察除了數據之外的部分,會發現他們源地址、目的地址都在開頭並佔據相同長度,尾部都是4字節的CRC(檢驗碼),不同的是IEEE802比以太網多佔用了8個字節(長度+幾個不明就裏的固定字段)。spa

在我看來以太網應該是IEEE 802的升級版(由於減小了一些不須要的固定字節的佔用),然而以太網出現的時間比IEEE 802提早,也就是說IEEE 802纔是升級版。更神奇的是RFC標準規定,以太網必須支持而IEEE選擇支持。然而我查找了半天資料沒有發現兩個同時存在的緣由,所以我能想到的IEEE 802存在的緣由是歷史商業競爭的產物了。設計

ARP:地址解析協議

ARP(Address Resolution Protocol)爲協議地址(一般是IP,也就是說能夠用在非IP協議上)到硬件地址之間提供一種映射。主要不是用於消息通訊,而是爲了消息通訊而查出硬件地址。code

用於以太網的ARP請求或應答報文以下:cdn

ARP數據報

  • 幀類型:表示後面的數據類型,應答或請求(0X0806)
  • 硬件類型:表示硬件地址的類型,值爲 1即表示以太網地址
  • 協議類型:表示要映射的協議地址類型。它的值爲 0x0800 即表示IP地址
  • 硬件地址長度/協議地址長度:單位byte
  • op:表明操做,發送爲響應報文時爲2

硬件類型和協議類型決定最後4個字段(源硬件地址、源協議地址、目的硬件地址、目的協議地址)的長度和內容blog

解析過程:ci

  1. ARP發送請求到廣播地址(物理地址每一個bit都爲1,FF:FF:FF:FF:FF:FF)
  2. 與ARP請求的目標IP地址對應的主機,填充上地址段
  3. 根據請求端的地址直接將響應報文發送回請求主機

主機在接收到請求或響應ARP報文時,會將地址緩存下來。完整的表項(可以正常響應的)通常爲20分鐘,不完整的表項(未被正常響應的)通常爲3分鐘。能夠經過指令arp進行查看。

SLIP:串行線路IP

SLIP(Serial Line IP)是一種對IP數據報進行封裝的簡單形式,適用於RS-232串行端口和高速調制解調器接入Internet。RS-232常見於液晶顯示屏與電腦的連接。

RS-232數據線:

RS-232數據線

SLIP數據報:

SLIP數據報

從數據報能夠看出SLIP協議是一種很簡單的協議,除了頭尾字段用於區分數據報,而後將數據報中會影響判斷的(標誌字節:0xc0,轉義字節:0xdb)進行轉義就完成了封裝能夠進行發送了。

優勢:

簡單、字節少。

我想這也是它會被用在顯示器上(RS-232)和接入Internet等對時延要求高、傳輸量大的場合。

缺點:

  1. 根據IP知道對端機器(原話是「每端必須知道對方IP」)。該協議沒有使用ARP進行廣播,肯定發送機器,因此必須的經過IP層的目的IP地址知道對應的機器。
  2. 數據幀沒有類型字段,只能發送一種類型的報文。(原話是「若是一條串行線路用於SLIP,那麼它不能同時使用其餘協議。」)
  3. 沒有校驗和,受噪聲影響,傳輸出錯只能在上層校驗。

我想也就是由於這些不穩定性,因此主要是在有線傳輸中見到它的身影。

CSLIP

CSLIP(Compressed SLIP)是SLIP的更進一步,它將SLIP傳輸的TCP數據包頭進行壓縮,減小傳輸量。但並不影響UDP包頭。

PPP:點對點協議

PPP(Point to Point Protocol)協議修改了SLIP協議中的全部缺點。PPP就是被設計來用於取代SLIP的。其數據報以下:

PPP數據報

能夠看到CRC加入了協議字段和CRC字段(校驗和)字段,所以能夠解決只可以傳輸一種類型報文,以及沒有校驗和易受噪聲干擾的問題。至於PPP的IP協商機制,有興趣的能夠本身查查資料。

PPP與SLIP同樣有頭尾標誌字節,這就說明PPP也須要將數據報中的標誌字節和轉義字節進行轉移。與SLIP不同的是,標誌位(0x7e)、轉義字節(0x7d)。

除了這兩個字節外PPP還須要對小於0x20的字節進行轉移,由於0x20的字節在ascii碼中有控制含義,怕影響底層驅動程序。

所以PPP具備轉移規則,規則是在0x7d接下去的第1個byte的第6個bit取補碼(即將byte取補碼後,將這個byte的第6位,用補碼的第6位取代)。

公衆號二分之一程序員,專一計算機基礎的學習,歡迎關注 :)
複製代碼

公衆號
相關文章
相關標籤/搜索