HTTP协议

357 阅读9分钟

TCP/IP协议族的五层模型

物理层

定义物理设备如何传输数据:电脑硬件: 网卡,端口,网线以及光缆

数据链路层

数据链路层在通信的实体间建立数据链路的连接

网络层

为数据在结点之间传输创建逻辑链路

  1. IP协议:把各种数据包传输给对方
  2. IP地址:指明了节点被分配到的地址
  3. MAC地址: 网卡所属的固定地址

传输层

为用户提供可靠的端到端的服务,如果我们请求的数据过大,会再这一次进行分割传输,接收到接受到之后会再进行组装,传输层像高层屏蔽了下层数据通信的细节

  1. TCP/IP协议
  2. UDP协议

应用层

为应用软件提供服务,构建与tcp协议之上,屏蔽来了网络传输相关的细节

  1. FTP
  2. DNS
  3. HTTP协议

前后端如何通信

  1. Ajax
  2. Websocket
  3. CORS

HTTP协议

特点

  1. 无连接:tcp连接在请求接受后就会断开
  2. 无状态:服务端是无法区分上次一连接和这一次连接是不是同一个身份
  • http本身是无状态的,session的状态是基于 服务端返回一个身份标识,客户端每次请求带上这个标识,如果客户端不带这个标识,服务端是无法认出来的

HTTP版本和区别

  1. HTTP 0.9
  • 只有一个GET命令
  • 没有header等描述数据的信息
  • 服务器发送完毕,就关闭TCP链接
  1. HTTP 1.0
  • 增加了POST、PUT等命令
  • 增加了status code 和 header
  • 增加了多字符集的支持、多部分发送、权限、缓存
  • 一个http请求就要在客户端创建一个TCP链接,创建完链接,服务器返回内容之后,TCP连接就关闭掉。
  1. HTTP 1.1
  • 支持持久连接:可以在一个TCP连接里面发送多个HTTP请求
  • 支持pipeline: 虽然一个TCP连接里面可以发送多个HTTP请求,在没有设置pipeline的情况下,服务器根据HTTP请求的顺序,处理完一个再处理下一个。如果设置了pipeline服务器就哪个先处理完,哪个就先返回。
  • 增加了host:通过host可以区分请求的同一台物理服务器上那个web服务
  • 数据以字符串的方式进行传输
  1. HTTP 2.0
  • 数据以二进制形式进行传输
  • 同一个连接里面发送多个请求不在需要按照顺序处理
  • 头信息的压缩以及推送【服务器可以主动提供发起请求】等提高效率的功能
  • 推送功能的应用:当我们给客户端返回的页面中有需要请求的资源的时候,可以把页面需要请求的资源,在服务器端直接请求。不许要等结果返回到客户端,客户端在重新和服务器请求了。

三次握手

  • tcp三次握手是tcp建立连接的过程,所谓连接就是客户端知道服务端的发送和接受能力是否正常,服务端知道客户端发送和接受能力是否正常
  1. 第一次握手:客户端向服务器发送报文,服务器接受到信息之后,知道了客户端的发送能力正常
  2. 第二次握手:服务端向客户端发送报文,客户端接受到信息之后,知道了服务端的发送能力和接受能力正常
  3. 第三次握手:客户端再次向服务端发送报文,服务端接收到信息之后,知道了客户端的发送和接收能力正常
  4. 至此,三次握手完成,客户端和服务端都确定了双方的发送和接受能力,可以进行数据传输了
  • 为什么要进行三次握手

网络传输是有延时的,因为中间要经过光纤和代理服务器。如果客户端向服务器发送创建连接的请求之后,服务器直接返回数据包给客户端,如果数据包因为网络原因丢失,这样客户端就一直没有接收到服务器返回的东西,如果客户端设置了超时时间,关闭连接,重新创建,这个时候服务端不知道客户端是否接收到,服务端的端口就一直保持开的状态,等待客户端发送http请求,这个时候就会导致服务端的资源浪费。所以需要三次握手来确保客户端和服务端及时察觉到网络原因导致连接失败的情况,规避因为网络原因导致服务器开销的问题。

四次挥手??????????????

请求报文

请求行

http方法、页面地址、http协议极其版本

请求头

key:value

空行

请求体

服务端需要的参数

响应报文

状态行

响应的状态码 http协议及其版本

响应头

空行

响应体

method

  1. GET :获取资源
  2. POST:传输资源
  3. PUT:更新资源
  4. DELETE:删除资源
  5. HEAD:获取报文首部

