HTTP协议

176 阅读4分钟

HTTP协议特点

  • 简单快速
  • 灵活
  • 无连接
  • 无状态

简单快速

每个资源(比如图片、页面)都通过 url 来定位。这都是固定的,在http协议中,处理起来也比较简单,想访问什么资源,直接输入url即可。

灵活

http协议的头部有一个数据类型,通过http协议,就可以完成不同数据类型的传输。

无连接

连接一次,就会断开,不会继续保持连接。

无状态

客户端和服务器端是两种身份。第一次请求结束后,就断开了,第二次请求时,服务器端并没有记住之前的状态,也就是说,服务器端无法区分客户端是否为同一个人、同一个身份。 有的时候,我们访问网站时,网站能记住我们的账号,这个是通过其他的手段(比如 session)做到的,并不是http协议能做到的。

HTTP报文组成

  • 请求报文
    • 请求方法
    • 请求url
    • http协议及版本
    • 报文头
    • 报文体
      请求报文

    请求行:包括请求方法、请求的url、http协议及版本。 请求头:一大堆的键值对。 空行指的是:当服务器在解析请求头的时候,如果遇到了空行,则表明,后面的内容是请求体。 请求体:数据部分。

  • 响应报文
    • 报文协议及版本
    • 状态码及状态描述
    • 响应头
    • 响应体
      响应报文

    状态行:http协议及版本、状态码及状态描述。 响应头 空行 响应体

HTTP方法

  • GET
  • POST
  • put
  • DELETE
  • HEAD

get和post区别

get在浏览器退回时是无害的,post会再次提交请求 [重要] get产生的url地址可以被收藏,post不可以 get请求会被浏览器主动缓存,post不会,除非手动设置 [重要] get请求只能进行url编码,post支持多种编码方式 get请求参数会被完整保留在历史记录里,post的参数不会保留,为了防止CSRF攻击,很多公司把get统一改成了post [重要] get请求在url中传送的参数长度有限制(基本是2kb),post无限制 [重要] 对参数的数据类型,get只能接受ASCII字符,post无限制 get比post更不安全,因为参数暴露在url上,所以不能用来传递敏感信息 [重要] get参数通过url传递,post放在request body中

HTTP状态码

状态码分类

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

常见HTTP状态码

200 OK:客户端请求成功 206 Partial Content:客户发送了一个带有Range头的GET请求,服务器完成了它 301 Moved Permanently: 所请求的页面已经转移至新的url 302 Found: 所请求的页面已经临时转移至新的url 304 Not Modified: 客户端有缓冲的文档并发出了一个条件性的请求,服务器告诉客户,原来的缓冲的文档还可以继续使用 400 Bad Request: 客户端请求有语法错误,不能被服务器理解 401 Unauthorized: 请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用 403 Forbidden: 对被请求页面的访问被禁止 404 Not Found: 请求的资源不存在 500 Internal Server Error: 服务器发生不可预期的错误,原来的缓冲文档还可以继续使用 503 Server Unavailable: 请求未完成,服务器临时过载或宕机

持久链接/http长连接

  • 轮询:http1.0中,客户端每隔很短的时间,都会对服务器发出请求,查看是否有新的消息,只要轮询速度足够快,例如1秒,就能给人造成交互是实时进行的印象。这种做法是无奈之举,实际上对服务器、客户端双方都造成了大量的性能浪费。
  • 长连接:HTTP1.1中,通过使用Connection:keep-alive进行长连接,。客户端只请求一次,但是服务器会将继续保持连接,当再次请求时,避免了重新建立连接。

HTTP 1.1默认进行持久连接。在一次 TCP 连接中可以完成多个 HTTP 请求,但是对每个请求仍然要单独发 header,Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。

长连接中的管线化

  • 长连接时,默认的请求这样的:

    请求1 --> 响应1 -->请求2 --> 响应2 --> 请求3 --> 响应3

  • 长连接中的管线化,请求是这样的:

    请求1 --> 请求2 --> 请求3 --> 响应1 --> 响应2 --> 响应3


管线化就是,我把现在的请求打包,一次性发过去,你也给我一次响应回来。