管中窥豹——HTTP

这里简单总结一下http的相关知识笔记

OSI七层模型指的是什么?

OSI七层模型草图
一台计算机操作系统中的网络过程包括从应用请求(在协议栈的顶部)到网络介质(底部),OSI参考模型把功能分成七个分立的层次。
网络:

  • 第一层:物理层:为数据端设备提供原始比特流的传输的通路(原始比特流的传输)
    • 常见:中继器,集线器,网线等
  • 第二层:链路层:在通信的实体间建立数据链路连接
    • 常见:网卡,网桥,两层交换器
  • 第三层:网络层:为数据在结点之间传输创建逻辑链路,并分组转发数据(数据包)
    • 常见:路由器,多层交换器, 防火墙

主机:

  • 第四层:传输层: 提供应用进程之间的逻辑通信
    • 常见:TCP协议、UDP协议
  • 第五层:会话层:建立端连接并提供访问验证和会话管理;
    • 常见:服务器验证用户登录、断电传输
  • 第六层:表示层:提供数据格式转换服务,解密和加密、图片解码和编码,数据的压缩和解压缩
    • 常见:URL加密,口令加密、图片编解码。
  • 第七层:应用层:访问网络服务的接口,为操作系统或网络应用程序提供访问网络接口
    • 常见:HTTP、DNS等

HTTP的工作原理是什么

详细可参考之前写的一个总结当我们按下url发生了什么

简单来说HTTP的工作原理是

  • 浏览器通过DNS服务器进行域名解析,把URL地址转换成IP地址。
  • 打包http请求
  • 发送http请求(通过TCP协议的三次握手)

    • 我想发一些数据可以吗?
    • 可以的,啥时候发
    • 现在就发,你接着把
  • 服务器接收请求,交给相关进程处理。

  • 相关进程处理请求后,发送给服务器,然后服务器将文件打包发送给浏览器
  • 浏览器接收响应,开始下载并且渲染,将页面呈现在我们面前。

URL的格式是什么?常见的协议有哪些?

URL 其实就是统一资源定位符,其实除了URL之外还有一个URN:统一资源名称,通过名字来进行定位。
图解HTTP
一般URL组成:

  • 协议号:例如HTTP、HTTPS这种的
  • 登录信息:user:pass 这个一般被很多人忽略,如果用github clone远程库的时候,如果不是用SSH方式,而是用HTTP方式每次pull和push的时候就会要求输入账户和密码.也就是输入的这个
  • 服务器地址:这个就很好理解,一看就明白
  • 服务器端口号:这个与前面的协议号相对应,例如最基本的http协议的端口号就是8080,https的端口号就是443.
  • 带层次的文件路径
  • 查询字符串,例如百度的分页就是用查询字符串的方式
  • 片段标识符

常见的协议有哪些

一般来说常见的协议号有

  • http:对应端口号8080
  • https:对应端口号443
  • ssh:对应端口号22
  • ftp:对于的端口号21

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

一般来说HTTP协议和服务器的交互方式有:

  • get:这个是最常用的一个交互方式,一般用于向服务器请求什么数据
  • post:投递,或者发送数据,一般常见于登陆的时候验证表单
  • HEAD:HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息。有的人可能觉得这个方法没什么用,其实不是这样的。想象一个业务情景:欲判断某个资源是否存在,我们通常使用GET,但这里用HEAD则意义更加明确。
  • put:这个方法比较少见, 一般HTML表单也不支持这个请求,和POST很相似都是向服务器发送请求,但有个区别就是:put可以指定资源的存放位置,而POST的存放位置由服务器决定
  • delete:删除某个资源
  • options这个方法很有有趣,不过基本上很少使用,主要用于获取当前URL所支持的方法,如果请求成功会在HTTP头中包含一个”Allow”的,显示所支持的方法如”GET,POST”

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

当服务器响应时,状态码的一些总结说明

  • 客户方错误

    • 100:表示客户端应该继续发生请求
    • 101:表示服务器已经理解了客户端的请求
  • 成功

    • 200:一起正常
    • 201请求已经被实现
  • 重定向

    • 300: 多条路径选择
    • 301:请求的文档已经永久转移
    • 302 :请求的文档已经被暂时放到一个地方去了
    • 304:文档内容无变化,使用本地缓存.
  • 客户端错误

  • 401:请求参数错误
  • 403:服务器已经理解请求,但由于服务器上文件或者目录导致拒绝这次请求.
  • 404:找不到资源

  • 客户端方向错误

  • 500:服务器出现错误,不能完成客户请求
  • 503:服务器临时维护或过载,无法处理请求

报文有哪些部分组成

HTTP请求报文主要有请求行请求头部、和请求数据三部分组成
0_1463882727207_2012072810301161.png

1
2
3
4
5
6
7
<request-line>   请求行

<headers> 请求头部

<blank line> 空格

