Почему мой потоковый сокет ставит в очередь только одно соединение за раз из моего браузера?

1

Я связываю сокет с localhost: 8888, чтобы создать простой сервер.
Вот простой скрипт python, который я использовал для создания сервера.

import os
import socket
import fcntl

tuples = socket.getaddrinfo('localhost', 8888, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE | socket.AI_ADDRCONFIG)

res = tuples[0]

af, socktype, proto, canonname, sockaddr = res
sock = socket.socket(af, socktype, proto)

flags = fcntl.fcntl(sock.fileno(), fcntl.F_GETFD)
flags |= fcntl.FD_CLOEXEC
fcntl.fcntl(sock.fileno(), fcntl.F_SETFD, flags)

sock.setblocking(0)        
sock.bind(sockaddr)
sock.listen(128)
  1. Теперь я открываю этот скрипт с помощью интерактивной оболочки.
  2. Затем я перехожу в свой браузер и нахожусь в http://localhost: 8888, который должен поставить в очередь соединение с моим сервером.
  3. Я повторяю последний шаг несколько раз, каждый раз в новой вкладке.

На этом этапе я ожидаю, что для моего сервера будет установлено много соединений.

Чтобы проверить это, я перехожу в свою интерактивную оболочку, и я печатаю:

sock.accept()

Это работает с первой попытки, но при последующих попытках я получаю Erno 11 (EAGAIN), который говорит мне, что никакие другие соединения не поставлены в очередь. Тем не менее, в моем браузере, маленький "Соединительный" счетчик все еще идет по каждой вкладке, которую я открыл! Я пробовал это как в Chrome, так и в Firefox.

Я написал свой собственный клиент, который подключается к localhost: 8888, и смог без проблем установить очереди в соединениях. Что здесь происходит?? Кто-нибудь может проверить, можно ли проверить этот эксперимент в своих браузерах?

Для удобства, вот мой клиент:

import os
import socket
import fcntl

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 8888))
s.recv(1000)
Теги:
browser
sockets
tcp

1 ответ

1
Лучший ответ

Вероятно, это оптимизация на стороне вашего браузера, попытка повторного использования одного и того же соединения - см. Http://en.wikipedia.org/wiki/HTTP_persistent_connection.

Если вы хотите убедиться, обнюхайте трафик с помощью wirehark, хотя ваш адрес на основе localhost может потребовать некоторой причудливой настройки.

  • 0
    Кто бы ни придумал это, он жил в состоянии греха. Почему имеет смысл указывать параметр транспортного уровня внутри прикладного уровня (который зависит от транспортного уровня!)? К тому времени, когда мое сообщение попадает в пункт назначения, уже слишком поздно указывать, как я хочу, чтобы сообщение было отправлено!
  • 0
    TCP велик, кроме случаев , когда это не SCTP предполагается устранить эти проблемы, но не широко доступна.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню