OSI 七层模型

OSI:Open System Interconnection Refer Model 开放式系统互联通信参考模型,是由国际标准化组织提出的一种概念模型,是一个试图让各种计算机在全世界范围内连成网络的标准框架;它将网络通信分成七个层面。从距离用户最近至最底层简述如下:

  • 应用层 Application:用户交互的对象,用户通过这一层进行信息交互。通俗点例如chrome浏览器、或者发邮件的outlook就是这一层。
  • 表示层 Presentation:这一层是操作系统所在的层,处理数据,转化加密等确保另一个系统能识别你的数据。
  • 会话层 Session:负责你的电脑与服务器的通信连接与维护,创建连接→请求→响应。
  • 传输层 Transport:把传输表头加至数据以形成数据包,控制调节数据的传输,决定类似一次发送多少数据的问题。
  • 网络层 Network:路由的工作层,它决定路径的选择和转寄。
  • 数据链路层 Data Link:交换机的工作层,负责网络寻址、错误侦测和改错。
  • 物理层 Physical:最底层的物理联网介质和数据传输实现,网线、连接器及比特流的传输等。

HTTP 的工作原理

HTTP 全称 Hyper Text Transfer Protocol 即超文本传输协议;它是一个客户端终端和服务器端请求和应答的标准。它的请求和响应步骤如下:

  • 建立连接:客户端与服务器端建立一个TCP连接。
  • 发起请求:客户端向服务器端发起Http请求,会发送请求报文,由请求行、消息报头和请求正文组成。
  • 返回响应:服务器端接收到请求并进行解析,定位请求资源,给客户端发送响应报文,由状态行、消息报头和响应正文组成。
  • 释放TCP连接:服务器关闭TCP连接。(如果连接模式是keepalive的话会保持一段时间可继续接受请求)

URI 的格式及常见的协议

URI 全称Uniform Resource Identifier 统一资源标志符,是一个用于标识一个互联网资源名称的字符串。由两个子集构成,通过描述资源位置确定资源的URL,以及通过名字来识别确定资源的URN。它的格式如下:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<hash>
http:// user:pass@www.example.com :80 /dir/index ?uid=1&nam=2 #ch1

  • <scheme> 协议方案名 常见的有http、https等。
  • <user>:<password> 用户的登录信息 现在一般不会把登录信息放在url中。
  • <host> 服务器地址 用户一般使用域名方便记忆,浏览器经DNS解析去访问对应IP地址。
  • <port> 端口号 服务器的进程接口,80是http协议默认的端口号,ftp协议默认21端口,https默认443端口。
  • <port> 路径 找到服务器后再去对应的路径下寻找资源。
  • <params> 在一些协议中需要参数来访问资源,参数用名值对用隔开。
  • <query> 查询字符串,常见的是get请求中data以此形式传给服务器。
  • <hash> 片段标识符-哈希,之前作为页面锚点的时候见过。

常见的协议有 Http、Https、FTP、SSH等。

HTTP 协议几种和服务器交互的方法

  • GET:得到,最常用的方法,向服务器发送请求要求获取某个资源。
  • HEAD:头,亦即不需要数据主体只想得到描述资源信息的头部,一般用于查看资源信息、查看状态码看下资源是否存在、查看首部看下资源有没有被修改。
  • POST:投递,好理解,就是向服务器发数据,一般是在html表单中用于向服务器提交表单信息的。
  • PUT:放,就是向服务器写入资源,修改某个内容。
  • TRACE:跟踪,这个方法会在最后发往服务器时,返回一个TRACE响应给客户端,告诉客户端最终服务器收到的请求报文是什么样的。
  • DELETE:删除,要求服务器删掉给定url下的资源,服务器可能不会支持。
  • OPTIONS:其他,用来查询服务器支持哪些功能。

状态码200,301, 304,403 , 404 , 500,503分别代表什么意思

  • 200 OK 请求已成功 根据请求方式的不同会有不同的反馈内容
  • 301 Moved Permanently 所请求的资源被永久性地移动到另一个地方 响应会返回新的url 下次客户端会按照新的url去访问
  • 304 Not Modified 客户端有缓存的文档 当再一次发起请求时 服务器经比对后发现文档内容并没有变化时就会返回此状态码 让客户端使用本地缓存
  • 403 Forbidden 服务器已经理解请求 但拒绝执行 一般是因为没有对应的权限
  • 404 Not Found 请求失败 在服务器上找不到你所请求的资源
  • 500 Internal Server Error服务器出错了 无法完成客户端的请求
  • 503 Service Unavailable服务器过载了 目前无法处理客户端的请求

报文由哪几部分组成

http报文有请求报文和响应报文,是一个简单的格式化数据块,它由以下3个部分组成:

  • start line:起始行 对报文进行简单描述
  • header:包含一些属性的首部块
  • body:数据的主题部分,有些请求不需要返回这部分

请求头的格式和作用

作用:为请求添加额外的信息,来告诉服务器客户端的信息和能力,服务器可以据此为客户端提供更好的响应。
格式:是名/值的形式;名字后面跟着冒号,加上可选的空格,再加上字段值,最后回车或换行。
0_1463029655966_upload-264bf520-20fb-459c-986e-9cbf5da71be7
范例

  • GET/HTTP/1.1 请求方法、协议、版本号 ←这是请求报文起始行
  • Host:服务器地址
  • Connection:连接方式 一般请求后就断开 图中是keep-alive,可以继续接收请求。
  • Accept:说明我这个客户端可以接受哪些类型的资源。
  • Upgrade-Insecure-Requests:自动升级请求,在https承载的页面上不允许出现http请求,出现就会报警,这个属性会自动替换https请求。
  • User-RefererAgent:用户代理也就是浏览器客户端自身的信息。
  • Referer:客户端是从哪里跳转过来的。例如我们从百度跳到饥人谷官网,这里就会是百度的网址。
  • Access-Encoding:客户端可以接受的编码类型。
  • Accept-Language:客户端可以解析接受的语言。
  • Cookie:服务器端为了辨识用户身份而留在客户端的数据,发送请求时客户端会把cookie一起发送给服务器。

