一、IP數據報的定義
IP數據報是互聯網協議(IP)中的一個基本概念,它是網路傳輸層中用於在計算機網路中進行傳輸的數據單元。IP數據報由源主機分段並通過互聯網傳輸到目標主機,其中每個段都可能有不同的路徑,通常也可能經過中轉主機。
二、IP數據報首部
IP數據報首部是每個IP數據報中的頭部信息,包含20個位元組。其結構如下:
| 20 Bytes | +-----------------------------------+ | Version | Header Length | +-----------------------------------+ | Differentiated Services Field | +-----------------------------------+ | Total Length | +-----------------------------------+ | Identification | +-----------------------------------+ | Flags | Fragment Offset | +-----------------------------------+ | Time to Live | Protocol | +-----------------------------------+ | Header Checksum | +-----------------------------------+ | Source Address | +-----------------------------------+ | Destination Address | +-----------------------------------+
三、IP數據報是哪一層
IP數據報是互聯網協議中的網路層協議。
四、IP數據報首部長度
IP數據報首部長度固定為20位元組,但是IP數據報的數據部分長度是可變的。
五、IP數據報報頭
IP數據報報頭由版本、首部長度、不同服務欄位、標識、片偏、TTL、協議、源IP地址和目標IP地址組成,共20位元組。其中不同服務欄位用來指定所要求的服務的優先順序,TTL是生存時間(Time To Live)的縮寫,標識用於唯一地標識正在傳輸的數據片段。
六、IP數據報傳輸圖示
七、IP數據報格式
一個標準的IP數據報包含一個20位元組的首部和一個不定長的負載。其格式如下:
+------------+--------------+ | Header | Payload | +------------+--------------+
八、IP數據報分片
由於IP數據報所能承載的負載大小有限,如果發送的數據大於MTU(Maximum transmission unit),則需要進行分片。在分片的過程中,IP數據報首部中的標識和片偏欄位就成為了關鍵字。
九、IP數據報分析題
請分析下面的IP數據報:
0000 45 00 04 36 2c 4b 40 00 34 06 05 f3 ac 10 01 0b 0010 ac 10 01 01 05 5b 11 ea 00 1e 36 da 59 7a 56 5e 0020 b4 8d 58 50 18 ff ff 21 b9 00 00
分析結果如下:
- 版本:4
- 首部長度:5(20位元組)
- 不同服務欄位:0
- 總長度:1078位元組(0x436)
- 標識:0x2c4b
- 片偏:0
- TTL:52
- 協議:6(TCP)
- 源IP地址:172.16.1.11
- 目標IP地址:172.16.1.1
十、IP數據報抓包選取
以下是Wireshark抓包顯示的IP數據報(其中紅框內的部分為IP數據報首部信息):
完整代碼示例
// 創建IP數據報 def create_ip_packet(source_ip, dest_ip, payload): packet = b'' # 版本(IPv4)和首部長度(20位元組) version = 4 ihl = 5 packet += struct.pack('!B', (version << 4) + ihl) # 不同服務欄位 packet += b'\x00' # 總長度(數據部分size + 首部size) total_length = len(payload) + 20 packet += struct.pack('!H', total_length) # 標識、標誌(2位)和片偏(13位) identification = random.randint(0, 65535) flags = 0 fragment_offset = 0 packet += struct.pack('!H', identification) packet += struct.pack('!H', (flags << 13) + fragment_offset) # TTL、協議(TCP)和頭部校驗和 ttl = 64 protocol = socket.IPPROTO_TCP packet += struct.pack('!B', ttl) packet += struct.pack('!B', protocol) packet += struct.pack('!H', 0) # 源IP地址和目標IP地址 packet += socket.inet_aton(source_ip) packet += socket.inet_aton(dest_ip) # 計算假首部校驗和 pseudo_header = b'' pseudo_header += socket.inet_aton(source_ip) pseudo_header += socket.inet_aton(dest_ip) pseudo_header += struct.pack('!B', 0) pseudo_header += struct.pack('!B', protocol) pseudo_header += struct.pack('!H', total_length - 20) # 計算真正的頭部校驗和 packet += checksum(pseudo_header + packet) # 將數據部分添加到IP數據報中 packet += payload return packet
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/160923.html