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、运输层的多路复用与多路分解,也就是将由网络层提供的主机到主机交付服务延伸到为运行在主机上的应用程序提供进程到进程的交付服务。在目的主机,运输层从紧邻其下的网络层接收报文段。运输层负责将这些报文段中的数据交付给在主机上运行的适当应用程序进程。(在接收主机上的运输层实际上并没有直接将数据交给进程,而是交给了一个中间的套接字)
由于一个进程有一个或多个套接字,为了将报文定向到正确的套接字,接收端的运输层会检查报文的一些字段,标识出该接收套接字,方能将报文定向到正确的接收套接字。这一过程称为多路分解。