Я создаю инструмент traceroute-ish, чтобы определить количество перелетов, необходимых для UDP-пакета, для достижения адреса, используя только один зонд. Для этого я хочу извлечь TTL из сообщения ICMP, которое я получаю после отправки зонда. Я делаю следующее и успешный прием сообщения ICMP:Прочитайте TTL из сообщения ICMP, полученного через исходные сокеты Python
data, source = in_socket.recvfrom(d_bufsize)
Но я понятия не имею, как превратить data
в то, что я могу читать TTL с. in_socket
объявлен как это:
in_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp_proto)
Здесь icmp_proto
только номер протокола для протокола ICMP (полученный, делая icmp_proto = socket.getprotobyname("icmp")
).
Любая помощь была бы высоко оценена!
TTL находится в заголовке IP, а не в ICMP. Поэтому, если это не возвращает весь IP-пакет, вы не сможете этого сделать. – Barmar
@Barmar: Фокус в том, что сообщение ICMP содержит часть дейтаграммы, которая вызвала ошибку. Таким образом, отправляя дейтаграмму с известным TTL, а затем используя включенную часть дейтаграммы с ошибкой, чтобы определить ее TTL по прибытии, вы сможете определить количество перелетов. – hexaflexagonal
О, я думал, что вы говорите о TTL полученной дейтаграммы, а не TTL отправленной дейтаграммы, вызвавшей ICMP. – Barmar