HTTP协议

HTTP简介

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议) 的缩写,是用于从万维网 (WWW:World Wide Web) 服务器传输超文本到本地浏览器的传送协议。

HTTP是一个基于TCP/IP通信协议来传递数据 (HTML 文件, 图片文件, 查询结果等)。

HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。

浏览器行为与HTTP协议


主要处理流程:
1、输入网址并回车
2、解析域名
3、浏览器发送HTTP请求
4、服务器处理请求
5、服务器返回HTML响应
6、浏览器处理HTML页面
7、继续请求其他资源

了解TCP/IP协议栈
  1. 应用层(应用层,表示层,会话层)
    为用户提供所需要的各种服务,例如:HTTP、FTP、DNS、SMTP等.
  2. 传输层
    为应用层实体提供端到端的通信功能,保证数据包的顺序传送及数据的完整性。
    该层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP).
  3. 网络层
    主要解决主机到主机的通信问题。IP协议是网际互联层最重要的协议。
  4. 网络接口层(数据链路层,物理层)
    负责监视数据在主机和网络之间的交换。
HTTP的工作过程

一次HTTP操作称为一个事务,其工作过程可分为四步:
1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。

2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。

如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

请求方法

GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

HTTP状态码

1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求

cookies与session

Cookies是保存在客户端的小段文本,随客户端点每一个请求发送该url下的所有cookies到服务器端。

Session则保存在服务器端,通过唯一的值sessionID来区别每一个用户。SessionID随每个连接请求发送到服务器,服务器根据sessionID来识别客户端,再通过session 的key获取session值。

与Cookie相关的HTTP扩展头

1)Cookie:客户端将服务器设置的Cookie返回到服务器;
2)Set-Cookie:服务器向客户端设置Cookie;
服务器在响应消息中用Set-Cookie头将Cookie的内容回送给客户端,客户端在新的请求中将相同的内容携带在Cookie头中发送给服务器。从而实现会话的保持。

HTTP缓存机制

缓存会根据请求保存输出内容的副本,例如html页面,图片,文件,当下一个请求来到的时候:如果是相同的URL,缓存直接使用副本响应访问请求,而不是向源服务器再次发送请求。
缓存的优点:
减少相应延迟
减少网络带宽消耗

不同位置的缓存

1.Service Worker优先级最高,Service Worker 能够操作的缓存是有别于浏览器内部的 memory cache 或者 disk cache 的。我们可以从 Chrome 的 F12 中,Application -> Service Workers 找到。除了位置不同之外,这个缓存是永久性的,即关闭 TAB 或者浏览器,下次打开依然还在(而 memory cache 不是)。

如果 Service Worker 没能命中缓存,一般情况会使用 fetch() 方法继续获取资源。这时候,浏览器就去 memory cache 或者 disk cache 进行下一次找缓存的工作了。注意:经过 Service Worker 的 fetch() 方法获取的资源,即便它并没有命中 Service Worker 缓存,甚至实际走了网络请求,也会标注为 from ServiceWorker。

2.Memory Cache是内存中的缓存(相对 disk cache 就是硬盘上的缓存). 几乎所有的网络请求资源都会被浏览器自动加入到 memory cache 。但是也正因为数量很大但是浏览器占用的内存不能无限扩大这样两个因素,memory cache 注定只能是个“短期存储”,也就是 TAB 关闭后 memory cache 便就失效了。

memory cache 机制保证了一个页面中如果有两个相同的请求 (例如两个 src 相同的 ,两个 href 相同的 )都实际只会被请求最多一次,避免浪费。

在从 memory cache 获取缓存内容时,浏览器会忽视例如 max-age=0, no-cache 等头部配置,如果不想让一个资源进入缓存,短期也不行,那就需要使用 no-store。

3.Disk Cache也叫 HTTP cache,顾名思义是存储在硬盘上的缓存,因此它是持久存储的,是实际存在于文件系统中的。而且它允许相同的资源在跨会话,甚至跨站点的情况下使用,例如两个站点都使用了同一张图片。

disk cache 会严格根据 HTTP 头信息中的各类字段来判定哪些资源可以缓存,哪些资源不可以缓存;哪些资源是仍然可用的,哪些资源是过时需要重新请求的。当命中缓存之后,浏览器会从硬盘中读取资源,虽然比起从内存中读取慢了一些,但比起网络请求还是快了不少的。绝大部分的缓存都来自 disk cache。

4.网络请求:如果一个请求在上述 3 个位置都没有找到缓存,那么浏览器会正式发送网络请求去获取内容

  • 根据 Service Worker 中的 handler 决定是否存入 Cache Storage
  • 根据HTTP头部的相关字段(Cache-control)等决定是否存入缓存 disk cache
  • memory cache 保存一份资源 的引用,以备下次使用。
失效策略
  • memory cache 是浏览器为了加快读取缓存速度而进行的自身的优化行为,不受开发者控制,也不受 HTTP 协议头的约束,算是一个黑盒。
  • Service Worker 是由开发者编写的额外的脚本,且缓存位置独立.
  • disk cache 其实是我们最熟悉也是说的最多的。主要分为强缓存和协商缓存,浏览器加载一个页面的简单流程如下:
    如果未命中协商缓存,则服务器会将完整的资源返回给浏览器,浏览器加载新资源,并更新缓存。
强制缓存与对比缓存
  • 强制缓存,服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接用缓存,不在时间内,执行比较缓存策略。
    Cache-Control
    Expires
  • 比较缓存,将缓存信息中的Etag和Last-Modified通过请求发送给服务器,由服务器校验,返回304状态码时,浏览器直接使用缓存。
    Etag/If-None-Match策略
    Last-Modified/If-Modified-Since策略

三次握手与四次挥手

  • 三次握手是什么?

    当客户端和服务器端建立连接时,需要进行3次通信。

  • 为什么三次握手?

    • 第一次握手:客户端发送syn(同步序列编号),随机产生seq数据包到服务器,服务端由SYN知道,客户端要求建立联机;

    • 第二次握手:服务端收到请求后要确认联机信息,向A发送ack(确认字符) number=(客户端的seq+1),syn=1,ack=1,随机产生seq=7654321的包;

    • 第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

      为了实现可靠数据传输,TCP 协议的通信双方,都必须维护一个序列号,以标识发送出去的数据包中,哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤。如果只是两次握手,至多只有连接发起方的起始序列号能被确认,另一方选择的序列号则得不到确认。

  • 四次挥手是什么?

    当客户端和服务器端断开连接时,需要进行4次通信。

  • 为什么是四次挥手?
    客户端发送断开连接后,服务端收到请求会向客户端回复ack,此时服务端还有一些收场工作要做,释放资源等,收场工作完成之后再向客户端发送断开连接请求,然后客户端再向服务端返回确认字符ack。

查看评论