Необработанный сокет: передаются ли TCP-пакеты в необработанный сокет? - PullRequest
8 голосов
/ 29 марта 2011

Согласно Unix Network Programming Vol1, «полученные UDP-пакеты и принятые TCP-пакеты никогда не передаются в необработанный сокет. Если процесс хочет прочитать IP-дейтаграммы, содержащие UDP или TCP-пакеты, пакеты должны быть прочитаны на уровне канала передачи данных» ...

Но вопреки этому, существует опция протокола IPPROTO_TCP при создании необработанных сокетов, которая, как мне кажется, служит именно этой цели. Может ли кто-нибудь указать на ошибки, которые я мог бы допустить, чтобы понять это?

1 Ответ

10 голосов
/ 29 марта 2011

Когда вы создаете необработанный сокет, вы можете указать, к какому протоколу привязываться, UDP, TCP или ICMP, используя параметры протокола IPPROTO_TCP и т. Д. Однако этот параметр определяет только тип сокета, который вы открываете, и, следовательно, какие данные, полученные на этом порту, будут перенаправлены в ваше приложение. Поэтому если вы установите IPPROTO_TCP и откроете необработанный сокет на порту 5000, ваше приложение будет получать необработанные TCP-пакеты, отправленные на порт 5000, но не необработанные UDP-пакеты, отправленные на порт 5000.

Даже если пакеты гарантированно являются TCP, сокет не будет выполнять обычную обработку TCP (syn, ack, reordering и т. Д.), Вы просто получаете необработанные IP-пакеты с порцией двоичных данных, представляющих TCP заголовки. В обычном сокете TCP данные, которые вы получаете, являются данными, встроенными в заголовки TCP. В сокете Raw TCP данные все еще встроены в заголовки канального уровня, поэтому вы увидите заголовок IP, затем заголовок TCP и данные полезной нагрузки для каждого полученного пакета.

Для получения дополнительной информации, ознакомьтесь с этим руководством:

Краткое руководство по программированию на C для необработанных сокетов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...