系列TCP/IP協議-UDP(009)

林灣村龍貓發表於2019-05-06

一、引言

UDP(User Datagram Protocol 使用者資料包協議)是一個簡單的面向資料包的運輸層協議。程式的每一次輸出操作都正好產生一個UDP協議(有長度限制)。這是面向流字元協議不同。UDP協議是封裝在IP資料包中的。UDP不提供可靠性:它把應用程式傳給 I P層的資料傳送出去,但是並不保證它們能到達目的地。

二、UDP結構

圖1. UDP結構

  • 源埠號:長度2位元組,標識該資料包來至於源主機的哪個埠;
  • 目的埠號:長度2位元組,標識該資料包目的主機埠號;
  • UDP長度:長度2個位元組,指明是UDP首部和UDP資料的位元組長度,單位位元組長度;該欄位的最小值為 8位元組(傳送一份0位元組的UDP資料包是OK的)。這個UDP長度是有冗餘的。IP資料包長度指的是資料包全長,因此UDP資料包長度是全長減去IP首部的長度。
  • UDP檢驗和覆蓋UDP首部和UDP資料。回想IP首部的檢驗和,它只覆蓋IP的首部。UDP資料包和TCP段都包含一個12位元組長的偽首部,它是為了計算檢驗和而設定的。偽首部包含IP首部一些欄位。其目的是讓UDP兩次檢查資料是否已經正確到達目的地。
    圖2. UDP校驗和技術過程中的結構

說明 *  由於IP層已經把IP資料包分配給TCP或UDP(根據IP首部中協議欄位值),因此TCP埠號由TCP來檢視,而UDP埠號由UDP來檢視。TCP埠號與UDP埠號是相互獨立的。*

三、IP分片

物理網路層一般要限制每次傳送資料幀的最大長度。當要傳送的資料長度大於了最大長度(MTU),就要對資料進行分片處理傳輸。   把一份IP資料包分片以後,只有到達目的地才進行重新組裝(這裡的重新組裝與其他網路協議不同,它們要求在下一站就進行進行重新組裝,而不是在最終的目的地)。重新組裝由目的端的IP層來完成,其目的是使分片和重新組裝過程對運輸層(TCP與UDP)是透明的,除了某些可能的越級操作外。

圖3.IP資料包結構

  • 16位標識欄位(Identity):對於傳送端傳送的每份IP資料包來說,其標識欄位都包含一個唯一值。該值在資料包分片時被複制到每個片中。
  • 3位標誌欄位(flag):標誌欄位用最後一個位元來表示“更多的片”。除了最後一片外,其他每個組成資料包的片都要把該位元置 1。中間位元為“不分片”位。如果將這一位元置 1,IP將不對資料包進行分片。
  • 13位片偏移欄位(offset):該片偏移原始資料包開始處的位置。另外,當資料包被分片後,每個片的總長度值要改為該片的長度值。

抓包,執行如下PHP程式碼:

<?php
$handle = stream_socket_client("udp://110.12.15.10:9999", $errno, $errstr);
if( !$handle ){    
      die("ERROR: {$errno} - {$errstr}\n");
}
$str = 'start';
for($i=0;$i<500;$i++){    
      $str .= 'abcdefjhijklmnopkrstuvwxyz1234567890';
}
$str .= 'end';
fwrite($handle, $str."\n");
複製程式碼

圖4.IP分片抓包
如上一個udp資料被分成了3個ip資料包。

都看到這裡了,要不要掃二維碼關注一下微信公眾號林灣村龍貓

微信公眾號rudy_tan_home

相關文章