LINUX.ORG.RU

[СИ - Kernel] Отправка данных веб сервером.


0

0

Не могу понять, как отправляются данные веб сервером? например Apache .

Вот например. Работает у меня сервер, и производится к нему запрос, например открыть index.html . Сервер обрабатывает запрос, и отсылает клиенту страницу. С it's work !!! . А как он их отправляет?? создаёт новый сокет для каждого клиента? или существует только один сокет в котором изменяют ip и порт назначения и отправляют данные?. Все отправляемые данные видны, скажем через начальные функции сетевого стека: сетевого и транспортных уровней. А где всё начинается? где происходит самая начальная отправка данных веб сервером? Думал что с помощью функции «sock_sendmsg» а нет, ( .. при отправке данных клиенту, она вообще не вызывается.(вызывается только тогда, когда я сам, через браузер открываю инет страничку)

Deleted

Отправляется примерно так (псевдокод):

s1 = socket()
bind(s1, *, 80)
while (true) {
s2 = accept(s1)
write(s2, «200 OK\r\n», strlen(«200 OK\r\n»));
//..тут еще заголовки HTTP
write(s2, «It's working!», strlen(«It's working!»));
close(s2);
}
close(s1);

А как он их отправляет??


В простейшем случае - системным вызовом write. Но также может и другими вызовами (send, writev).

создаёт новый сокет для каждого клиента? или существует только один сокет в котором изменяют ip и порт назначения и отправляют данные?


Если подключено N клиентов, то открыто N+1 сокетов: один сокет принимает соединения, и по одному сокету на клиент. У каждого из сокетов - разный порт.

dmitry_vk ★★★
()

man listen
man accept

все хорошо расписано.

nu11 ★★★★★
()

А как он их отправляет?? создаёт новый сокет для каждого клиента?

Apache создаёт не то что новый сокет (точнее надо говорить TCP/IP сокет) для каждого клиента, но и целый трэд для обработки соединения с ним - чтение/запись на сокете в данном трэде не зависит от других клиентов и может быть сколь угодно сложны, например можно обработать запрос с параметрами, подключится к БД, динамически сформировать ответ. Остальные клиенты тем временем будут обрабатываться в других тредах (и на других сокетах).

В таких серверах как nginx всё несколько сложнее - обработка клиентов проходит в рамках фиксированного количества потоков. Но сокет в любом случае открывается для каждого из них.

А где всё начинается? где происходит самая начальная отправка данных веб сервером?

Начни читать Стивенсона «Программирование сетевых приложений в Unix» - про тройное рукопожатие, пакеты и т.д. :)

quasimoto ★★★★
()
Ответ на: комментарий от dmitry_vk

nu11 Посмотрел, и не понял что там должен был увидеть.

dmitry_vk А где начинается обработка передачи данных в сокеты в ядре?

Deleted
()
Ответ на: комментарий от quasimoto

Не в обиду) «Начни читать Стивенсона „Программирование сетевых приложений в Unix“ - про тройное рукопожатие, пакеты и т.д. :) » Рассмешил. Такое ощущение, что мой вопрос не понятен.

Меня интересует конкретно, через какую функцию ядра проходят данные - ответы веб сервера, клиенту! (как я и говорил «Все отправляемые данные видны, скажем через начальные функции сетевого стека: сетевого и транспортных уровней. А где всё начинается? где происходит самая начальная отправка данных веб сервером? Думал что с помощью функции „sock_sendmsg“ а нет,»)

Deleted
()
Ответ на: комментарий от Deleted

Твой вопрос «Не могу понять, как отправляются данные веб сервером?» выглядит очень общо.

Нет никакой «самой начальной отправки данных» есть сложный обмен пакетами по протоколу TCP/IP этапы и диаграмы состояний которого ты можешь найти в упомянутой книге. Так ещё в начеле настройки, при socket/bind/listen/accept/connect происходит обмен пакетами SYN и ACK.

Конкретно данные пишутся с помощью вызовов read/write.

