cookie和socket

1、cookie:用户与服务器的交互

产生背景:

由于早期的http是无连接的,非持续连接的,即每个请求/响应对是经一个单独的TCP连接发送的。后来http默认是持续连接,即keep alive,始终保持连接,也就是所有的请求及其响应经由相同的TCP发送。否则,想要获取11张png,就需要建立起11个TCP连接。它对用户与服务器的交互无影响。

由于http是无状态的,即对事务处理没有记忆能力,为了识别用户,希望把内容与用户身份联系起来,所以http使用了cookie,允许站点(比如浏览器程序)对用户进行跟踪。

使用方法:

当用户访问淘宝,添加很多产品至购物车,用户的一系列行为全部记录并保存至cookie当中,最后存放于淘宝站点的一个后端数据库中。首先,你本来就提供了你的个人账户信息,比如你的姓名、家庭住址、手机号码、身份证号等等,而cookie记录了你在互联网上的所有足迹,比如你访问了淘宝的哪些店铺、查看了哪些商品、在店铺停留了多长时间、添加至购物车上商品等等,通过利用cookie和你提供的个人账户信息,他们可能从事一些商业活动或者商业犯罪。总而言之,cookie在一定程度上暴露的个人隐私。

本质:

它主要用于用户与服务器之间的交互,即对用户行为进行跟踪并记忆用户在互联网上锁产生的足迹。本质上是一个数据结构,用户存储用户访问站点的信息。

2、socket:进程通信

通信本质:

互联网中两台主机之间的通信,实际上指的是运行在不同端系统上的进程间的通信,比如浏览器是一个客户进程,而web服务器是一台服务器进程。

使用方法:

进程通过一个套接字(socket)的软件接口向网络发送报文和从网络接受报文。socket是同一台主机内运输层与网络层之间的接口,通常进程类比于房子,socket类比于门,门内侧为运输层,而门另一侧为网络层。

一台主机上可能运行了很多网络应用进程,每个进程具有一个或多个套接字,所以在目的主机指定特定的标识符。通过3次握手,客户端与服务器端建立一个TCP连接,同时将客户端套接字地址(ip地址和端口号)与服务器端套接字地址(ip地址和端口号)关联起来,即创建了一个TCP套接字,而这个套接字指定了两端的主机地址(ip和端口号)。

只有通过初始化一个socket,建议一个TCP连接,方能进行数据报文的传输、发送。

clientSocket.close() 意味着关闭套接字,因此关闭了客户和服务器之间的TCP连接,同时释放了资源,即变量和变量。

 

拓展:运输层和网络层的关系

在协议栈中,运输层刚好位于网络层之上。网络层提供了主机之间的逻辑通信,而运输层为运行在不同主机上的进程之间提供了逻辑 通信。

类比例子:

两个家庭,一家位于美国东海岸,一家位于美国西海岸,每家有12个孩子,他们都是堂兄弟姐妹。这两个家庭的孩子喜欢彼此通信,每个人每星期要互相写一封信,每封信都用单独的信封通过传统的邮政服务传送。因此,每个家庭每星期向另一家发送12X12封信。每个家庭都有一个孩子负责收发邮件,西海岸的是Ann而东海岸的是Bill。每星期Ann去她的所有兄弟姐妹那里收集信件,并将这些信件交到每天到家门口来的邮政服务的邮车上。当信件到达西海岸家庭时,Ann也负责将信件分发到她的兄弟姐妹手上。

在这个例子中,邮政服务(网络层协议)为两个家庭提供逻辑通信,邮政服务将信件从一家运往另一家,而不是一个人运往另一个人。

Ann和Bill为堂兄弟姐妹之间提供了逻辑通信,Ann和Bill从兄弟姐妹那里交付信件。

  • 应用层报文 = 信封上的字符
  • 进程 = 堂兄弟姐妹
  • 主机(又称端系统) = 家庭
  • 运输层协议 = Ann和Bill
  • 网络层协议 = 邮政服务(包括邮车)

1、运输层协议只工作在端系统中。在端系统中,运输层协议将来自进程的报文移动到网络边缘(即网络层)。

2、运输层协议能够提供的服务常常受制于底层网络层协议的服务模型 

Ann和Bill所能提供的服务明显受限于邮政服务所能提供的服务。如果邮政服务不能提供在两家之间传递邮件所需时间的最大期限(例如3天),那么Ann和Bill就不可能保证邮件在堂兄弟姐妹之间传递信件的最大期限。类似的,运输层协议能够提供的服务常常受制于底层网络层协议的服务模型。如果网络层协议无法为主机之间发送的运输层报文段提供时延或宽带保证的话,运输层协议也就无法为进程之间发送的应用程序报文提供时延或宽带保证。(就像没网或者网速慢,也就无法发送报文到网络层,进入无法到达目的主机)

3、TCP/IP协议属于运输层协议

4、运输层的多路复用与多路分解,也就是将由网络层提供的主机到主机交付服务延伸到为运行在主机上的应用程序提供进程到进程的交付服务。在目的主机,运输层从紧邻其下的网络层接收报文段。运输层负责将这些报文段中的数据交付给在主机上运行的适当应用程序进程。(在接收主机上的运输层实际上并没有直接将数据交给进程,而是交给了一个中间的套接字)

由于一个进程有一个或多个套接字,为了将报文定向到正确的套接字,接收端的运输层会检查报文的一些字段,标识出该接收套接字,方能将报文定向到正确的接收套接字。这一过程称为多路分解。

备注: 参照于《计算机网络-自顶向下方法》

 

拓展:session和cookie

  • 由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。
  • 思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
  • Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。

        综上,总结一下:

  • Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
  • Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式
posted @ 2018-12-02 16:56  人类能走多远  阅读(373)  评论(0)    收藏  举报