Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Как работает сеть (сокеты, каналы, приложения)?

Сообщения:  [1-10]    [11-20]  [21-26] 

 
 автор: cheops   (19.11.2011 в 16:22)   письмо автору
 
   для: dump   (19.11.2011 в 08:46)
 

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

  Ответить  
 
 автор: dump   (19.11.2011 в 08:46)   письмо автору
 
   для: cheops   (16.11.2011 в 13:00)
 

В спецификации TCP написано, что "флаг PSH инструктирует получателя протолкнуть данные, накопившиеся в приемном буфере, в приложение пользователя". Это означает, что если получен tcp-пакет с флагом PSH будут переданы из приёмного буфера tcp-модуля операционной системы в сокет пользовательского процесса, т.е. в адресное пространство процесса?Иными словами данные tcp-пакетов сначала накапливаються в приёмном буфере tcp-модуля, которое находиться в адресном пространстве ядра операционной системы, а уже затем передаються в сокет, т.е. в адресное пространство пользовательского процесса? То же самое касаеться и флага RST, он передаёт команду на очистку буфера tcp-модуля или сокета?

  Ответить  
 
 автор: cheops   (16.11.2011 в 13:00)   письмо автору
 
   для: dump   (16.11.2011 в 12:53)
 

Сокет - это не безразмерная, безответная корзина, в которую сыпятся данные, а она пыжиться их поглотить (хотя в случае PHP образ близок к описываемому). Это довольно сложная библиотека, если буфер заполнен до отказа, сокет просто не будет посылать сетевые команды, чтобы другая сторона ему больше ничего не присылала и рвать соединение он не будет, пока такой команды не поступит (на C вы сами будете решать, что делать, PHP решит за вас - будет увеличивать память, пока она не закончится). Однако, если приложение будет думать слишком долго, то соединение разорвет противоположная сторона по тайм-ауту.

  Ответить  
 
 автор: dump   (16.11.2011 в 12:53)   письмо автору
 
   для: cheops   (16.11.2011 в 12:23)
 

А если наоборот при записи в сокет(или любой другой тип файла) - слишком больших объёмов данных вызывающих переполнение буфера сокета - система вернёт ошибку(как на C так и на php)? И можно ли считать данные, но не удалить их из сокета? И если буфер чтения всё-таки переполнен, то в этом случае tcp-служба системы разорвёт соединение? Если разорвёться соединение, то в некоторых случаях может пойти на смарку результаты скачивания(например в случае скачивания файла по http-протоколу, без поддержки докачки)...

  Ответить  
 
 автор: cheops   (16.11.2011 в 12:23)   письмо автору
 
   для: dump   (16.11.2011 в 09:57)
 

Да при чтении информации из буфера, она из него удаляется. Буфер будет держать данные до тех пор пока вы из него их не заберете, при этом данные которые пришли первыми удаляться не будут - просто не будут приниматься новые данные. Однако, этого практически никогда не случается, так как сеть работает много медленнее компьютера.

  Ответить  
 
 автор: dump   (16.11.2011 в 09:57)   письмо автору
 
   для: cheops   (15.11.2011 в 17:37)
 

А после вызова socket_read ($socket, 1024) в php происходит считывание запрошенных 1024-байт, затем удаление этих 1024 байт из сокета для освобождения памяти? Насколько я понял, в C есть возможность удалить считанную информацию из сокета, а в php нету...При этом если в C не удалять считанные данные из сокета сразу после считывания, то буфер сокета переполниться, и "лишняя" информация в буфере сокета будет удаляться системой, начиная с "конца сокета" т.е. первыми будут удалены данные, которые пришли первыми?

  Ответить  
 
 автор: cheops   (15.11.2011 в 17:37)   письмо автору
 
   для: dump   (15.11.2011 в 17:19)
 

