Dlaczego zamiast plików cookie nie można używać gniazd?

17

Zadano kolejne pytanie dotyczące wykorzystania adresów IP do identyfikacji poszczególnych klientów. Myślę, że rozumiem, dlaczego adres IP jest niewystarczający. Ale co z gniazdem, które ma więcej informacji iz tego, co rozumiem, jest stanowe? Czy nie można tego potencjalnie wykorzystać zamiast pliku cookie?

Społeczność
źródło
18
Gniazdo jest pełne, ale http nie utrzymuje połączenia otwartego po pobraniu strony internetowej. Zamyka się około 15 sekund po pobraniu całej strony. to jest cały powód, dla którego potrzebujesz plików cookie, aby zachować stan
MTilsted
41
Gniazdo nie jest kawałkiem danych. Nie możesz tego wysłać. Twoje pytanie nie ma sensu.
user207421
8
To tak, jakby pytać, dlaczego nie można używać czasowników zamiast rzeczowników ...
user541686
2
@EJP: Odpowiedziałem przy założeniu, że OP oznacza poczwórny (obiekt_źródłowy, docelowy_ip, docelowy_port) zamiast obiektu gniazda. Ale twoja interpretacja też ma sens.
Jörg W Mittag
Możesz spróbować naśladować sposób działania firebase do zarządzania stanem lub tożsamością użytkownika bez plików cookie i sesji.
JeffO

Odpowiedzi:

64

Gniazdo identyfikuje połączenie . Pliki cookie są zwykle używane do identyfikacji użytkownika . Jeśli otworzę dwie karty przeglądarki do SE.SE, będę miał dwa połączenia, a zatem dwa gniazda. Ale chcę, aby moje ustawienia pozostały w obu z nich. (W rzeczywistości przeglądarka zwykle otwiera wiele gniazd dla jednej strony, aby przyspieszyć ładowanie strony; uważam, że większość przeglądarek ma domyślną maksymalną wartość od 4 do 10 gniazd na stronę).

I odwrotnie może się zdarzyć: jeśli zamknę kartę przeglądarki, inny użytkownik na komputerze może otworzyć kartę przeglądarki do SE.SE i może uzyskać tę samą poczwórność (source_ip, source_port, target_ip, target_port), w którym to przypadku , dostanie wszystkie moje ustawienia.

Jörg W Mittag
źródło
Warto zauważyć, że przy http2 (i potokowaniu HTTP) prawdopodobnie nie będziesz mieć dwóch gniazd otwartych na SE. Twoja przeglądarka ponownie użyje tego samego gniazda. Musisz mieć uruchomione różne przeglądarki.
Matthew Steeples
3
Trywialny lokalny wyboru oznacza, że Chrome ma pozostać otwarte na karcie jedno gniazdo - prawdopodobnie dlatego, że są one piaskownicy i nie chce do stanu zakładowego między nimi - ale gniazdo Każda karta wydaje się być trwała i wnioski są prawdopodobnie potokowych w ramach tej zakładki.
Bezużyteczny
1
Warto również zauważyć, że nie wiesz, co się dzieje z tyłu. Wiele modułów równoważących obciążenie kończy połączenie użytkowników, a następnie otwiera własne serwery zaplecza, co oznacza, że ​​wielu użytkowników może korzystać z jednego gniazda.
Dan
@ Bez użycia IIRC SE używa WebSockets lub długiego odpytywania (cofania) do pobierania aktualizacji (nowe pytania, zmiany itp.) Na wypadek, gdybyś tutaj testował. Inne strony mogą zachowywać się inaczej - nie ma sensu utrzymywać gniazda otwartego w nieskończoność w witrynie statycznej.
Bob
To prawda, że ​​kilka prób znalazłem prawdziwie statyczną stronę do sprawdzenia. Za to, Chrome otwiera wiele gniazd na karcie, a nadal nie ponownie je między kartami, ale robi je zamknąć raz zakładka zakończeniu ładowania. Są jednak dobrze widoczne, ponieważ spędzają tak długo w TIME_WAIT.
Bezużyteczny
20

Gniazda TCP są zaprojektowane tak, aby były stanowe, więc ogólnie służą do identyfikowania sesji. Dokładnie to robią protokoły takie jak SSH i ftp.

