另一个问题是问关于使用IP地址来识别个人客户。我想我理解为什么IP地址不足。但是套接字有什么更多信息,据我了解,它是有状态的吗?难道不是可以用来代替cookie吗?
另一个问题是问关于使用IP地址来识别个人客户。我想我理解为什么IP地址不足。但是套接字有什么更多信息,据我了解,它是有状态的吗?难道不是可以用来代替cookie吗?
Answers:
套接字标识连接。Cookies通常用于识别用户。如果打开两个SE.SE浏览器选项卡,则将有两个连接,因此有两个套接字。但我希望我的设置在这两个设置中都能保持不变。(事实上,典型地,浏览器中打开多个用于套接字一个页面为了加快页面加载时间;相信大多数浏览器有每页4周10的插座之间的默认最大值。)
相反的情况也可能发生:如果我关闭浏览器选项卡,则计算机上的另一个用户可能会打开SE.SE的浏览器选项卡,并且可能会获得相同的四倍(source_ip,source_port,target_ip,target_port),在这种情况下,他将获得我的所有设置。
TCP套接字被设计为有状态的,因此通常将它们用于标识会话。像SSH和ftp这样的协议正是这样做的。
HTTP被设计为无状态的,并且每个连接仅与要下载的资源相关联。下载资源后,将关闭HTTP请求所基于的TCP套接字。这样做的最初原因是简单性。但是副作用是,运行现代网站的HTTP服务器可以处理的用户数量比SSH或ftp等基于套接字的服务器要多得多。
因此无法使用套接字,因为HTTP将在下载网页后关闭套接字。
当然,说HTTP将关闭每个资源的套接字太简单了,因为HTTP具有流水线和持久连接等功能,这些功能可以为每个套接字下载多个资源。但这仅仅是优化。一切下载完毕后,浏览器将在超时后关闭套接字。
HTTP最初被设计为用于下载HTML文件的简单协议。旧版浏览器也可以通过其他协议(例如Gopher和ftp)下载HTML文件。因此,没有必要将HTTP设为有状态,因为HTML文件只是简单的文本文件。
一旦引入了Web表单,HTML页面便可以将数据发送回服务器,从而开始需要会话。因此,创建了cookie以将状态重新引入到无状态协议中,该协议通过有状态传输层传输,该有状态传输层是通过无状态网络层传输的。因此完整的应用程序层为:
这些天来,我们有websocket可以保持从您的网页到服务器的单个打开套接字。因此,使用websocket,您可以再次使用套接字来标识用户,因为websocket本身是有状态的。但是在大多数情况下,您仍然需要一个html主页的cookie,该cookie会加载启动websocket的javascript。