POST和GET的区别

  1. X GET请求会被浏览器主动缓存,POST不会:比如小说网站我们加入收藏夹之后,下次在断网的情况下访问,仍然可以看到收藏的内容。
  2. GET请求只能进行url(ascii)编码,POST支持多种编码 编码的目的是为了减少传输数据的体积
  3. X GET请求会被完整的保存在浏览器历史记录中,POST中的参数不会被保留(CRFS攻击)
  4. X GET请求在URL中传送的参数是有长度限制的,POST没有限制
  5. X GET请求在浏览器回退时是无害的,POST会再次发起请求
  6. GET比POST更安全:因为参数直接暴露在URL中,所以不能用来传递敏感信息
  7. X GET参数通过URL传递,POST放在Request body中

code

  1. 1XX:只是信息-表示请求已接受,继续处理
  2. 2XX:成功-表示请求已被成功接受
    • 200(OK):客户端请求成功
    • 206(Partial Content):客户端发送了一个带有Range头的GET请求,服务器完成了它-视频量或者音频量很大的时候,按照range头中指定范围返回
  3. 3XX:重定向:要完成请求必须进行更进一步操作
    • 301(Moved Permanently) 所请求的页面已经永久转移到新的url
    • 302(Found)所请求的页面已经临时转移到新的url
    • 304(Not Modified) 客户端有缓存的文档,并发出了一个条件性请求,服务器告诉客户端原来的缓冲文档可以继续使用
  4. 4XX:客户端错误-请求有语法错误或请求无法实现
    • 400 (Bad Request)客户端请求有语法错误,不能被服务器理解
    • 401 (Unauthorized)请求未经授权,这个状态码必须和WWW-Authenticate请求头一起使用
    • 403 (Forbidden) 禁止访问
    • 404(Not Found) 资源不存在
  5. 5XX:服务端错误-服务器未能实现合法的请求
    • 500 (Internal Server Error):服务器发生错误
    • 503 (Server Unavailable) 服务器过载或者宕机

缓存(Cache-Control)

Cache-Control的可选值

  1. public:http请求返回的过程中,经过的任何路径,包括代理服务器,包括客户端(浏览器),都可以对返回的内容进行缓存
  2. private:只有发起请求的客户端可以进行缓存(浏览器)
  3. no-cache:任何地方都不进行缓存,要去服务端验证
  4. must-revalidate:去服务端重新请求
  5. proxy-revalidate:使用在缓存服务器端缓存过期的时候
  6. no-store: 永远都要去服务器中拿去新的
  7. no-transform:

缓存的到期时间

1.Cache-Control: max-age = <seconds> 客户端 2.Cache-Control: s-maxage = <seconds> 代理服务器 3.Cache-Control: max-stale = <seconds> max-age过期之后,

  • cache-control:max-age = 100
  • cache-control: public private 客户端缓存 还是代理服务器缓存
  • cache-control: must-revalidate 缓存过期后必须去服务端验证之后才能在客户端继续使用
  • cache-control: no-cache no-sotre 是否使用缓存

缓存的分类

协商缓存

  • last-modified 配合if-modifined-since

服务器下发last-modified的响应头,下次再次请求的时候,把last-modified的值通过请求头if-modifined-since发送给服务器,服务器进行验证

  • etag 配合 if-none-match进行验证

通过数据签名,每个资源都有唯一的数据签名,如果资源被修改,签名也会变更。

强缓存

  • expires(服务器下发的过期的绝对时间)
  • Cache-Control: max-age === 3600 浏览器的相对时间

如果服务器和浏览器的时间不一致,以Cache-Control为准

https链接创建的过程以及为什么https就是安全的

http2的信道复用为什么能提高性能

持久连接/长连接

  • Conection:keep-alive
  1. 1.1版本

为什么需要长链接

管线化

  1. 管线化是通过持久连接完成的,HTTP1.1支持
  2. 只有GET和HEAD请求可以进行管线化,而POST是有所限制的
  3. 初次建立连接的时候不应该启动管线化,因为服务端不一定支持管线化
  4. 浏览器默认是没有开启管线化的

一个完整的HTTP请求的过程

  1. 建立TCP连接
  2. Web浏览器向Web服务器发送请求命令
  3. Web浏览器发送请求头信息
  4. Web服务器应答
  5. Web服务器发送应答头信息
  6. Web服务器想浏览器发送数据
  7. Web服务器关闭TCP连接

Cookie

  1. 通过Set-Cookie设置,服务器设置之后,浏览器下次请求就会带上

Cookie的值

  1. max-age、expires设置过期时间
  2. HttpOnly:无法通过document.cookie访问

HTTPS

对称加密

  1. 私钥:服务器通过私钥进行解密
  2. 公钥:使用公钥进行加密,然后再进行数据传输

非对称加密