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

1、引言

UDP(User Datagram Protocol 用戶數據包協議)是一個簡單的面向數據包的運輸層協議。進程的每一次輸出操做都正好產生一個UDP協議(有長度限制)。這是面向流字符協議不一樣。UDP協議是封裝在IP數據包中的。UDP不提供可靠性:它把應用程序傳給 I P層的數據發送出去,可是並不保證它們能到達目的地。php

2、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端口號是相互獨立的。*微信

3、IP分片

物理網絡層通常要限制每次發送數據幀的最大長度。當要發送的數據長度大於了最大長度(MTU),就要對數據進行分片處理傳輸。   把一份IP數據包分片之後,只有到達目的地才進行從新組裝(這裏的從新組裝與其餘網絡協議不一樣,它們要求在下一站就進行進行從新組裝,而不是在最終的目的地)。從新組裝由目的端的IP層來完成,其目的是使分片和從新組裝過程對運輸層(TCP與UDP)是透明的,除了某些可能的越級操做外。 網絡

圖3.IP數據包結構

  • 16位標識字段(Identity):對於發送端發送的每份IP數據包來講,其標識字段都包含一個惟一值。該值在數據報分片時被複制到每一個片中。
  • 3位標誌字段(flag):標誌字段用最後一個比特來表示「更多的片」。除了最後一片外,其餘每一個組成數據報的片都要把該比特置 1。中間比特爲「不分片」位。若是將這一比特置 1,IP將不對數據報進行分片。
  • 13位片偏移字段(offset):該片偏移原始數據包開始處的位置。另外,當數據包被分片後,每一個片的總長度值要改成該片的長度值。

抓包,執行以下PHP代碼:socket

<?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數據包。

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

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