Кодирование и декодирование IP, TCP, UDP, ICMP заоговоков в Asio
В этом примере icmp/ping.cpp при отправке ICMP эхо-запроса кодируется и отправляется только ICMP заголовок, а при получении декодируется сначала IPv4 заголовок, а затем ICMP заголовок. На сколько понял, ICMP очень тесно связан с IP, и по сути является его расширением (поправьте, если не прав). Понятно, что, видимо, Asio берёт на себя формирование IP заголовков. Но сразу возникает пара вопросов:
- Возможно ли формировать IP заголовки самому для
ip::icmp,ip::tcp,ip::udpклассов? - Возможно ли читать IP и, соответственно, TCP и UDP заголовки, используя
ip::tcpиip::udpклассы?
Предположим, я хочу реализовать TCP-пингер, т.к. ICMP не может пинговать порты конкретного устройства, а только само устройство. По идее, мне точно также нужно будет сначала декодировать IP заголовок. Но, имея небольшой опыт в работе с ip::tcp классом, я знаю, что можно отправлять HTTP(S) запросы просто как текстовое сообщение, разделяя заголовки \r\n и заканчивая их \r\n\r\n. Т.е. Asio, в этом случае, берет на себя не только формирование IP заголовка, но и TCP заголовка. Хотя, судя по всему, ICMP заголовок Asio самостоятельно не формирует...
Буду признателен за разъяснение данной неопределенности тем, кто лучше меня разбирается в сетевых технологиях и Boost.Asio. Спасибо.