Protokół HTTP został zaprojektowany tak, aby był bezstanowy, a każde połączenie jest powiązane tylko z zasobem do pobrania. Po pobraniu zasobu gniazdo TCP, na którym jedzie żądanie HTTP, zostaje zamknięte. Pierwotnym powodem tego była prostota. Ale efektem ubocznym jest to, że serwery HTTP z nowoczesnymi stronami internetowymi mogą obsługiwać znacznie więcej użytkowników niż serwery oparte na gniazdach, takie jak SSH lub ftp.

Nie można więc używać gniazd, ponieważ HTTP zamyka gniazdo po pobraniu strony internetowej.

Oczywiście powiedzenie, że HTTP zamknie gniazdo na zasób, upraszcza rzeczy, ponieważ HTTP ma takie funkcje, jak potokowanie i trwałe połączenia, które mogą pobierać wiele zasobów na gniazdo. Ale to tylko optymalizacja. Po pobraniu wszystkiego przeglądarka zamknie gniazdo po pewnym czasie.

HTTP został pierwotnie zaprojektowany jako prosty protokół do pobierania plików HTML. Stare przeglądarki mogą również pobierać pliki HTML z innych protokołów, takich jak Gopher i ftp. W związku z tym nie było powodu, aby HTTP był stanowy, ponieważ pliki HTML są zwykłymi plikami tekstowymi.

Po wprowadzeniu formularzy internetowych i stron HTML może przesyłać dane z powrotem na serwer strony internetowe zaczęły potrzebować sesji. W ten sposób pliki cookie zostały utworzone w celu ponownego wprowadzenia stanu do bezstanowego protokołu przesyłanego przez stanową warstwę przesyłania przesyłaną przez bezstanową warstwę sieciową. Zatem pełne warstwy aplikacji to:

  • Ethernet, Wi-Fi itp. = Bezstanowy
  • IP = bezpaństwowiec
  • TCP = stanowy
  • HTTP = bezstanowy
  • Pliki cookie HTTP + = stanowe

Obecnie mamy gniazda sieciowe, które mogą przechowywać pojedyncze otwarte gniazdo ze strony internetowej na serwer. Dzięki websockets możesz ponownie użyć gniazd do identyfikacji użytkownika, ponieważ sam websocket jest stanowy. Ale w większości przypadków nadal potrzebujesz pliku cookie dla głównej strony HTML, która ładuje javascript, który uruchamia websocket.

Slebetman
źródło
4
„HTTP serwery uruchomione nowoczesne strony internetowe mogą obsługiwać znacznie więcej użytkowników niż serwery oparte gniazdowych jak SSH lub FTP” [potrzebne źródło]
el.pescado
6
@ el.pescado: To po prostu logiczne. Ponieważ serwery oparte na gniazdach utrzymują aktywne połączenie, dlatego serwery oparte na gniazdach są ograniczone do maksymalnej liczby deskryptorów plików, które można otworzyć (aw niektórych systemach operacyjnych gniazda konkurują z dyskiem twardym o deskryptory plików). Jeśli nie musisz utrzymywać połączenia przy życiu, limit to tylko przepustowość. Pamiętaj, że limit przepustowości to ta sama pogoda, przy której połączenie jest aktywne, czy nie. Nowoczesne serwery HTTP mogą obsługiwać miliony żądań na sekundę. Gdyby musieli utrzymać te miliony gniazd w czasie, gdy czytasz stronę internetową, serwer by umarł
slebetman
6
+1 dla „W ten sposób pliki cookie zostały utworzone w celu ponownego wprowadzenia stanu do bezstanowego protokołu, który jest przesyłany za pośrednictwem stanowej warstwy przesyłania, która jest przesyłana przez bezstanową warstwę sieciową”. To piękne
Przywróć Monikę - dirkk
Podobała mi się ta odpowiedź. Trafia do sedna problemu.
Jim W
Serwery HTTP @slebetman oparte na gniazdach. Wszystkie są. Zgodnie z definicją. Pliki cookie nie powodują, że serwery HTTP są stanowe. W rzeczywistości tak nie jest, dlatego pliki cookie są przesyłane przez klienta za każdym razem.
Miles Rout