Сообщение Re[2]: Почему сокету нельзя сделать bind() к двум портам? от 04.06.2015 11:25
Изменено 04.06.2015 11:46 PlushBeaver
Здравствуйте, smeeld, Вы писали:
S> если разные dport будут соответствовать одному
S> и тому же сокету то что будет если в системе появится второй сокет с таким же dport+daddr? Как определить
S> здесь к какому из двух сокетов направлен пакет с данным daddr?
Речь о другом ограничении: что по двум разным ключам (daddr, dport) нельзя держать одинаковые значения (указатели на одну и ту же структуру). Но даже если с SO_REUSEADDR появятся другие сокеты на том же (daddr, dport), сработает round-robin, о которой вы говорите с netch80, чему помешают одинаковые значения, не ключи?
Я совсем не знаю механизмов ядра, и могу ошибаться, но как понял фрагмент, на который вы дали
Но даже если так — получается, причина запрета только в реализации, и с точки зрения логики работы сетевого стека препятствий нет?
S> если разные dport будут соответствовать одному
S> и тому же сокету то что будет если в системе появится второй сокет с таким же dport+daddr? Как определить
S> здесь к какому из двух сокетов направлен пакет с данным daddr?
Речь о другом ограничении: что по двум разным ключам (daddr, dport) нельзя держать одинаковые значения (указатели на одну и ту же структуру). Но даже если с SO_REUSEADDR появятся другие сокеты на том же (daddr, dport), сработает round-robin, о которой вы говорите с netch80, чему помешают одинаковые значения, не ключи?
Я совсем не знаю механизмов ядра, и могу ошибаться, но как понял фрагмент, на который вы дали
Автор: smeeld
Дата: 04.06.15
ссылку, round-robin организуется изменением поля sk_refcnt той структуры-сокета, которую выбрали при очередном поиске. Раз сокет один, это подвинуло бы его во всех круговых очередях, где он участвует. Тогда был бы такой проблемный сценарий (полужирным отмечено, кому достается пакет):Дата: 04.06.15
| Куда приходит пакет | Очередь e1 | Очередь e2 |
|---|---|---|
| e1 | s1,s3 | s2,s3 |
| e2 | s3,s1 | s3,s2 |
| e1 | s1,s3 | s2,s3 |
| e2 | s3,s1 | s3,s2 |
| e1 | s1,s3 | s2,s3 |
Re[2]: Почему сокету нельзя сделать bind() к двум портам?
Здравствуйте, smeeld, Вы писали:
S> если разные dport будут соответствовать одному
S> и тому же сокету то что будет если в системе появится второй сокет с таким же dport+daddr? Как определить
S> здесь к какому из двух сокетов направлен пакет с данным daddr?
Речь о другом ограничении: что по двум разным ключам (daddr, dport) нельзя держать одинаковые значения (указатели на одну и ту же структуру). Но даже если с SO_REUSEADDR появятся другие сокеты на том же (daddr, dport), сработает round-robin, о которой вы говорите с netch80, чему помешают одинаковые значения, не ключи?
Я совсем не знаю механизмов ядра, и могу ошибаться, но как понял фрагмент, на который вы дали
Правка, забыто: Пусть сокет s1 привязан к e1, s2 привязан к e2, s3 привязан к e1 и e2 (чего сейчас нельзя).
Но даже если так — получается, причина запрета только в реализации, и с точки зрения логики работы сетевого стека препятствий нет?
S> если разные dport будут соответствовать одному
S> и тому же сокету то что будет если в системе появится второй сокет с таким же dport+daddr? Как определить
S> здесь к какому из двух сокетов направлен пакет с данным daddr?
Речь о другом ограничении: что по двум разным ключам (daddr, dport) нельзя держать одинаковые значения (указатели на одну и ту же структуру). Но даже если с SO_REUSEADDR появятся другие сокеты на том же (daddr, dport), сработает round-robin, о которой вы говорите с netch80, чему помешают одинаковые значения, не ключи?
Я совсем не знаю механизмов ядра, и могу ошибаться, но как понял фрагмент, на который вы дали
Автор: smeeld
Дата: 04.06.15
ссылку, round-robin организуется изменением поля sk_refcnt той структуры-сокета, которую выбрали при очередном поиске. Раз сокет один, это подвинуло бы его во всех круговых очередях, где он участвует. Тогда был бы такой проблемный сценарий (полужирным отмечено, кому достается пакет):Дата: 04.06.15
Правка, забыто: Пусть сокет s1 привязан к e1, s2 привязан к e2, s3 привязан к e1 и e2 (чего сейчас нельзя).
| Куда приходит пакет | Очередь e1 | Очередь e2 |
|---|---|---|
| e1 | s1,s3 | s2,s3 |
| e2 | s3,s1 | s3,s2 |
| e1 | s1,s3 | s2,s3 |
| e2 | s3,s1 | s3,s2 |
| e1 | s1,s3 | s2,s3 |