LINUX.ORG.RU

История изменений

Исправление lesopilorama, (текущая версия) :

Объясните пожалуйста связаны ли описатели(fd) сокета и соединения. И если да то как?

Связаны. В целом, fd - это только «указатель» (число) на какую-то сложную структуру в ядре. Эта структура может представлять файл, соединение, другую хрень.

TCP Соединение - это структура данных внутри ядра linux, точнее в его части называемой «стек TCP». «стек» - это прост куча кода/функций/структур, которые расположены в ядре и делают так, чтобы TCP физически существовало и работало. Стек TCP - это физически такой код на Си, который напрограммировали бородатые программисты, который реализует коннекты, порты, и всё что мы знаем про TCP.

сокет фильтрует пакеты и распределяет их по соединениям

Фильтрует «стек TCP». Когда пакет приходит в сетевуху, драйвер сетевухи просыпается по прерыванию и создаёт в ядре структуру данных, описывающую этот пакет. Эта структура далее обрабатывается ядром в «сетевой подсистеме ядра», которая уже много чего делает: там и всякие фейрволы и понимание кому он пришёл (какому сокету/соединению) или самому ядру. Ядро например на пинги отвечает PONG пакетами само.

В сетевуху пришёл пакет: драйвер сетевухи проснулся, сделал «пакет» структуру данных, отдал ядру. Ядро поняло, что это пакет не какой-то мусорный, а TCP. Далее оно поняло, на какой порт пришёл этот пакет и от какого исходящего IP:PORT. Далее оно поняло, что локальный порт, на который пакет пришёл, был открыт в результате connect() таким-то приложением и это приложение получит эти данные через данный fd.

Наоборот то же самое: приложение записало данные в fd, ядро осознало что это fd указывает на соединение, что соединение живо, что возможность отправки есть (window не исчерпан, congestion control норм и т.п.), формирует пакет TCP и отдаёт драйверу сетевухи.

если соединение отправляет данные через сокет, то откуда система знает что соединение хочет что-то отправить

Система всегда знает что-то потому, что кто-то сделал системный вызов или потому, что произошло прерывание аппаратное или другое. В любом случае, в систему явно «заходят». Кто-то. Или приложение или драйвер сетевухи или таймер какой-то аппаратный. Если приложение пишет данные в сокет, то ядро понимает, что этот сокет (fd) указывает внутри ядра на структуру данных, которая описывает соединение TCP например. Соединение - это структура данных о том, какой IP:PORT с каким другим IP:PORT «соеденины» сейчас и какой там статус переданности потока и прочих настроек. В благоприятном исходе, ядро сформирует TCP пакет и отдаст драйверу сетевухи. Обратно работает похоже, как написано выше.

Каждый раз проходится по всем соединениям?

Нет, обычно используются умные структуры данных, типа хеш-таблиц, деревьев поиска и прочего такого. За фиксрованное число тактов процессора ядро понимает в какую структуру данных смотреть для какого пакета или наоборот: при записи в какой сокет из какого приложения надо кому отправлять какой пакет.

Или там используются таймеры?

Таймеры - они везде используются. Таймер - это обычно физически структура данных типа «heap», она же «двоичная куча». Таймеры везде есть и они полезны просто потому, чтобы закрывать забытые соединения, абоненты по которым давно померли, например (keep-alive пакеты в TCP например можно погуглить).

Исправление lesopilorama, :

Объясните пожалуйста связаны ли описатели(fd) сокета и соединения. И если да то как?

Связаны. В целом, fd - это только «указатель» (число) на какую-то сложную структуру в ядре. Эта структура может представлять файл, соединение, другую хрень.

TCP Соединение - это структура данных внутри ядра linux, точнее в его части называемой «стек TCP». «стек» - это прост куча кода/функций/структур, которые расположены в ядре и делают так, чтобы TCP физически существовало и работало. Стек TCP - это физически такой код на Си, который напрограммировали бородатые программисты, который реализует коннекты, порты, и всё что мы знаем про TCP.

сокет фильтрует пакеты и распределяет их по соединениям

Фильтрует «стек TCP». Когда пакет приходит в сетевуху, драйвер сетевухи просыпается по прерыванию и создаёт в ядре структуру данных, описывающую этот пакет. Эта структура далее обрабатывается ядром в «сетевой подсистеме ядра», которая уже много чего делает: там и всякие фейрволы и понимание кому он пришёл (какому сокету/соединению) или самому ядру. Ядро например на пинги отвечает PONG пакетами само.

