为什么不能使用套接字而不是cookie来识别个人?


17

另一个问题是问关于使用IP地址来识别个人客户。我想我理解为什么IP地址不足。但是套接字有什么更多信息,据我了解,它是有状态的吗?难道不是可以用来代替cookie吗?


18
套接字是有状态的,但是下载网页后http不会保持连接打开。整个网页下载完毕后,关闭时间约为15秒。这就是您需要Cookie保持状态的全部原因
MTilsted

41
套接字不是数据。您无法发送。您的问题没有道理。
user207421'17

8
这就像问为什么不能用动词代替名词...
user541686

2
@EJP:我在假设OP是将(source_ip,source_port,target_ip,target_port)变为四倍而不是套接字对象这一假设下进行了回答。但是您的解释也是有道理的。
约尔格W¯¯米塔格

您可以尝试模仿Firebase在没有Cookie或会话的情况下管理状态或用户身份的方式。
JeffO

Answers:


64

套接字标识连接。Cookies通常用于识别用户。如果打开两个SE.SE浏览器选项卡,则将有两个连接,因此有两个套接字。但我希望我的设置在这两个设置中都能保持不变。(事实上,典型地,浏览器中打开多个用于套接字一个页面为了加快页面加载时间;相信大多数浏览器有每页4周10的插座之间的默认最大值。)

相反的情况也可能发生:如果我关闭浏览器选项卡,则计算机上的另一个用户可能会打开SE.SE的浏览器选项卡,并且可能会获得相同的四倍(source_ip,source_port,target_ip,target_port),在这种情况下,他将获得我的所有设置。


值得注意的是,使用http2(和http流水线),您可能不会打开两个SE套接字。您的浏览器将重新使用相同的套接字。您需要运行其他浏览器。
马修·史蒂普斯

3
琐碎的本地检查表明Chrome 确实为每个选项卡打开了一个套接字-可能是因为它们已被沙盒化,并且它不想共享它们之间的状态-但是每个选项卡的套接字似乎都是持久的,并且请求可能在该选项卡中进行了管道传递。
无用的

1
还值得注意的是,您也不知道后端发生了什么。许多负载均衡器会终止用户连接,然后向后端服务器开放自己的连接,这意味着您可能有多个用户共享一个套接字。

@Useless IIRC SE确实使用WebSocket或长时间轮询(后备)来获取更新(新问题,编辑等),以防您在此处进行测试。其他站点的行为可能有所不同-在静态站点上无限期地保持套接字打开没有什么意义。
鲍勃(Bob)

没错,我花了一些时间寻找一个真正静态的站点进行检查。为此,Chrome会为每个标签页打开多个套接字,并且仍然不会在标签页之间重复使用它们,而是在标签页加载完成后关闭它们。由于它们在TIME_WAIT中花费了很长时间,因此很容易看到它们。
无用的

20

TCP套接字被设计为有状态的,因此通常将它们用于标识会话。像SSH和ftp这样的协议正是这样做的。

HTTP被设计为无状态的,并且每个连接仅与要下载的资源相关联。下载资源后,将关闭HTTP请求所基于的TCP套接字。这样做的最初原因是简单性。但是副作用是,运行现代网站的HTTP服务器可以处理的用户数量比SSH或ftp等基于套接字的服务器要多得多。

因此无法使用套接字,因为HTTP将在下载网页后关闭套接字。

当然,说HTTP将关闭每个资源的套接字太简单了,因为HTTP具有流水线和持久连接等功能,这些功能可以为每个套接字下载多个资源。但这仅仅是优化。一切下载完毕后,浏览器将在超时后关闭套接字。

HTTP最初被设计为用于下载HTML文件的简单协议。旧版浏览器也可以通过其他协议(例如Gopher和ftp)下载HTML文件。因此,没有必要将HTTP设为有状态,因为HTML文件只是简单的文本文件。

一旦引入了Web表单,HTML页面便可以将数据发送回服务器,从而开始需要会话。因此,创建了cookie以将状态重新引入到无状态协议中,该协议通过有状态传输层传输,该有状态传输层是通过无状态网络层传输的。因此完整的应用程序层为:

  • 以太网,Wifi等=无状态
  • IP =无状态
  • TCP =有状态
  • HTTP =无状态
  • HTTP + Cookie =有状态

这些天来,我们有websocket可以保持从您的网页到服务器的单个打开套接字。因此,使用websocket,您可以再次使用套接字来标识用户,因为websocket本身是有状态的。但是在大多数情况下,您仍然需要一个html主页的cookie,该cookie会加载启动websocket的javascript。


4
“运行现代网站的HTTP服务器可以处理比基于套接字的服务器(如SSH或ftp)要多得多的用户” [需要引用]
el.pescado

6
@ el.pescado:这是合乎逻辑的。由于基于套接字的服务器保持活动连接,因此基于套接字的服务器被限制为可以打开的最大文件描述符数量(在某些操作系统上,套接字与硬盘竞争文件描述符)。如果您不需要保持连接活动,那么您的限制就是带宽。请注意,带宽限制与您保持连接是否处于活动状态相同。现代的HTTP服务器每秒可以处理数百万个请求。如果他们在阅读网页时需要保持数百万个套接字的位置,则服务器将死亡
slebetman

6
+1表示“因此创建了cookie,以将状态重新引入无状态协议,该协议是通过在无状态网络层上传输的有状态传输层传输的”。那真漂亮
恢复莫妮卡-dirkk'Mar

我喜欢这个答案。它切入问题的核心。
Jim W

@slebetman HTTP服务器基于套接字的。他们都是。根据定义。Cookie 不会使HTTP服务器成为有状态的。实际上,按定义它们不是,这就是为什么每次由客户端传输cookie的原因。
Miles Rout
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.