HTTP

HTTP简介

超文本传输协议HTTP的主要特点

  • 支持客户/服务器模式

  • 简单快速

  • 灵活

  • 无连接

    • 限制每次连接只处理一个请求,服务器处理完客户的请求并收到客户的应答后就断开连接
    • 默认使用长连接,即服务器需要等待一定时间后才断开连接,以保证连接特性
  • 无状态

    • 协议对于事物处理没有记忆能力,如果后续处理需要前面的信息则必须重传。

HTTP请求结构

截屏2021-02-13 下午9.11.09
  • 请求行:

    • 请求方法:Get、Post等
    • URL:URL
    • 协议版本号:HTTP/1.0、1.1
  • 请求头部:

    • 若干报头组成
    • 设置请求的参数
  • 请求正文:

    • 数据体,只在post中用到,表示上传的数据

HTTP响应结构

截屏2021-02-13 下午9.16.40
  • 状态行:
    • 协议版本、状态码、状态码描述
  • 响应头部
    • 说明客户端要使用的附加信息
  • 响应正文

请求/响应的步骤

  • 客户端连接到Web服务器,建立TCP连接

  • 发送HTTP请求

  • 服务器接受请求并返回HTTP响应

    • Web服务器解析该请求,定义请求资源,然后将该资源副本写到TCP套接字,由客户端读取。
  • 释放TCP连接

    • 若HTTP连接模式为close则服务器主动关闭连接
  • 若为keep-alive则该连接会保持一段时间,在该时间内还可以接收数据。

    • 在http早期,每个http请求都要求打开一个tpc socket连接,并且使用一次之后就断开这个tcp连接。使用keep-alive可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。
  • 客户端浏览器解析HTML内容

在浏览器地址栏输入URL,按下回车后经历的流程

  1. DNS解析
    1. 浏览器缓存
    2. 系统缓存
    3. 路由器缓存
    4. IPS服务器缓存
    5. 域名服务器缓存
    6. 顶级域名服务器缓存
  2. 建立TCP连接
  3. 发送HTTP请求
  4. 服务器处理请求并返回HTTP报文
  5. 浏览器解析渲染页面
  6. 连接结束

HTTP状态码

五种可能的取值
截屏2021-02-13 下午9.28.19
常见的状态码
截屏2021-02-13 下午9.29.13

GET请求和POST请求的区别

从三个层面来解答:

  • HTTP报文层面:GET将请求信息放到URL,POST放到报文体中
    • 安全性上两者并没有太大的区别
    • 数据长度上GET放到URL中,浏览器会对长度做限制,POST放到报文体中,没有限制。
  • 数据库层面:GET符合幂等性和安全性,POST不符合
    • 幂等性:对数据库的一次操作和多次操作获得的结果一致
    • 安全性:对数据库的操作没有改变数据库的数据
    • GET做查询操作,故不会改变数据库的数据
    • POST做添加等操作,会改变数据库的数据
  • 其他层面:GET可以被缓存、被存储,而POST不行

Cookie和Session的区别

Cookie简介
  • 是由服务器发给客户端的特殊信息,以文本的形式存放在客户端
  • 客户端再次请求时,会把Cookie回发
  • 服务器接收到后,会解析Cookie生成与客户端相对应的内容
Cookie的设置及发送过程
截屏2021-02-13 下午9.42.12
  1. 客户端发送HTTP请求到服务端
  2. 服务端发送HTTP响应到客户端,其中包括Set-Cookie头部
  3. 客户端再发送HTTP请求到服务端,包括Cookie头部
  4. 服务器端发送对应响应

Session简介

  • 服务端端机制,在服务器上保存信息
  • 解析客户端请求并操作Session id,按需保存状态信息
Session的实现方式

两种:

  1. 使用Cookie来实现
    截屏2021-02-13 下午9.45.58
    1. 服务器给每个Session分配一个唯一的JSESSIONID并通过Cookie发送给客户端
    2. 当客户端发起新的请求时将在Cookie头中携带JSESSIONID,如此服务器可以找到客户端对应的Session
  2. 使用URL回写来实现
    1. 服务器在发送给浏览器页面的所有链接中都携带JESSSIONID参数,这样客户端点击任何链接都会把JSESSIONID待会给服务器,如果直接在浏览器输入URL来请求该资源,Session就会匹配不到

Tomcat对Session的实现同时使用上述两种,如果发现客户端支持Cookie就继续使用Cookie停止URL回写,如果不支持Cookie就一致使用URL回写。

Cookie和Session的区别

  • Cookie数据存放在客户浏览器上,Session数据存放在服务器上
  • Session相对Cookie更安全
  • 若考虑减轻服务器负担,应该使用Cookie