应用层
应用层
应用层功能
在应用进程间传输报文,实现特定类型的数据交互,去执行特定的功能。
HTTP 协议
(超文本传输协议)负责发布和接收 HTML 页面和其他 Web 资源,即 Web 通信。底层通信通过 TCP 协议实现,默认端口号 80 。
资源定位
HTTP 协议通过 URL 来访问资源。URL 即 WEB 内容访问标识符,是一种具体的 URI。不仅唯一标识资源,而且还提供了定位该资源的信息。
通用格式为:协议://IP地址或域名:端口号/文件路径?参数
,如 http://localhost:443/student?id=10&name=mrjoker
连接方式
HTTP/1.0
默认使用短连接:访问页面时,客户端和服务器之间每次 HTTP 操作都会单独使用一次 TCP 连接,传输完毕后自动关闭。
客户端和服务器之间都会建立多个 HTTP 会话,开销较大。
HTTP/1.1
默认使用长连接:访问页面时,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,直到 HTML 页面调用的所有 web 资源传输完毕。
长连接会在 HTTP 响应头标注:Connection:keep-alive
但 HTTP/1.1 是串行化处理所有 web 资源请求。一旦有请求无法正常加载,后续请求就会被阻塞。
HTTP/2
增加了多路复用功能:让所有数据流共用同一个连接。接收到客户端 HTTP 请求后,服务器会一次性把所需要的 web 资源打包发送。
即使有请求无法正常加载,也不会影响处理其它 web 资源请求。
TCP 连接在刚开始发送数据时会限制连接的最大速度,集中发送能更有效地利用 TCP 连接。
请求类型
HTTP 请求有以下四种常用类型:
GET:请求服务器数据,请求参数直接附在 URL 上(不够安全,仅适用于简单公开数据的请求和提交)
POST:向服务器提交数据,数据以表单形式提交(内容长度无上限,且不会被浏览器记录)
PUT:修改服务器数据(慎用)
DELETE:删除服务器数据(慎用)
除此之外 HTTP 协议在正式通信前还可能发出 OPTION 请求:先询问服务器当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些 HTTP 动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的 XMLHttpRequest 请求,否则就报错。
主机识别
HTTP 协议是无状态协议,本身不保存请求和响应之间的通信状态。
也就是说通信过后服务器将无法相互识别客户端,因此我们必须引入其他方式让服务器记录客户端的信息。
Session & Cookie
负责记录对方主机信息,在 HTTP 通信中相互识别。cookie 保存在客户端,session 保存在服务器端。
客户端初次访问服务器时,服务端会自动创建 session 用来标识用户。然后在响应头 Set-Cookie 项向客户端返回 session ID。
客户端再次访问服务器时,会在请求头 Cookie 项向服务器发送 session ID,服务器根据 ID 查询 Session 就可以识别用户。
用户和通信的详细信息通常记录在 session 中,cookie 中只保存 session ID ,以避免信息泄露。如果客户端 cookie 被禁用,就需要利用 URL 重写把 session ID 直接附加在 URL 路径上。
Token
token 和 session ID 功能相同,都用来在 HTTP 通信中识别用户,过期刷新:
session ID 由服务器随机生成,保存在服务器 session 中。再次访问时只需要直接比对,就可以确认客户端身份。
token 由服务器根据用户 ID 和时间戳经过特定算法生成,服务器不保存。再次访问时服务器需要重新计算并比对,才可以确认客户端身份。
cookie 本身不安全,浏览器中 token 除放在 cookie 外,还可以放到 localStorage 中存储。浏览器发送请求时会自动携带 session ID,但发送 token 需要手动在代码中设置。由于浏览器加载 image 标签中的地址也会发送 session ID,因此使用 token 可以有效防止 CSRF 攻击。
localStorage 和 sessionStorage 的区别; localStorage 生命周期是永久,除非用户手动清除,否则这些信息将永远存在。 sessionStorage 生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,数据也就被清空了。
版权声明: 本文为 InfoQ 作者【武师叔】的原创文章。
原文链接:【http://xie.infoq.cn/article/b82725c54ab04a7c9b66be555】。文章转载请联系作者。
评论