你要知道的HTTP

221 阅读7分钟

前言

http的概念,我相信只要是搞互联网的都不陌生,比如说我,用http,用三方的开源库调调接口,一般人都可以很顺利做到,但是真正别人问我一些http实质性相关的一些东西的时候,往往就懵逼,更别谈参加面试了,既然这样,那就学习,记录吧。

HTTP方法有哪些

http请求方法有五种:POST,GET,HEAD,PUT,DELETE,TRACE,OPTIONS,CONNECT

  • GET:向服务器发请求,希望得到一些数据,一般做单向的获取数据,很简单。
  • POST:也是向服务器发送请求,这时候我们是post一个表单,数据比较多,例如上传文件。
  • HEAD:和get差不多,只是返回的数据没有body,仅仅返回的是数据头部信息。一个典型的使用场景,就是当我们要下载一个文件的时候先判断一下该文件的大小,这时候直接head一下就可以了。
  • PUT:add数据到服务器并且替换服务器中指定的资源。
  • DELETE:用于删除服务器指定的资源。
  • TRACE:显示服务器收到的请求信息,比如丢包率等,主要用于诊断和测试。

POST和GET比较

  • 请求数据传输方式不同:GET是把请求信息放在url中,比如name,id等信息,POST是把包装在请求体中,一般是form的形式提交给服务器。
/books/?sex=man&name=Professional HTTP/1.1

这就是一个get请求,我们把一些数据信息直接放在url的后面。

  • 安全性不同:POST请求的数据在请求的body里面,而GET请求的数据在URL中,我们通过缓存就可以很容易拿到请求信息。
  • 数据类型不同:GET请求只允许是ASCII字符,POST无限制。比如在请求数据的时候才有GET请求,查看URL当里面有中文的时候里面会出现很多%%%这种符号,这都是经过base64转换了的,因为get请求数据只能是ASCII字符,so。。。
  • 提交的数据长度不同:GET提交的数据长度是有限制的(这个限制得看浏览器自己了),POST是表单,所以没有限制。
  • 特性:相对服务器来说GET请求更加安全,这里的安全是指 1.幂等:客户端发送一次和发送多次请求效果一样,不会造成服务器数据更改。 2,客户端发送的数据不会改变服务器的状态(我们仅仅想得到数据,不会修改服务器数据),幂等是个很重要的概念,可以记住一下。

POST和PUT比较

这两者都是向服务器新增资源,区别在哪?最重要的区别就是幂等。PUT往往用于修改单一资源,而POST是向资源集合里面加数据。比如:我现在想修改我博客的头像为小猫,那么我就是发个请求,去修改头像小猫,哪怕你提交一万次,你的头像最后还是小猫,这就是幂等;然而如果你想发一篇博客,那么你每次提交一次那文章肯定是新增一篇咯,非幂等。

  总结:PUT是幂等,POST是非幂,这也是两者最最重要的区别。

请求消息Request

  • 请求行
  • 请求头部
  • 空行
  • 请求数据

看一个抓包数据

GET /562f25980001b1b106000338.jpg HTTP/1.1
Host    img.mukewang.com
User-Agent    Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept    image/webp,image/*,*/*;q=0.8
Referer    http://www.imooc.com/
Accept-Encoding    gzip, deflate, sdch
Accept-Language    zh-CN,zh;q=0.8

1.请求行:包含请求类型GET,需要请求的资源/562f25980001b1b106000338.jpg,HTTP的版本号 2.请求头部:包含目的地址,使用的浏览器代理,编码等信息。 3.空行 4.请求数据:这里包含我们的请求数据name,id啥的。

响应消息Respone

  • 响应行
  • 响应头
  • 空行
  • 响应体

状态码

2XX 成功

  • 200 OK,表示从客户端发来的请求在服务器端被正确处理
  • 201 Created 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立
  • 202 Accepted 请求已接受,但是还没执行,不保证完成请求
  • 204 No content,表示请求成功,但响应报文不含实体的主体部分
  • 206 Partial Content,进行范围请求

3XX 重定向

  • 301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
  • 302 found,临时性重定向,表示资源临时被分配了新的 URL
  • 303 see other,表示资源存在着另一个 URL,应使用 GET 方法丁香获取资源
  • 304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况
  • 307 temporary redirect,临时重定向,和302含义相同

4XX 客户端错误

  • 400 bad request,请求报文存在语法错误
  • 401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
  • 403 forbidden,表示对请求资源的访问被服务器拒绝
  • 404 not found,表示在服务器上没有找到请求的资源
  • 408 Request timeout, 客户端请求超时
  • 409 Confict, 请求的资源可能引起冲突

5XX 服务器错误

  • 500 internal sever error,表示服务器端在执行请求时发生了错误
  • 501 Not Implemented 请求超出服务器能力范围,例如服务器不支持当前请求所需要的某个功能,或者请求是服务器不支持的某个方法
  • 503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
  • 505 http version not supported 服务器不支持,或者拒绝支持在请求中使用的 HTTP 版本

Keep-Alive干嘛的

在http1.0时代,每次发送http请求都要经历tcp的握手创建连接,这种操作是很耗时的,也许传送数据的时间还没有创建连接的时间长,这种情况就得不偿失了,所以就有了Keep-Alive,它告诉http这次请求结束后暂时不要关闭连接,等待有后续数据传送直接利用现有连接就行。

HTTP工作原理--在浏览器地址栏键入URL,按下回车后的流程

  • 1.浏览器首先根据url解析dns服务器中对应的ip地址。
  • 2.根据ip地址和端口号,创建web连接。
  • 3.浏览器发送数据包给服务器。
  • 4.服务器根据数据包解析出数据,然后提取数据,定位资源,返回给客户端,并且释放资源。
  • 5.客户端拿到资源后,先判断是否正常返回,然后解析出对应的html数据。
  • 6,完毕,关闭资源。

HTTPS如何保证安全

https主要就是保证数据在链路上传播安全的,主要原理采用:对称加密+非对称加密+CA技术。奇怪了,为啥采用这么复杂的方式啊。我们做个简单的总结性的分析:

  • 对称加密解密数据速度很快。
  • 非对称加密更加安全,但是效率不行。
  • CA就是第三方的认证,防止密钥被篡改。

https原理:加密解密真正的数据采用的是对称加密,但是对称加密的密钥(密钥A)通信双方都是一样的,这是很不安全的,所以我们采用了非对称加密对密钥A进行加密,这次加密仅仅是为了传输密钥A、只会传一次,所以效率问题可以忽略,至于CA技术嘛,要是第三方假冒了怎么办,这里就有个数字签名技术对CA做个认证咯,这样就相对很安全了。