[<request-body> 请求数据


请求头的格式和作用

上面说过HTTP请求报文主要由请求行请求头部请求数据组成
其中 请头部,用我博客为例子
0_1463884312403_upload-c2b4d43d-8ac7-4e3c-b093-bfecf0dae3cf
这是一个请求头部.
其中:

  • Accept:告诉服务器能够发送那些媒体类型。这里说可以是text/html类似的
  • accept-Encoding:告诉服务器能够发送哪些字符串,这里告知可以发送:gzip, deflate, sdch这些字符串
  • Accept-Language:浏览器支持的语言分别是中文和简体中文,优先支持简体中文。0<q<0.5趋向于前者,0.5<q<1趋向于后者
  • Cache-control:告之浏览器在缓冲的规则。这里是没有缓存.
  • Connection :询问浏览器和服务器是否保持联系,这里keep-alive为,保持
  • cookie:客户端传递的字符串,可能和我的一些登陆信息有关
  • host:服务器主机的域名,就是我们说的域名
  • User—Agent:这里是检测我所使用的浏览器类型和版本号

关于首部的格式和作用

这里以我的博客地址为例子
0_1463890974764_upload-7a345ebe-bdc6-4f31-964a-a8c25e737255

  • age:响应了多长时间,这里显示是响应了56秒
  • Cache-Control:管理缓存。这里显示缓存600之内就一直用这个
  • Connection:服务器是否和客户端保持连接,这里表示是一直保持连接
  • Date:创建HTTP报文的时间和日期,这里表明是2016年5月22号创建的。当然是美国时间
  • Expires:资源失效时间;这里失效时间为2016年5月22号晚上02:21:50,当然如果存在Cache-Control,则优先使用Cache-Control。
  • Vary:属于响应协商首部,是一个首部列表,服务器会根据这些首部的内容挑出最适合的资源版本发给客户端。

Cache-ControlExpires的区别

Expires = 时间,HTTP 1.0 版本,缓存的载止时间,允许客户端在这个时间之前不去检查(发请求)
max-age= 秒,HTTP 1.1版本,资源在本地缓存多少秒。
如果max-age和Expires同时存在,则被Cache-Control的max-age覆盖。
Expires 的一个缺点就是,返回的到期时间是服务器端的时间,这样存在一个问题,如果客户端的时间与服务器的时间相差很大,那么误差就很大,所以在HTTP 1.1版开始,使用Cache-Control: max-age=秒替代。
Expires =max-age + “每次下载时的当前的request时间”
所以一旦重新下载的页面后,expires就重新计算一次,但last-modified不会变化

主体的作用是什么?

实体的主体部分就是HTTP要传输的内容了,一般是图片、视频、HTML文档等。已博客为例,响应主体也就是HTML文档了。
0_1463892314994_upload-902bc859-f37c-465c-9291-512fa491b059


浏览器的缓存如何控制

浏览器的缓存主要通过这几个方面控制:

1.Last-Modified

当浏览器第一次请求一个URL的时候,请求成功,服务器的返回状态是200,内容是你请求的资源,同时会有一个Last-Modified的属性标记次文件在服务器端最后被修改的时间,格式例如:
Last-Modified:Tue, 24 Feb 2009 08:01:04 GMT
如果第二次请求同一个URL的时候,请求头部会有一个if-Modified-Since服务器收到后会和最后一次修改的时间对比,来判断客户端的页面是不是最新的。如果资源没有发生改变则返回304状态码。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。


2.Etag

Etag作用和last-Modified类似,简而言之就是服务器响应时,给请求URL的一个标记,
如果下次再请求同一个URL的时候,请求表头会生成一个If-None-Match,服务器接收到后,会对比两次的Etag值,如果相同则返回304状态码。不同则返回新的内容


3.Expires

在服务器发回响应时候,会发送一个Expires,告之浏览器在过期时间之前访问时,浏览器都可以直接从浏览器缓存中访问数据,而无需在此请求


4.Cache-control

Cache-control为HTTP 1.1版本新增加的一个,同Expires类似,只是Expires=时间,Cache-Control: max-age=秒。

当浏览器第一次请求的时候
浏览器
大致就是这么一个过程
当浏览器第二次请求的时候

浏览器
总的来说,可以分为这几步
当浏览器第二次

  • 先根据(Cache-control/Expires)查看浏览器缓存是否过期。
  • 如果没有过期,直接调用浏览器缓存。
  • 若浏览器缓存过期,则再次向浏览器发送请求,服务器根据if-Modified-SinceIf-None-Match来判断是否返回304,让浏览器从缓存中调取,还是返回200,发送响应请求。
  • 最后浏览器呈现页面在用户面前

最后一点

最后用这个例子来具体说说各个参数代表什么意思?
0_1463900026516_upload-7ecb7d61-ceeb-4537-ad58-ef3332adf35a