Menu

(Solved) : Write Traceroute Program Idea Make Iterated Ping Requests Increasing Ttl Values Ttl Icmp P Q37162448 . . .

Write your owntraceroute program. The idea is to make iterated ping requests withincreasing TTL values.  If the TTL of your ICMP packet isequal to 1, Intermediate routers between you and the finaldestination will reply to your ping message with their address. Ifthe TTL is larger than 1, they will decease the TTL by one, andthen forward your ICMP packet to next hop. Your program shoulddisplay the address and RTT for each hop in the route.

You may use theattached ping Python code as starting point. ADD TO THE CODEPROVIDED BELOW TO MAKE IT RUN PROPERLY! MUST BE IN PYTHON!

The given code is:

from socket import*

import os

import sys

import struct

import time

import select

importbinascii  

ICMP_ECHO_REQUEST =8

# Function checksumcalculates and returns the checksum of the input.

def checksum(str):

csum = 0

countTo = (len(str) /2) * 2

count = 0

while count <countTo:

thisVal =ord(str[count+1]) * 256 + ord(str[count])

csum = csum +thisVal

csum = csum &0xffffffffL  

count = count + 2

if countTo <len(str):

csum = csum +ord(str[len(str) – 1])

csum = csum &0xffffffffL

csum = (csum >>16) + (csum & 0xffff)

csum = csum + (csum>> 16)

answer = ~csum

answer = answer &0xffff

answer = answer>> 8 | (answer << 8 & 0xff00)

return answer

# FunctionreceiveOnePing listens for ping replies, and displays theresults.

defreceiveOnePing(mySocket, ID, timeout, destAddr):

timeLeft = timeout

while 1:

startedSelect =time.time()

whatReady =select.select([mySocket], [], [], timeLeft)

howLongInSelect =(time.time() – startedSelect)

if whatReady[0] == []:# Timeout

return “Request timedout.”

timeReceived =time.time()

recPacket, addr =mySocket.recvfrom(1024)

# Fetch the ICMPHeaderfromt the IP

icmpHeader =recPacket[20:28]

rawTTL =struct.unpack(“s”, recPacket[8])[0]  

# binascii — Convertbetween binary and ASCII  

TTL =int(binascii.hexlify(str(rawTTL)), 16)

icmpType, code,checksum, packetID, sequence = struct.unpack(“bbHHh”,icmpHeader)

if packetID == ID:

bytes =struct.calcsize(“d”)

timeSent =struct.unpack(“d”, recPacket[28:28 + bytes])[0]

return “Reply from %s:bytes=%d time=%f5ms TTL=%d” % (destAddr, len(recPacket),(timeReceived – timeSent)*1000, TTL)

timeLeft = timeLeft -howLongInSelect

if timeLeft <=0:

return “Request timedout.”

#FunctionsendOnePing

defsendOnePing(mySocket, destAddr, ID):

# Header is type (8),code (8), checksum (16), id (16), sequence (16)

myChecksum = 0

# Make a dummy headerwith a 0 checksum

# struct — Interpretstrings as packed binary data

header =struct.pack(“bbHHh”, ICMP_ECHO_REQUEST, 0, myChecksum, ID, 1)

data =struct.pack(“d”, time.time())

# Calculate thechecksum on the data and the dummy header.

myChecksum =checksum(header + data)

# Get the rightchecksum, and put in the header

if sys.platform ==’darwin’:

# Convert 16-bitintegers from host to network byte order

myChecksum =htons(myChecksum) & 0xffff

else:

myChecksum =htons(myChecksum)

header =struct.pack(“bbHHh”, ICMP_ECHO_REQUEST, 0, myChecksum, ID, 1)

packet = header +data

mySocket.sendto(packet, (destAddr, 1)) # AF_INET address must betuple, not str

# Both LISTS andTUPLES consist of a number of objects

# which can bereferenced by their position number within the object.

defdoOnePing(destAddr, timeout):

icmp =getprotobyname(“icmp”)

# SOCK_RAW is apowerful socket type. For more details:http://sock-raw.org/papers/sock_raw

mySocket =socket(AF_INET, SOCK_RAW, icmp)

myID = os.getpid()& 0xFFFF # Return the current process i

sendOnePing(mySocket,destAddr, myID)

delay =receiveOnePing(mySocket, myID, timeout, destAddr)

mySocket.close()

return delay

def ping(host,timeout=1):

# timeout=1 means: Ifone second goes by without a reply from the server,

# the client assumesthat either the client’s ping or the server’s pong is lost

dest =gethostbyname(host)

print “Pinging ” +dest + ” using Python:”

print “”

# Send ping requeststo a server separated by approximately one second

while 1 :

delay =doOnePing(dest, timeout)

print delay

time.sleep(1)# onesecond

return delay

ping(“google.com”)

Expert Answer


Answer to Write your own traceroute program. The idea is to make iterated ping requests with increasing TTL values. If the TTL of …

OR