В сетевуху пришёл пакет: драйвер сетевухи проснулся, сделал «пакет» структуру данных, отдал ядру. Ядро поняло, что это пакет не какой-то мусорный, а TCP. Далее оно поняло, на какой порт пришёл этот пакет и от какого исходящего IP:PORT. Далее оно поняло, что локальный порт, на который пакет пришёл, был открыт в результате connect() таким-то приложением и это приложение получит эти данные через данный fd.

Наоборот то же самое: приложение записало данные в fd, ядро осознало что это fd указывает на соединение, что соединение живо, что возможность отправки есть (window не исчерпан, congestion control норм и т.п.), формирует пакет TCP и отдаёт драйверу сетевухи.

если соединение отправляет данные через сокет, то откуда система знает что соединение хочет что-то отправить

Если приложение пишет данные в сокет, то ядро понимает, что этот сокет (fd) указывает внутри ядра на структуру данных, которая описывает соединение TCP например. Соединение - это структура данных о том, какой IP:PORT с каким другим IP:PORT «соеденины» сейчас и какой там статус переданности потока и прочих настроек. В благоприятном исходе, ядро сформирует TCP пакет и отдаст драйверу сетевухи. Обратно работает похоже, как написано выше.

Каждый раз проходится по всем соединениям?

Нет, обычно используются умные структуры данных, типа хеш-таблиц, деревьев поиска и прочего такого. За фиксрованное число тактов процессора ядро понимает в какую структуру данных смотреть для какого пакета или наоборот: при записи в какой сокет из какого приложения надо кому отправлять какой пакет.

Или там используются таймеры?

Таймеры - они везде используются. Таймер - это обычно физически структура данных типа «heap», она же «двоичная куча». Таймеры везде есть и они полезны просто потому, чтобы закрывать забытые соединения, абоненты по которым давно померли, например (keep-alive пакеты в TCP например можно погуглить).

Исправление lesopilorama, :

Объясните пожалуйста связаны ли описатели(fd) сокета и соединения. И если да то как?

Связаны. В целом, fd - это только «указатель» (число) на какую-то сложную структуру в ядре. Эта структура может представлять файл, соединение, другую хрень.

TCP Соединение - это структура данных внутри ядра linux, точнее в его части называемой «стек TCP». «стек» - это прост куча кода/функций/структур, которые расположены в ядре и делают так, чтобы TCP физически существовало и работало. Стек TCP - это физически такой код на Си, который напрограммировали бородатые программисты, который реализует коннекты, порты, и всё что мы знаем про TCP.

сокет фильтрует пакеты и распределяет их по соединениям

Фильтрует «стек TCP». Когда пакет приходит в сетевуху, драйвер сетевухи просыпается по прерыванию и создаёт в ядре структуру данных, описывающую этот пакет. Эта структура далее обрабатывается ядром в «сетевой подсистеме ядра», которая уже много чего делает: там и всякие фейрволы и понимание кому он пришёл (какому сокету/соединению) или самому ядру. Ядро например на пинги отвечает PONG пакетами само.

В сетевуху пришёл пакет: драйвер сетевухи проснулся, сделал «пакет» структуру данных, отдал ядру. Ядро поняло, что это пакет не какой-то мусорный, а TCP. Далее оно поняло, на какой порт пришёл этот пакет и от какого исходящего IP:PORT. Далее оно поняло, что локальный порт, на который пакет пришёл, был открыт в результате connect() таким-то приложением и это приложение получит эти данные через данный fd.

если соединение отправляет данные через сокет, то откуда система знает что соединение хочет что-то отправить

Если приложение пишет данные в сокет, то ядро понимает, что этот сокет (fd) указывает внутри ядра на структуру данных, которая описывает соединение TCP например. Соединение - это структура данных о том, какой IP:PORT с каким другим IP:PORT «соеденины» сейчас и какой там статус переданности потока и прочих настроек. В благоприятном исходе, ядро сформирует TCP пакет и отдаст драйверу сетевухи. Обратно работает похоже, как написано выше.

Каждый раз проходится по всем соединениям?

Нет, обычно используются умные структуры данных, типа хеш-таблиц, деревьев поиска и прочего такого. За фиксрованное число тактов процессора ядро понимает в какую структуру данных смотреть для какого пакета или наоборот: при записи в какой сокет из какого приложения надо кому отправлять какой пакет.

Или там используются таймеры?

Таймеры - они везде используются. Таймер - это обычно физически структура данных типа «heap», она же «двоичная куча». Таймеры везде есть и они полезны просто потому, чтобы закрывать забытые соединения, абоненты по которым давно померли, например (keep-alive пакеты в TCP например можно погуглить).

Исправление lesopilorama, :

Объясните пожалуйста связаны ли описатели(fd) сокета и соединения. И если да то как?

Связаны. В целом, fd - это только «указатель» (число) на какую-то сложную структуру в ядре. Эта структура может представлять файл, соединение, другую хрень.

TCP Соединение - это структура данных внутри ядра linux, точнее в его части называемой «стек TCP». «стек» - это прост куча кода/функций/структур, которые расположены в ядре и делают так, чтобы TCP физически существовало и работало. Стек TCP - это физически такой код на Си, который напрограммировали бородатые программисты, который реализует коннекты, порты, и всё что мы знаем про TCP.

сокет фильтрует пакеты и распределяет их по соединениям

Фильтрует «стек TCP». Когда пакет приходит в сетевуху, драйвер сетевухи просыпается по прерыванию и создаёт в ядре структуру данных, описывающую этот пакет. Эта структура далее обрабатывается ядром в «сетевой подсистеме ядра», которая уже много чего делает: там и всякие фейрволы и понимание кому он пришёл (какому сокету/соединению) или самому ядру. Ядро например на пинги отвечает PONG пакетами само.

если соединение отправляет данные через сокет, то откуда система знает что соединение хочет что-то отправить

Если приложение пишет данные в сокет, то ядро понимает, что этот сокет (fd) указывает внутри ядра на структуру данных, которая описывает соединение TCP например. Соединение - это структура данных о том, какой IP:PORT с каким другим IP:PORT «соеденины» сейчас и какой там статус переданности потока и прочих настроек. В благоприятном исходе, ядро сформирует TCP пакет и отдаст драйверу сетевухи. Обратно работает похоже, как написано выше.

Каждый раз проходится по всем соединениям?

Нет, обычно используются умные структуры данных, типа хеш-таблиц, деревьев поиска и прочего такого. За фиксрованное число тактов процессора ядро понимает в какую структуру данных смотреть для какого пакета или наоборот: при записи в какой сокет из какого приложения надо кому отправлять какой пакет.

Или там используются таймеры?

Таймеры - они везде используются. Таймер - это обычно физически структура данных типа «heap», она же «двоичная куча». Таймеры везде есть и они полезны просто потому, чтобы закрывать забытые соединения, абоненты по которым давно померли, например (keep-alive пакеты в TCP например можно погуглить).

Исходная версия lesopilorama, :

Объясните пожалуйста связаны ли описатели(fd) сокета и соединения. И если да то как?

Связаны. В целом, fd - это только «указатель» (число) на какую-то сложную структуру в ядре. Эта структура может представлять файл, соединение, другую хрень.

TCP Соединение - это структура данных внутри ядра linux, точнее в его части называемой «стек TCP». «стек» - это прост куча кода/функций/структур, которые расположены в ядре и отвечают за работу с тем, чтобы TCP физически существовало и работало.

сокет фильтрует пакеты и распределяет их по соединениям

Фильтрует «стек TCP». Когда пакет приходит в сетевуху, драйвер сетевухи просыпается по прерыванию и создаёт в ядре структуру данных, описывающую этот пакет. Эта структура далее обрабатывается ядром в «сетевой подсистеме ядра», которая уже много чего делает: там и всякие фейрволы и понимание кому он пришёл (какому сокету/соединению) или самому ядру. Ядро например на пинги отвечает PONG пакетами само.

если соединение отправляет данные через сокет, то откуда система знает что соединение хочет что-то отправить

Если приложение пишет данные в сокет, то ядро понимает, что этот сокет (fd) указывает внутри ядра на структуру данных, которая описывает соединение TCP например. Соединение - это структура данных о том, какой IP:PORT с каким другим IP:PORT «соеденины» сейчас и какой там статус переданности потока и прочих настроек. В благоприятном исходе, ядро сформирует TCP пакет и отдаст драйверу сетевухи. Обратно работает похоже, как написано выше.

Каждый раз проходится по всем соединениям?

Нет, обычно используются умные структуры данных, типа хеш-таблиц, деревьев поиска и прочего такого. За фиксрованное число тактов процессора ядро понимает в какую структуру данных смотреть для какого пакета или наоборот: при записи в какой сокет из какого приложения надо кому отправлять какой пакет.

Или там используются таймеры?

Таймеры - они везде используются. Таймер - это обычно физически структура данных типа «heap», она же «двоичная куча». Таймеры везде есть и они полезны просто потому, чтобы закрывать забытые соединения, абоненты по которым давно померли, например (keep-alive пакеты в TCP например можно погуглить).