python網路程式設計 實現路由記錄

2021-10-03 01:46:57 字數 1858 閱讀 3710

首先檢視路由記錄如何執行的,那麼先用gns3搭建乙個簡易網路環境:

設定好動態路由解析後開始檢視:

抓包分析:最大記錄九個,其中第乙個是自己的ip

傳送:

接收:

ok開始用python寫路由記錄功能:

思路:眾所周知ping是基於icmp協議的

1.傳送icmp資料報,在ip報頭option中新增自己的ip,空出八個空位等待存放其他ip

2.設定icmp報文的type=8,code=0,即

3.讀取返回的資料報中ip層的資料列出路由記錄

code:

import sys

import logging

logging.getlogger("scapy.runtime").setlevel(logging.error)#清除報錯

from scapy.all import *

import struct

def record_one(dst,src):

ip_src = src.split('.')

sec_1 = struct.pack('>b',int(ip_src[0]))

sec_2 = struct.pack('>b',int(ip_src[1]))

sec_3 = struct.pack('>b',int(ip_src[2]))

sec_4 = struct.pack('>b',int(ip_src[3]))

ip_options = b'\x07\x27\x08' + sec_1 + sec_2 + sec_3 + sec_4 + b'\x00'*33

result = sr1(ip(dst=dst,options=ipoption(ip_options))/icmp(type=8,code=0),timeout=1,iface='乙太網',verbose=false)

print(result.getlayer(ip).options[0].fields['routers'])

return ;

if __name__ == "__main__":

record_one('192.168.1.7','192.168.1.9')

分析:ip_options = b'\x07\x27\x08' + sec_1 + sec_2 + sec_3 + sec_4 + b'\x00'*33

前面的\x07\x27\x08可以抓包檢視

然後就是轉為二進位制的本機ip位址

那麼為什麼最後\x00乘了33呢?留八個空位不是應該是4*8=32嗎。因為要湊成4位元組的整數倍(3+4+33=40)

那麼問題來了,為什麼要湊成4位元組的整數倍?因為ip資料報中首部長度的單位是四位元組。

執行結果:

Python實現網路程式設計

1 客戶端 服務端架構 在伺服器響應客戶端請求之前,必須進行一些初步的設定流程來為之後的工作做準備。首先會建立乙個通訊端點 套接字 他能夠使伺服器監聽請求 可以把伺服器比作公司的總機接線員。然後監聽伺服器進入無限迴圈中,等待客戶連線並響應其請求。同樣,客戶端也需要建立乙個單一通訊端點,然後與伺服器建...

《網路程式設計》路由套接字

unix 系統整合了路由功能,它包含相應的路由資料庫可提供的路由資訊,使用者可以通過命令方式來增加 修改以及刪除路由表中的專案,也可以只檢視路由表的資訊。在建立套接字時,可以通過指定引數 af route 域建立路由套接字,路由套接字可以訪問核心中路由子系統的介面資訊。路由套接字上支援 3 種型別的...

python網路程式設計 TCP網路程式設計

tcp程式設計 客戶端 import socket 1 套接字 tcp socket socket.socket socket.af inet,socket.sock stream 2 建立鏈結 tcp socket.connect 172.27.35.1 8080 3 傳送資訊 tcp socke...