首部的格式和作用

作用:HTTP的首部向请求或响应报文添加了一些附加信息,它是一些名/值对的列表。它分为通用首部、请求首部、响应首部、实体首部和拓展首部。
格式:名字后面跟着冒号,加上可选的空格,再加上字段值,最后回车或换行。
0_1463034116314_upload-858a3ce0-998c-4ae7-ad2f-44aab51e1cff
范例

  • HTTP/1.1 200 OK 协议/版本 状态码 释义 ←这是响应报文起始行 不属于首部
  • Server:属于响应信息性首部,服务器用的是哪一种及版本 图中用的是nginx 版本1.6.2
  • Data:属于通用信息性首部,提供日期和事件说明报文是什么时候创建的。
  • Content-Type:属于实体内容首部,告诉客户端主体的数据类型。
  • Transfer-Encoding:属于通用信息性首部,传输的编码方式,图中chunked是分块传输例如小说分一章一章传输。
  • Connection:属于通用信息性首部,可以指定请求/响应的连接选项,图中keep-alive在响应后连接依然可以存在一段时间。
  • X-Powered-By:显示此资源用什么技术开发及对应版本 感觉只有PHP
  • Expires:属于实体缓存首部,提示缓存过期的时间,超过这个时间就需要重新获取资源。
  • Pragma:属于通用缓存首部,另一种随报文传送的指示,并不专用于缓存。
  • Cache-Control:属于通用缓存首部,随报文传送缓存指示,图中private是指私人缓存每个人不一样。
  • Content-Encoding:属于实体内容首部,告诉客户端对主体执行的编码方式。
  • Vary:属于响应协商首部,是一个首部列表,服务器会根据这些首部的内容挑出最适合的资源版本发给客户端。

主体的作用

  • 实体的主体部分就是HTTP要传输的内容了,一般是图片、视频、HTML文档等。下面饥人谷首页的响应实体,也就是HTML文档了。
    0_1463037793472_upload-3892ad8a-24a1-4d3a-9bf2-23649fda8de5

浏览器缓存是如何控制

  • 是什么:浏览器缓存是web缓存中的一个类型,与公用缓存不同,浏览器一般都有内建的私有缓存,会缓存已经访问过的页面,也就是把资源复制了一份放在本地,缓存可以减少网络带宽的压力、降低服务器的压力、也能让我们更快地打开页面获得资源。
  • 缓存页面、过期时间:在我们首次请求资源或页面时,原始服务器利用HTTPcache-control首部expires首部给文档加上了过期时间,标明了保质期。在保质期内请求已缓存的资源时,浏览器就不会向服务器发送请求而是直接使用本地缓存。
  • 过期后的再验证:当过了保质期以后呢,这个时候浏览器就会向服务器发起请求同时附带过期时间。若文档与缓存的副本不一样服务器就响应新的文档给浏览器,同时浏览器会继续缓存新的文档;若服务器比对后发现文档没有变化,就会发个新的过期时间让浏览器继续使用本地缓存。对缓存再验证最有用的两个首部是If-Modified-Since和If-None-Match。最后引用博客园的一张图面解释,更加清晰。
    • If-Modified-Since:当资源过期时,再请求时若发现资源带有Last-Modified(最后修改日期)声明时,会带上If-Modified-Since:Last-Modified Data发给服务器,收到后服务器就会比对最后修改时间,若没被修改就返回304 Not Modified响应报文并且附带新的过期事件;若被修改了就返回新的文档和过期时间。
    • If-None-Match:如果在资源过期后再请求时发现资源带有Etage声明(资源在服务器的唯一标识,生成规则服务器自定),会带上If-None-Match:Etage值发给服务器,收到后服务器就会进行比对校验来决定返回200还是304,响应与If-Modified-Since相同。
      0_1463123874986_201211281402442505 (1).png

下图各个参数是什么意思


General:概述

  • Request URL:请求的资源的URL也就是位置
  • Request Method:客户端向服务端发出请求的方法,图中是用PUT方法
  • Status Code:状态码,图中是200 表示成功OK
  • Remote Address:资源所在的IP地址

Response Headers 响应头

  • Connection:连接方式;图中是keep-alive,在请求后的一段时间内还是相连的,可直接继续发送请求。
  • Content-Length:主体的长度或尺寸
  • Content-type:主体的类型
  • Date:报文创建的时间
  • Server:服务端软件及版本,图中是Nginx/1.6.2
  • X-Powered-By:开发资源的技术是Express

Request Headers 请求头

  • Accept:我这个客户端可以接受哪些类型的资源
  • Accept-Encoding:客户端可以接受的编码类型
  • Accept-Language:客户端可以解析接受的语言
  • Cookie:服务器端为了辨识用户身份而留在客户端的数据,发送请求时客户端会把cookie一起发送给服务器。
  • Host:服务器地址
  • Origin:所请求的资源的源
  • Referer:客户端是从哪里跳转过来的。例如我们从百度跳到饥人谷官网,这里就会是百度的网址
  • User-Agent:用户代理也就是浏览器客户端自身的信息
  • X-Requested-With:请求的方式,这里是AJAX