OSI 七层模型
- OSI/RM,Open System Interconnection Reference Model ,开放式系统互联通信参考模型,简称 OSI
- 一种概念模型,由国际标准化组织(ISO)提出
- 一个试图使各种计算机在世界范围内互连为网络的标准框架
OSI 将计算机网络体系结构划分为七层
- 主机层
- 第七层:应用层(Application Layer)
- 应用层直接和应用程序接口并提供常见的网路应用服务
- 应用层也向第六层表示层发出请求
- 第六层:表示层(Presentation Layer)
- 把数据转换为能与接收者的系统格式兼容并适合传输的格式
- 第五层:会话层(Session Layer)
- 负责在数据传输中设定和维护电脑网络中两台电脑之间的通讯连接
- 第四层:传输层(Transport Layer)
- 把传输表头(TH)加至数据以形成数据包
- 传输表头包含了所使用的协定等传送资讯
- 第七层:应用层(Application Layer)
- 媒介层
- 第三层:网络层(Network Layer)
- 提供路由和寻址功能,并具有一定的拥塞控制和流量控制的能力
- 第二层:数据链路层(Data Link Layer)
- 在两个网络实体之间提供数据链路连接的建立、维持和释放管理
- 第一层:物理层(Physical Layer)
- 物理层确保原始的数据可在各种物理媒体上传输。
- 第三层:网络层(Network Layer)
常见的
- HTTP 协议在应用层
- TCP 协议在传输层
- IP 协议在网络层
HTTP 的工作原理
- HTTP ,HyperText Transfer Protocol,超文本传输协议
- 当我们在客户端向服务器发送一个请求,服务器接收请求,并向客户端发送一个响应,客户端接收并展示,HTTP 协议在这个过程中规定了请求和响应的格式以及行为。
- 请求:请求行;请求头;空行(回车);消息体;
- 响应:响应行;响应头;空行(回车);消息体;
写个简单例子:
//请求
GET / HTTP/1.1 //方法 + 路径 + 协议/版本号
Host: www.xxx.com //这里是域名,告诉服务器要请求的域名
Accept: text/html //请求的东西,比如这里向服务器要一个html文档
... //这里都是key: value 格式,告诉服务器需求
//响应
HTTP/1.1 200 OK //对应请求,返回结果
Content-Type: text/html;charset=utf-8 //告诉浏览器返回了 html 文档
<!doctype html><html><h1>响应</h1></html> //返回的 html 文档内容
URI和URL
- URI,Uniform Resourse Identifier,统一资源标识符
- URL,Uniform Resourse Locator,统一资源定位符
- URN,Uniform Resourse Name,统一资源名称
其中 URL 和 URN 是 URI 的子集,URI 的通常表现形式就是 URL
几种常见的URL
http(s)://www.xxx.com/xxx/index.html
ftp://ftp.xxx/xx.txt
mailto:xxx@email.com
telnet://192.168.1.1:80
HTTP 与服务器交互的方法
最常见的有 GET,POST,从服务器获取资源,除此之外还有
- HEAD:与GET类似,但不获取资源,仅获取资源的信息,是否存在,是否被修改
- PUT:向服务器写入资源
- TRACE:客户端向服务器发送请求的时候,中间可能会经过防火墙、代理、网关等一些应用程序,每个中间节点都可能修改HTTP请求,TRACE方法允许客户端在最终请求到达服务器的时候,查看这个请求最终变成怎样了
- DELETE:要求服务器删除请求的URL
- OPTIONS:请求服务器告知其支持的所有功能
状态码(Status Code)
- 用于表示请求的结果
- 100~1999 用于指定客户端相应的某些动作
- 200~299 用于表示请求成功
- 200 表示请求和响应成功
- 300~399 用于已经移动的文件并且常被包含在定位信息中指定新的地址信息
- 301 请求的文档被移到别处,浏览器自动访问新的URL
- 304 客户端缓存了文档,再次请求这个文档时,如果满足条件,则使用缓存,并返回 304
- 400~499 用于指出客户端的错误
- 403 资源不可用,服务器理解请求,但拒绝处理
- 404 无法找到指定位置的资源
- 500~599 用于支持服务器的错误
- 500 服务器出现问题,不能完成客户的请求
- 503 服务器由于维护或负载过重未能响应
- 505 服务器不支持请求中指明的 HTTP 版本
浏览器缓存控制
浏览器在请求已经访问过的URL的时候,会判断是否使用缓存。
判断是否使用缓存主要通过判断缓存是否在有效期,通过两个字段来判断
- Expires: GMT时间
- 响应会包含这个信息,过期时间,缓存的时候会将文件和这个信息保存,当浏览器再次访问这个文件的时候,浏览器会将当前时间和这个信息时间作比较,如果在过期时间内,则直接使用本地缓存的文件,状态码为200 form xxx cache ,如果超过了过期时间,则重新发送请求
- Cache-Control: max-age=数值
- 直接设置的过期时间,单位为秒,原理同Expires,由于使用的秒数,会比Expires准确,所以优先级比Expires高,浏览器会先判断Cache-Control
当浏览器判断缓存过期之后,接着进行判断缓存的文件是否有更新
判断缓存是否有更新
- Last-Modified 和 If-Modified-Since
- 第一次请求时,服务器响应一个 Last-Modified,表示文件最后修改时间,缓存过期后,浏览器发送请求的时候会将该时间放在 If-Modified-Since 中一起发给服务器,服务器收到请求后,会将该时间与服务器中该文件的最后修改时间作比较,如果最后修改时间较新,则重新响应整个文件,如果最后修改时间较旧,则响应 HTTP 304,告知浏览器使用缓存
- Etag 和If-None-Match:
- 第一次请求时,服务器响应一个 Etag 字段,表示文件的唯一的字符串,当文件被修改时,该字符串回改变,缓存过期后,浏览器发送请求的时候会将该字符串放在 If-None-Match 中一起发给服务器,服务器收到请求后,会将 If-None-Match 中的字符串与服务器中的文件的 Etag 作比较,如果相同,则响应 HTTP 304,告知浏览器使用缓存,如果不同,则重新响应整个文件,并包含新的 Etag 字段。
- Etag 的优先级比 Last-Modified 高,因为 Last-Modified 判断只能精确到秒,而Etag是直接判断文件是否被修改
网友评论