(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