Как получить TTL входящих пакетов при использовании C# - PullRequest
0 голосов
/ 03 февраля 2020

Примечание. Я предпочитаю решать эту проблему, используя UDPClient, но классы Berkley Socket также будут работать.

Вопрос: Я всюду искал, как читать "TTL" входящих пакетов, но я нигде не могу его найти. Я знаю, что

Socket s = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
s.Ttl; 

позволяет мне получить или установить Ttl для исходящих пакетов, но я хочу прочитать значение ttl для входящих пакетов. Мне тяжело разбирать что-либо за пределами порции данных входящих пакетов, но моя цель - включить logi c и в конечном итоге записать целые пакеты, содержащие заголовки UDP и IP и все. Что я тут недопонимаю?

1 Ответ

1 голос
/ 04 февраля 2020

TTL применяется на уровне IP. UDP не имеет TTL. К тому времени, когда полезная нагрузка пакета передается в UDPClient (или даже в сокет UDP), информация TTL исчезает и, к сожалению, не сохраняется в сокете.

Ни сокет UDP, ни TCP не видят этого. Вам потребуется использовать сокет RAW, в котором весь заголовок IP включен в socket.Read (), а затем обработать пакет и извлечь TTL.

Чтение TTL пакетов TCP на уровне сокетов с помощью RAW Сокеты были бы невозможной (чрезвычайно сложной) задачей, так как вам нужно было бы написать свой собственный стек TCP. Если вы хотите «отслеживать» TCP TTL, который может различаться для частей сообщения, вам лучше использовать WFP или PCAP .

Вот хорошая ссылка о том, как сделать RAW Socket UDP в c#

...