Соединение в вкладках браузера
Ты уверен что это браузер, а не твоё приложение?
Собственно да, а если тот же трюк провернуть в двух разных браузерах?
то все норм, фишка именно в том, что если идентичные урлы в разных вкладках браузера, то он по ходу их группирует в одно соединение с одним исходящим портом. А стандартная модель - это поток на соединение.
ну и поставь Connection: close в ответе для теста
то все норм, фишка именно в том, что если идентичные урлы в разных вкладках браузера, то он по ходу их группирует в одно соединение с одним исходящим портом. А стандартная модель - это поток на соединение.да не, в одном потоке можно хоть 100 соединений читать - проблем не будет. явно дело не в кол-ве потоков.
да не, в одном потоке можно хоть 100 соединений читать - проблем не будетКак на одном потоке предлагается одновременно читать 100 соединений?
так же как 5-50 потоков исполняются одновремено на двух ядерном процессоре.
так же как 5-50 потоков исполняются одновремено на двух ядерном процессоре.У процессора используется переключение контекста потока.
В Http нет переключения контекстов. Соответственно, запросы будут выполняться последовательно, а не одновременно.
в смысле? нельзя написать однопоточное приложение на сях или на плюсах, которое будет качать сразу 100 http-файлов?
в смысле? нельзя написать однопоточное приложение на сях или на плюсах, которое будет качать сразу 100 http-файлов?Можно. Но это будет 100 tcp-соединений, а не одно - как у ТС.
а чё ж ты паришь что нельзя в одном потоке? согласен значит, что можно в одном потоке кучу соединений открыть?
Поток - это и thread, и stream. Я имел ввиду stream, а ты - thread.
а чё ж ты паришь что нельзя в одном потоке? согласен значит, что можно в одном потоке кучу соединений открыть?Нельзя поверх одного tcp-соединения выполнять одновременно 100 http-соединений. Они будут обрабатываться последовательно.
одно http-соедение в одном tcp-соединении и сто таких в одном потоке. факт?
одно http-соедение в одном tcp-соединении и сто таких в одном потоке. факт?Этот сценарий отличается от проблемы ТС. В его случае браузер группирует несколько http-соединений в одно tcp-соединение.
он пишет " А стандартная модель - это поток на соединение."
он пишет " А стандартная модель - это поток на соединение."я это прочитал как "стандартная модель - это один http-запрос на одно tcp-соединение"
тогда почему до сих пор не указано о какой версии какого браузера речь - как обсуждать тему ?
я имел в виду
package jetty;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletHandler;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class JettyAdapter{
public static void main(String... args) throws Throwable {
new JettyAdapter;
}
private JettyAdapter throws Exception {
Server server = new Server(8080);
ServletHandler handler = new ServletHandler;
server.setHandler(handler);
handler.addServletWithMapping(TestServlet.class, "/test");
server.start;
server.join;
}
public static class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {
long date = System.currentTimeMillis + 10000;
while (date > System.currentTimeMillis {
}
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter.println("<h1>test servlet</h1>");
response.getWriter.println("session=" + request.getRemoteHost + ":" + request.getRemotePort;
}
}
}
Вот тестовый код. http://screencast.com/t/SpzwnCaM4or - видно, что когда урл один, то запросы последовательно обрабатываются, когда урл отличается, то параллельно.
в http 2 вроде можно же, не?
Мне кажется, что браузер надеется, что ответ на первый запрос можно будет закешировать и не делать второй запрос вообще.
в http 2 вроде можно же, не?да, появилась такая фича
http://screencast.com/t/eLNfO3Q1nnQF - как я понимаю, запрос браузер не послал, тк используется одно tcp соединение, что отображается в том, что один исходящий порт используется.
Можешь попробовать перед паузой быстро отдать заголовки запрещающие кеширование, тогда браузер будет знать, что кеша не будет и отправит второй запрос сразу.
Или попробуй отключить кеш (правая галочка в тулбаре на скришноте)
действительно, отключил кэш в браузере, в итоге браузер сделал два соединения с разными исходящими портами.
Оставить комментарий
SergeRRRRRR
Почему браузер использует одно соединение для одного и того же урла в разных вкладках?Тестировал небольшой сервисок с jetty embedded и парой долгих сервлетов и наткнулся на такое поведение, т.е. если запустить example.ru/test в двух вкладках, то исполнение во второй вкладке пойдет только после завершения первой, а если запустить example.ru/test и example.ru/test?, то исполнение будет идти в разных потоках.