一、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-hant/n/160923.html