Если вопрос о том как в ядре реализованы read/write для TCP/IP сокетов - то так и надо было спрашивать. Тогда я скромно удаляюсь :)

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Кароче так. Как мы все знаем, в сокеты можно писать как угодно, что угодно, когда угодно. Например используем sys_sendto..(идут различные действия).в конце концов функция sock_sendmsg использует sock->ops->sendmsg. Так вот! при отправке данных клиенту, sock_sendmsg НЕ ЗАДЕЙСТВУЕТСЯ...значит сервер использует не sock_sendmsg(которая задействуется через sys_sendto) а что-то другое, что в конце концов приводит к поступлению данных в tcp_sendmsg. Так вот, все методы записи данных в сокет, приходят к одному..tcp_sendmsg .. Тоесть на обработку транспортному уровню, что кстати есть хорошо. А мне нужно понять и найти, какаяже эта замечательная функция ядра используется при передачи данных из пользовательского пространства в ядро,а точнeе в любой сокет!!! любым методом доступа к сокету (sys_sendto, write и тд)

Deleted
()
Ответ на: комментарий от Deleted

>Посмотрел, и не понял что там должен был увидеть.

как минимум ответ на вопрос «А как он их отправляет?? создаёт новый сокет для каждого клиента?» в описании функции accept.

nu11 ★★★★★
()
Ответ на: комментарий от Deleted

мануал тот, кажись, устарел:

$ readelf -a vmlinux.o | grep sock_write
nothing

$ readelf -a vmlinux.o | grep sock.*write
15834: 00225d40   332 FUNC    LOCAL  DEFAULT    1 sock_aio_write

