Вопрос по работе HTTP протокола

RevivaL

Новичок
Хочу разобраться в работе http протокола, читаю документацию, вроде как понял, поправьте или дополните если что не так изложил.

Схема работы браузера c http протоколом. Обратите внимание на 5-й пункт, всё ли правильно?

1. Браузер: устанавливает соединение с сервером и выдает ему HTTP-запрос.
2. Сервер: отсылает строку состояния, которая обозначает результат обработки запроса, и пояснения состояния.
3. Браузер: посылает управляющую информацию запроса, информацию о клиенте.
4. Сервер: передает информацию содержащую данные о самом сервере и затребованном документе.
5. Браузер: передаёт POST информацию, если она присутствует(если отсутствует браузер ждёт ответ сервера).
6. Сервер: если первый запрос браузера успешен, то посылаются затребованные данные. Если нет, посылается пояснение причины.
 

MiksIr

miksir@home:~$
Нет.
Вот в таком порядке
1, 3, 5, 2, 4, 6
1,3,5 вместе и называется HTTP запросом
2,4,6 - HTTP ответом.
 

Вурдалак

Продвинутый новичок
В HTTP/1.1 кроме всего прочего возможно посылать несколько HTTP-запросов подряд и получать при желании сервера столько же ответов.
 

RevivaL

Новичок
В HTTP/1.1 кроме всего прочего возможно посылать несколько HTTP-запросов подряд и получать при желании сервера столько же ответов.
Можно запросить к примеру сразу 2-ва документа? То есть, запросить ещё одни документ не дождавшись ответа от сервера?
 

MiksIr

miksir@home:~$
Не сразу, а по очереди. Придумано для того, что бы не тратить время на коннекты к серверу, когда есть много запросов (а их обычно много есть - картинки всякие на сайте и т.п.). Назвается Keep-Alive
 

RevivaL

Новичок
Мол соединение остаётся открытым а не закрывается после успешного обмена? Когда оно закроется?
 

Вурдалак

Продвинутый новичок
RevivaL, вот, честно говоря, не помню я тонкости вроде надо ли ждать ответа от сервера или нет, но вроде как да, можно послать сразу 2 запроса, в случае чего в первом ответе сервер даст понять, что на второй он отвечать не будет.
 

Вурдалак

Продвинутый новичок
Когда оно закроется?
— по-хорошему, какая-то из сторон в последнем запросе (или ответе) должна выдать заголовок
Ну или если одна из сторон прервёт соединение, то вторая при попытке отправить данные должна это понять. Либо таймаут.
 

MiksIr

miksir@home:~$
Мол соединение остаётся открытым а не закрывается после успешного обмена? Когда оно закроется?
Через некий таймаут. Свои таймауты есть и у сервера и у браузера - соответственно, кто первый закроет. Сервер иногда отвечает, какой у него таймаут, в заголовках ответа. Обычно порядка минуты, но если сервер нагруженный, администратор вполне может сократить до 5-15 секунд, ибо серверу накладно держать соединения открытыми.
 

Вурдалак

Продвинутый новичок
Не, в большинстве случаев именно через заголовок. Слишком много ресурсов тратилось бы впустую, если бы всегда соединение закрывалось по таймауту.
 

RevivaL

Новичок
Нет случайно какой нибудь русскоязычной документации принципа работы по http 1.1? в гугле нечего не нашел по 1.1
 

Вурдалак

Продвинутый новичок
Браузеры держут соединения открытыми.
— вот ты говоришь что-то о минуте ожидания (макс). Страница со всеми картинками при современных скоростях загружается секунд за пять максимум. По-твоему, браузер будет ждать пока пользователь не соизволит перейти по следующей ссылке?..
 

MiksIr

