思路:
手動構造乙個指定大小的資料報,在ip首部設定強制不分片,根據返回的icmp差錯報文型別來判斷資料報大小是否超過mtu
如果返回資料報icmp層的type==3,code==4則表明資料報已經超過了mtu
如果返回資料報icmp層的type==0,code==0則表明資料報可以成功傳送,大小沒有超過mtu
在主函式中設定乙個迴圈遞減設定的資料報大小來探測mtu值
**:
import sys
import logging
logging.getlogger("scapy.runtime").setlevel(logging.error)#清除報錯
from scapy.all import *
def mtu_one(mtu,dst):
data = b'a'*(mtu-28)
result = sr1(ip(flags='df',dst=dst)/icmp()/data)
try:
if result.getlayer(icmp).type==3 and result.getlayer(icmp).code==4:
return 1
elif result.getlayer(icmp).type==0 and result.getlayer(icmp).code==0:
return 2
except:
return none
if __name__ == "__main__":
ipaddr = input('ip: ')
mtu = int(input('mtu: '))
while mtu > 0:
res = mtu_one(mtu,ipaddr)
if res==1:
mtu -= 1
elif res==2:
print('this way min mtu: %d' % mtu)
break
elif res==none:
print('目的不可達')
break
分析:
data = b'a'*(mtu-28),為什麼減28?頭部大小28+8位元組
測試:
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...
python 網路程式設計
今天晚上學習了一下python的網路程式設計,實現了client向server傳送資料,server反饋資訊 python 3.3 版本 server from socket import class tcpserver object def init self,serverport self.se...
python網路程式設計
網路通訊是計算機之間的程序之間的通訊。tcp程式設計 tcp連線建立是雙向通道,客戶端與服務端都可以給對方傳送資料。建立tcp連線時,主動發起連線的叫客戶端,被動響應連線的叫服務端。建立乙個tcp的socket連線 用socket family,type 建立套接字獲得socket物件。family...