$ grep -rn "sock_.*write" net/socket.c
102:static ssize_t sock_aio_write(struct kiocb *iocb, const struct iovec *iov,
130:	.aio_write =	sock_aio_write,
809:static ssize_t do_sock_write(struct msghdr *msg, struct kiocb *iocb,
833:static ssize_t sock_aio_write(struct kiocb *iocb, const struct iovec *iov,
845:	return do_sock_write(&x->async_msg, iocb, iocb->ki_filp, iov, nr_segs);
quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Да это я сразу заметил. Сейчас буду перехватчик на do_sock_write ставить.Чуть позже отпишу о результатах.

Deleted
()
Ответ на: комментарий от Deleted

> Да это я сразу заметил. Сейчас буду перехватчик на do_sock_write ставить.Чуть позже отпишу о результатах.

Зачем это тебе всё нужно, если не секрет?

shelA
()
Ответ на: комментарий от shelA

На do_sock_write не удалось поставить перехватчик. ((... ищу другие варианты...

«Зачем это тебе всё нужно, если не секрет?» Я делаю ПО «ядерное» для мониторинга сети, сетевых соединений, фаервол рассчитанный на фильтрацию вне iptables, а также мониторинг передаваемых данных и их фильтрацию.

Deleted
()
Ответ на: комментарий от Pantserovik

Хм..это есть в мануалах? дайка хотябы один... посмотрю, есть ли там то что нужно (в чём я, ой как сомневаюсь)

Deleted
()
Ответ на: комментарий от Pantserovik

писец..ей богу. хватит косить под дауна. Давайте будем ценить время друг друга, хорошо? мне некогда читать подобные посты.

Жду адекватных предложений решения описанной мной проблемы (хоть сейчас один способ сам придумал, думаю он сработает. Но если у кого-то есть адекватные мысли , как получить доступ к пересылаемым данным через СОКЕТЫ (да да..данные можно не только через сокеты пересылать) при условии что этот перехват(да да..именно перехват, т.к. по другому нигде доступ не получить) выполняется в ядре! и до первого перехватчика iptables).

Deleted
()
Ответ на: комментарий от Deleted

featureless, strace и ptrace позволяют получить увидеть все сделанные системные вызовы процесса.

dmitry_vk ★★★
()

>или существует только один сокет в котором изменяют ip и порт назначения и отправляют данные?.
с какой стати ему надо менять ip?
у тебя полная каша в голове. не выдумывай лишних сущностей. просто почитай нормальные книжки.

с каждым сокетом ассоциированы 2 ip-адреса: отправителя и получателя, и по одному порту на каждого, соответственно.

xydo ★★
()
Ответ на: комментарий от Deleted

>Но если у кого-то есть адекватные мысли , как получить доступ к пересылаемым данным через СОКЕТЫ (да да..данные можно не только через сокеты пересылать) при условии что этот перехват(да да..именно перехват, т.к. по другому нигде доступ не получить) выполняется в ядре! и до первого перехватчика iptables).

ты сам для начала заадекваться в плане работы сокетов в userspace.
потом уже лезь в ядро.
[хакеров развелось...]


Я делаю ПО «ядерное»

извини, но это просто 3.14здец.

для мониторинга сети, сетевых соединений, фаервол рассчитанный на фильтрацию вне iptables, а также мониторинг передаваемых данных и их фильтрацию.

mv * >/dev/null

xydo ★★
()
Ответ на: комментарий от Deleted

>А мне нужно понять и найти, какаяже эта замечательная функция ядра используется при передачи данных из пользовательского пространства в ядро,а точнeе в любой сокет!!! любым методом доступа к сокету (sys_sendto, write и тд)
тебе для начала надо понять, что ты хочешь... ибо эта фраза вообще какой-то бред сумасшедшего.

<trollmode>

при передачи данных из пользовательского пространства в ядро

copy_to_user

из пользовательского пространства в любой сокет

send

любым методом доступа к сокету

send, sendto, sendmsg, write
</trollmode>

xydo ★★
()
Ответ на: комментарий от xydo

Мне уже надоели посты, людей вашего уровня. Особенно с вашим trollmode ... хоть про copy_to_user более-менее верно, но в данном случаи это мне не подходит.

Deleted
()
Ответ на: комментарий от PaulKaz

Спасибо за совет. Но к сожалению tcpdump просто регистрирует свой обработчик как прослойку в списке PTYPE_ALL и получает все пакеты (после прохода всех фильтров iptables). Служит только для мониторинга содержимого пакета (тоесть пакетик передаётся функциям зарегистрированным в PTYPE_BASE и его копия в PTYPE_ALL , если получить к нему доступ из PTYPE_ALL и уничтожить skb, то это не вызовет нужного эффекта, а уничтожит только копию буфера сокета). Исходники не смотрел, это всё из личного опыта. То что написал сверху,эт просто так, на всякий случай, может кому-то пригодится информация.

tcpdump - Роботает всёже на достаточно низком уровне...мне нужно чтото повыше, даже выше работы нет фильтра.

Deleted
()

net/core/sock.c

Там все написано. Читай внимательно ))

vasily_pupkin ★★★★★
()

А вообще, есть такая книжка, Understanding Linux Network Internals

vasily_pupkin ★★★★★
()
Ответ на: комментарий от Deleted

> Я делаю ПО «ядерное» для мониторинга сети, сетевых соединений, фаервол рассчитанный на фильтрацию вне iptables, а также мониторинг передаваемых данных и их фильтрацию.

Студент штоле? Впихни свой убер монитор так же, как впихнут netfilter

vasily_pupkin ★★★★★
()
Ответ на: комментарий от Deleted

так изъясняйся, блин, по-русски!! тогда и никаких тролл-моде не будет.

xydo ★★
()
Ответ на: комментарий от vasily_pupkin

Хороший совет. Яб так с радостью и сделал бы. Но куда именно впихнуть??? Сейчас упомяну ещё об одном, очень важном условии. Т.К. писал, что надо получить доступ к данным до iptables. Нужно поставить перехватчик , так что-бы можно было модифицировать исходящие данные (при поступлении данных в сокет).

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

Теперь если продолжить идею с веб сервером, то если учесть вышесказанное в этой теме, то сокет создаётся для каждого клиента. так? делаю проверку, ....оказывается «вроде бы так»... При открытии страницы пользователем, sock_create получает управление и создаёт сокет.. (ура).. но при такой проверке в коде перехватчике sock_create if(family == AF_INET && type == SOCK_STREAM && protocol == IPPROTO_TCP ) printk(«устанавливается соединение\n»); не выводится сообщение printk(«устанавливается соединение\n»); ... так как не выполняется успловие protocol == IPPROTO_TCP ........... вопрос почему???

Вообще, мне бы хотелось порассуждать, как можно получать доступ (для модификации) к данным передаваемым по сети.

Deleted
()

Как один товарищ из авиаинститута говорил «Всё понимаю, форма крыла, разность давлений, подъёмная сила, а как самолёт летает и не падает — не понимаю»

thesame ★★★★
()
Ответ на: комментарий от vasily_pupkin

Она есть на русском? Я кстати изучал достаточно хорошо информацию из «Linux сетевая архитектура» . Если в Understanding Linux Network Internals больше информации, и если она есть на русском, то с удовольствием почитаю.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.