07python實現traceroute程式

2022-03-17 06:47:06 字數 2312 閱讀 4717

# 這個指令碼是實現linux中traceroute程式的,是探測從我們這個機器到我們要探測的ip位址中間都需要經過那些路由。

# 原理:我們的機器傳送udp高階口的資料報,傳送給目的位址,首先設定ttl為1,然後逐次增加,在沒有到達我們的目的ip

# 位址的路由,會傳送icmp的超時報文,然後我們從中提取ip位址,因為我們傳送的是高階口的報文,到達目的位址的時候,

# 目的位址會傳送icmp的埠不可達報文,這樣我們就探測出從我們源埠到目的埠的路由。

from scapy.all import *

import struct,re,random

# 跟我們實現ping程式的想法是一樣的,首先構造乙個傳送乙個udp報文的函式,

# 入參為目的位址,ttl數。

def traceroute_one(dst,ttl_no,dport):

# 定義發包時間。

send_time = time.time()

try:

# 傳送乙個包,接收乙個包。

traceroute_one_reply = sr1(ip(dst=dst, ttl=ttl_no) / udp(dport=dport) / b'hello world', timeout=1,

verbose=false)

# 判斷icmp包是不是超時回答。

if traceroute_one_reply.getlayer(icmp).type == 11 and traceroute_one_reply.getlayer(icmp).code == 0:

# 提取源位址

src_ip = traceroute_one_reply.getlayer(ip).src

# 定義接收時間。

recv_time = time.time()

# 計算時間ms數

mid_time = (recv_time - send_time) * 1000

# 返回。

return 1,src_ip,mid_time

# 這裡接接收的是最後一跳。icmp應該是埠不可達。

elif traceroute_one_reply.getlayer(icmp).type == 3 and traceroute_one_reply.getlayer(icmp).code == 3:

# 下邊處理是一樣的。

src_ip = traceroute_one_reply.getlayer(ip).src

recv_time = time.time()

mid_time = (recv_time - send_time) * 1000

return 2, src_ip, mid_time

except exception as e:

return none

def traceroute(dst,hops):

# 目的埠從33434開始算起,入參為目的位址,我們想要查詢的路由的條數。

dport = 33434

hop = 0

# 進行迴圈包。

while hop < hops:

hop += 1

# 這裡需要改變埠。

dport += hop

# 傳送乙個包,獲取返回值。

traceroute_result = traceroute_one(dst,hop,dport)

# 如果出現了錯誤,列印*號。

if traceroute_result == none:

print('*')

# 這裡代表中間路由,我們進行列印資訊。

elif traceroute_result[0] == 1:

print("%d %s %4.2fms" % (hop,traceroute_result[1],traceroute_result[2]))

# 最後乙個包,為埠不可達,列印資訊後,需要退出迴圈,因為已經到達目的位址了,雖然可能沒有達到我們定義的條數。

elif traceroute_result[0] == 2:

print("%d %s %4.2fms" % (hop, traceroute_result[1], traceroute_result[2]))

break

time.sleep(1)

if __name__ == "__main__":

traceroute('180.101.49.12',10)

# 接下來我們就可以使用wirshark進行抓包來看一下。

07 Python小節案例

採集乙個人的身高,體重,年齡和性別 告訴ta,自己的體脂率是否在正常範圍之內 1.知識考察點 注釋 輸入輸出 變數使用 變數的命名規範 運算子的使用 資料型別轉換 2.體脂率計算公式 bmi 體重 kg 身高 身高 公尺 體脂率 1.2 bmi 0.23 年齡 5.4 10.8 性別 男 1 女 0...

07 Python函式基礎

1.函式簡介 2.函式引數 3.函式作用域 4.遞迴函式 5.高階函式1.函式簡介 1.1 函式分類 語法 deffunname parm1,parm2.expresssions 2.函式引數 2.1 形參與實參 2.2 引數傳遞方式 def f1 name,age print name name,...

07 Python 條件判斷與迴圈

1 if.else a 10 if a 10 print a大於等於10 else print a小於等於10 2if.elseif.else age 22 if age 18 print 成年了 elif age 16 print 半成年 else print 未成年 2.1 for 迴圈user...