3. 30-секунд это вот для чего. Скрипту выделяют достаточно много оперативной памяти от 8 до 32Мб, если к серверу присоединиться 100 клиентов и каждый будет по часу не давать скрипту завершиться, то потребуется более 3Гб оперативной памяти и где её брать для новых клиентов? Поэтому чем быстрее скрипт возвращает оперативную память серверу, тем её больше и тем больше клиентов он может обслужить. Ну а 30 секунд от балды поставлено, обычно скрипты еще быстрее срабатывают, по крайней мере к процессору это время отношения не имеет, посчитали, что этого времени должно быть за глаза (многие, кстати, на выделенных серверах выставляют другие временные ограничения или варьируют их от скрипта к скрипту).

  Ответить  
 
 автор: cheops   (15.11.2011 в 17:32)   письмо автору
 
   для: dump   (15.11.2011 в 17:19)
 

2. Вообще под новые вопросы лучше заводить новые темы, тем более вы умудряетесь в одном вопросе задавать сразу несколько :) Канал забивается очень просто. В локальной сети компьютеры отправляют широковещательные каналы всем сразу хостам (тот у кого совпадает MAC-адрес с тем, что указан в пакете, забирает его себе, остальные игнорируют) - это происходит в разные моменты времени, поэтому все работает быстро и четко. Чем шире канал, тем больший объем данных может пройти по нему за менее короткий срок. Иногда происходят коллизии - два сигнала отправляются одновременно, в результате оба узла берут тайм-аут, если сразу после тайм-аута еще одна коллизия - время тайм-аута увеличивается. Если таких коллизий очень много - все лезут в Интернет через узкий канал, то тайм-ауты на всех машинах стремительно возрастают, а в сети идут постоянные коллизии, а у вас ничего не грузится, так как у вас либо тайм-аут, либо очередная коллизия.

PS Кстати, именно поэтому существуют ограничения на количество компьютеров в локальной сети и длину кабеля. Если мы будем писать учебник по сетям, давайте делать это в нескольких темах :)))

  Ответить  
 
 автор: cheops   (15.11.2011 в 17:28)   письмо автору
 
   для: dump   (15.11.2011 в 17:19)
 

1. А где вы этот пример взяли? Какой-то он странный, $dump не инициализирован, потом получается в тот же самый сокет отправляются полученные из него данные.

>Как система "заставляет ждать" функции чтения из файлов?
Они сами себя заставляют ждать, если у них заполнился их внутренний буфер, они не будут ничего читать из сети/буфера сокета, пока они не очистят буфер (не сбросят его на диск) для приема следующей порции данных. На уровне сокетов такие вещи тоже происходят и пока сокет/библиотека занимается своими делами часть данных может быть не получена, но это не страшно, так как используется протокол TCP с гарантированной доставкой пакетов, все, что не дошло будет запрошено и доставлено повторно.

  Ответить  
 
 автор: dump   (15.11.2011 в 17:19)   письмо автору
 
   для: cheops   (15.11.2011 в 16:11)
 

[QUOTE]
Однако, даже в PHP вы же $dump каждый раз перезаписываете
[/QUOTE]
Вот это на мой взгляд очень хорошая фраза, она для меня многое проясняет. Действительно, сокет как файл - мы записали в него, потом считали, записали, считали, и таким образом мы использовали всего 1 кб оперативной памяти. Но тут есть два вопроса:
1)
Вот к примеру цикл:
do
{
socket_write($socket, $dump);
socket_read($socket, $dump);
}
while ();
Функция socket_write(); пишет в сокет , а после неё сразу вызываеться socket_read(). Но ведь в момент вызова socket_read(), данные ещё ведь не поступили? Как система "заставляет ждать" функции чтения из файлов? Я знаю есть блокирующий режим сокетов - это означает, что функция записи считаеться выполненной только тогда, когда она не только записала данные в сокет, но и ответные данные пришли?
2) Что значит "забить канал"(как его можно забить, если система поочередно передаёт и принимает данные из созданных сокетов) и почему хостеры не дают выполняться скриптам больше 30 секунд?
Ведь если на сервере реализована вытесняющая многозадачность, то что мешает php-скрипту (как треду процесса сервера) выполняться скажем с меньшим приоритетом чем другие php-скрипты?

  Ответить  

Сообщения:  [1-10]    [11-20]  [21-26] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования