|
@@ -4,11 +4,55 @@ import socket
|
|
|
import struct
|
|
|
import sys
|
|
|
|
|
|
+"""
|
|
|
+Структура IP пакета:
|
|
|
+Заголовок состоит из 5 слов (каждое слово 32 бита)
|
|
|
+
|
|
|
+Слово 1 (слева направо):
|
|
|
+
|
|
|
+ Version (4 бита) - версия IP протоколо, в IPv4 = 4
|
|
|
+ Header size (IHL) (4 бита) - размер заголовка в словах
|
|
|
+ Type of service (8 бит) состоит из полей:
|
|
|
+ DSCP (6 бит) разделяет трафик на классы обслуживания
|
|
|
+ ECN (2 бита) указатель перегрузки
|
|
|
+ Total lenght (16 бит) - полный размер IP пакета (заголовок + данные)
|
|
|
+
|
|
|
+Слово 2
|
|
|
+
|
|
|
+ ID (16 бит) - используется для сборки фрагментированных пакетов
|
|
|
+ Flags (3 бита) - используюся для фрагментации пакетов
|
|
|
+ Fragment Offset (13 бит) - поле смещения фрагмента
|
|
|
+
|
|
|
+Слово 3
|
|
|
+ TTL - time to live (8 бит) - время жизни пакета (число транзитных узлов
|
|
|
+ которое может пройти пакет перед тем как будет уничтожен). Если пришел
|
|
|
+ пакет с ttl=1, то такой пакет не будет передан следующему узлу. Но если
|
|
|
+ пакет пришел получателю, то такой пакет будет обработан.
|
|
|
+ Protocol (8 бит) - код протокола, помещенного в IP пакет
|
|
|
+ Header Checksum (16 бит) - контрольная сумма заголовка (меняется от
|
|
|
+ узла к узлу, т.к. меняется TTL). Пакеты с неверной CRC отбрасываются.
|
|
|
+
|
|
|
+Слово 4
|
|
|
+ Source address (32 бита) - IP-адрес отпровителя
|
|
|
+
|
|
|
+Слово 5
|
|
|
+ Distination address (32 бита) - IP-адрес назначения
|
|
|
+
|
|
|
+Поле данных.
|
|
|
+
|
|
|
+Таким образом, максимальная длика IP макета 65535, а максимальная длина поля
|
|
|
+данных 65515. 20 байт уходит на заголовок.
|
|
|
+
|
|
|
+
|
|
|
+"""
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
class IP:
|
|
|
def __init__(self, buff):
|
|
|
header = struct.unpack('<BBHHHBBH4s4s', buff)
|
|
|
- self.ver = header[0] >> 4
|
|
|
+ self.ver = header[0] >> 4
|
|
|
self.ihl = header[0] & 0xF
|
|
|
|
|
|
self.tos = header[1]
|
|
@@ -34,6 +78,7 @@ class IP:
|
|
|
self.protocol = str(self.protocol_num)
|
|
|
|
|
|
|
|
|
+
|
|
|
def sniff(host):
|
|
|
|
|
|
if os.name == 'nt':
|