miksir@home:~$
Берем ФФ, заходим на phpclub.ru, смотрим
tcpdump -i eth0 -ttt -s 1500 -p -n host phpclub.ru
Время - дельта до предыдущей строки
Код:
00:00:00.000000 IP 10.55.1.10.43578 > 79.137.227.52.80: Flags [S], seq 3380205599, win 5840, options [mss 1460,sackOK,TS val 673460937 ecr 0,nop,wscale 6], length 0
Открыли раз (Syn)
Код:
00:00:00.003027 IP 79.137.227.52.80 > 10.55.1.10.43578: Flags [S.], seq 2136086918, ack 3380205600, win 5792, options [mss 1460,sackOK,TS val 190159731 ecr 673460937,nop,wscale 6], length 0
00:00:00.000051 IP 10.55.1.10.43578 > 79.137.227.52.80: Flags [.], ack 1, win 92, options [nop,nop,TS val 673460938 ecr 190159731], length 0
00:00:00.000175 IP 10.55.1.10.43578 > 79.137.227.52.80: Flags [P.], seq 1:606, ack 1, win 92, options [nop,nop,TS val 673460938 ecr 190159731], length 605
...skiped....
00:00:00.000008 IP 79.137.227.52.80 > 10.55.1.10.43578: Flags [P.], seq 15062:15126, ack 1209, win 129, options [nop,nop,TS val 190159938 ecr 673460989], length 64
00:00:00.000089 IP 10.55.1.10.43578 > 79.137.227.52.80: Flags [.], ack 15126, win 589, options [nop,nop,TS val 673460990 ecr 190159938], length 0
00:00:00.007082 IP 10.55.1.10.43579 > 79.137.227.52.80: Flags [S], seq 3381835707, win 5840, options [mss 1460,sackOK,TS val 673460991 ecr 0,nop,wscale 6], length 0
Открыли два (Syn) - видать одного не хватило
Код:
00:00:00.005549 IP 79.137.227.52.80 > 10.55.1.10.43579: Flags [S.], seq 2131126034, ack 3381835708, win 5792, options [mss 1460,sackOK,TS val 190159949 ecr 673460991,nop,wscale 6], length 0
00:00:00.000055 IP 10.55.1.10.43579 > 79.137.227.52.80: Flags [.], ack 1, win 92, options [nop,nop,TS val 673460993 ecr 190159949], length 0
..skiped...
00:00:00.000014 IP 79.137.227.52.80 > 10.55.1.10.43578: Flags [P.], seq 18270:18518, ack 2411, win 167, options [nop,nop,TS val 190163244 ecr 673461815], length 248
00:00:00.000011 IP 10.55.1.10.43578 > 79.137.227.52.80: Flags [.], ack 18518, win 770, options [nop,nop,TS val 673461817 ecr 190163244], length 0
00:02:04.576488 IP 10.55.1.10.43578 > 79.137.227.52.80: Flags [F.], seq 2411, ack 18518, win 770, options [nop,nop,TS val 673492961 ecr 190163244], length 0
00:00:00.000063 IP 10.55.1.10.43579 > 79.137.227.52.80: Flags [F.], seq 614, ack 496, win 108, options [nop,nop,TS val 673492961 ecr 190159960], length 0
Закрыли раз и два (Fin). Обрати внимание на дельту времени - 2 минуты сидел в idle ничего не передавалось.
Код:
00:00:00.041975 IP 79.137.227.52.80 > 10.55.1.10.43578: Flags [.], ack 2412, win 167, options [nop,nop,TS val 190287860 ecr 673492961], length 0
00:00:00.002181 IP 79.137.227.52.80 > 10.55.1.10.43579: Flags [.], ack 615, win 110, options [nop,nop,TS val 190287860 ecr 673492961], length 0
00:00:00.011479 IP 79.137.227.52.80 > 10.55.1.10.43578: Flags [F.], seq 18518, ack 2412, win 167, options [nop,nop,TS val 190287874 ecr 673492961], length 0
00:00:00.000042 IP 10.55.1.10.43578 > 79.137.227.52.80: Flags [.], ack 18519, win 770, options [nop,nop,TS val 673492975 ecr 190287874], length 0
00:00:00.003061 IP 79.137.227.52.80 > 10.55.1.10.43579: Flags [F.], seq 496, ack 615, win 110, options [nop,nop,TS val 190287874 ecr 673492961], length 0
00:00:00.000022 IP 10.55.1.10.43579 > 79.137.227.52.80: Flags [.], ack 497, win 108, options [nop,nop,TS val 673492976 ecr 190287874], length 0
 

RevivaL

Новичок
Ну начать с http://ru.wikipedia.org/wiki/HTTP
Ну и погуглить "rfc 2068 перевод"
Спасибо нашел, возник маленький вопрос, скорее не вопрос а уточнение.

В документации сказано
"Значительное отличие HTTP/1.1 от более ранних версий HTTP состоит в том, что постоянные соединения являются заданным по умолчанию поведением любого HTTP соединения. То есть если не обозначено иного, клиент может считать, что сервер поддержит постоянное соединение."

То есть если сервер в своём ответе не указал что разрывает соединение, то он соединение не закрыл?
 

MiksIr

miksir@home:~$
Странно, кстати, что 2 минуты... у nginx по дефолту 75 секунд.
 
Сверху