一、HTTP协议

Hypertext Transfer Protocol,超文本传输协议,HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。

  1. HTTP 优点
  1. 灵活可扩展。一个是语法上只规定了基本格式,空格分隔单词,换行分隔字段等。另外一个就是传输形式上不仅可以传输文本,还可以传输图片,视频等任意数据。
  2. 请求-应答模式,通常而言,就是一方发送消息,另外一方要接受消息,或者是做出相应等。
  3. 可靠传输,HTTP是基于TCP/IP,因此把这一特性继承了下来。
  4. 无状态。
  1. HTTP 缺点
  1. 无状态,有时候,需要保存信息,比如像购物系统,需要保留下顾客信息等等,另外一方面,有时候,无状态也会减少网络开销,比如类似直播行业这样子等,这个还是分场景来说。
  2. 明文传输,即协议里的报文(主要指的是头部)不使用二进制数据,而是文本形式。这让HTTP的报文信息暴露给了外界,给攻击者带来了便利。
  3. 队头阻塞,当http开启长连接时,共用一个TCP连接,当某个请求时间过长时,其他的请求只能处于阻塞状态,这就是队头阻塞问题
  1. HTTP/1.0 HTTP1.1 HTTP2.0版本之间的差异
  • HTTP 0.9

1991年,原型版本,功能简陋,只有一个命令GET,只支持纯文本内容,该版本已过时。

  • HTTP 1.0

任何格式的内容都可以发送,这使得互联网不仅可以传输文字,还能传输图像、视频、二进制等文件。除了GET命令,还引入了POST命令和HEAD命令。http请求和回应的格式改变,除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据。只使用 header 中的 If-Modified-Since 和 Expires 作为缓存失效的标准。不支持断点续传,也就是说,每次都会传送全部的页面和数据。通常每台计算机只能绑定一个 IP,所以请求消息中的 URL 并没有传递主机名(hostname)

  • HTTP 1.1

http1.1是目前最为主流的http协议版本,从1999年发布至今,仍是主流的http协议版本。引入了持久连接( persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。长连接的连接时长可以通过请求头中的 keep-alive 来设置引入了管道机制( pipelining),即在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率。HTTP 1.1 中新增加了 E-tag,If-Unmodified-Since, If-Match, If-None-Match 等缓存控制标头来控制缓存失效。支持断点续传,通过使用请求头中的 Range 来实现。使用了虚拟网络,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。新增方法:PUT、 PATCH、 OPTIONS、 DELETE。

  • http1.x版本问题

在传输数据过程中,所有内容都是明文,客户端和服务器端都无法验证对方的身份,无法保证数据的安全性。HTTP/1.1 版本默认允许复用TCP连接,但是在同一个TCP连接里,所有数据通信是按次序进行的,服务器通常在处理完一个回应后,才会继续去处理下一个,这样子就会造成队头阻塞。http/1.x 版本支持Keep-alive,用此方案来弥补创建多次连接产生的延迟,但是同样会给服务器带来压力,并且的话,对于单文件被不断请求的服务,Keep-alive会极大影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间。

  • HTTP 2.0

二进制分帧 这是一次彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧":头信息帧和数据帧。头部压缩 HTTP 1.1版本会出现 「User-Agent、Cookie、Accept、Server、Range」 等字段可能会占用几百甚至几千字节,而 Body 却经常只有几十字节,所以导致头部偏重。HTTP 2.0 使用 HPACK 算法进行压缩。多路复用 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,这样子解决了队头阻塞的问题。服务器推送 允许服务器未经请求,主动向客户端发送资源,即服务器推送。请求优先级 可以设置数据帧的优先级,让服务端先处理重要资源,优化用户体验。

  1. HTTP 常见状态码

RFC 规定 HTTP 的状态码为「三位数」,第一个数字定义了响应的类别,被分为五类:

  • 1xx: 代表请求已被接受,需要继续处理。
  • 2xx: 表示成功状态。
  • 3xx: 重定向状态。
  • 4xx: 客户端错误。
  • 5xx: 服务器端错误。

200 OK:请求正常处理完毕
204 No Content:请求成功处理,没有实体的主体返回
206 Partial Content:GET范围请求已成功处理
301 Moved Permanently:永久重定向,资源已永久分配新URI
302 Found:临时重定向,资源已临时分配新URI
303 See Other:临时重定向,期望使用GET定向获取
304 Not Modified:用于浏览器缓存的状态代码。 如果响应尚未修改,则客户端/用户可以继续使用相同的响应/缓存版本。 例如,如果资源已自特定时间以来被修改,浏览器可以请求。 如果没有,则发送状态代码 304。 如果已修改,则发送状态代码 200 以及资源
307 Temporary Redirect:临时重定向,POST不会变成GET
400 Bad Request:请求报文语法错误或参数错误
401 Unauthorized:需要通过HTTP认证,或认证失败
403 Forbidden:请求资源被拒绝
404 Not Found:无法找到请求资源(服务器无理由拒绝)
500 Internal Server Error;服务器故障或Web应用故障
503 Service Unavailable;服务器超负载或停机维护

更详细的状态码解释

  1. HTTP 请求方法

二、HTTP请求行、请求头、请求体

  1. HTTP请求报文解剖 :HTTP请求报文由3部分组成( 请求行+请求头+请求体

  1. 请求行属性
  • ①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过,当前的大多数浏览器只支持GET和POST,Spring 3.0提供了一个HiddenHttpMethodFilter,允许你通过“_method”的表单参数指定这些特殊的HTTP方法(实际上还是通过POST提交表单)。服务端配置了HiddenHttpMethodFilter后,Spring会根据_method参数指定的值模拟出相应的HTTP方法,这样,就可以使用这些HTTP方法对处理方法进行映射了。
  • ②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL
  • ③是协议名称及版本号。
  1. HTTP请求报文头属性
  • ④是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。

报文头属性是什么东西呢?我们不妨以一个小故事来说明吧。

  • 快到中午了,张三丰不想去食堂吃饭,于是打电话叫外卖:老板,我要一份[鱼香肉丝],要12:30之前给我送过来哦,我在江湖湖公司研发部,叫张三丰。
  • 这里,你要[鱼香肉丝]相当于HTTP报文体,而“12:30之前送过来”,你叫“张三丰”等信息就相当于HTTP的报文头。它们是一些附属信息,帮忙你和饭店老板顺利完成这次交易。
  • 常见的HTTP请求报文头属性
  1. Accept :请求报文可通过一个“Accept”报文头属性告诉服务端:客户端接受什么类型的响应。 Accept属性的值可以为一个或多个MIME类型的值。

    更多关于MIME类型,大家请参考:http://en.wikipedia.org/wiki/MIME_type

  2. Cookie :客户端的Cookie就是通过这个报文头属性传给服务端的哦!

  3. Referer :表示这个请求是从哪个URL过来的,假如你通过google搜索出一个商家的广告页面,你对这个广告页面感兴趣,鼠标一点发送一个请求报文到商家的网站,这个请求报文的Referer报文头属性值就是http://www.google.com。

  4. Cache-Control :对缓存进行控制,如一个请求希望响应返回的内容在客户端要被缓存一年,或不希望被缓存就可以通过这个报文头达到目的。

  5. Accept-Charset:告诉服务器能够发送哪些字符集

  6. Accept-Encoding:告诉服务器能够发送哪些编码方式

  7. Accept-Language:告诉服务器能够发送哪些语言

  8. Host:指定要请求的资源所在的主机和端口

  9. User-Agent 作用:告诉服务器,客户端使用的操作系统、浏览器版本和名称

  10. Client-IP:提供了运行客户端的机器的IP地址

  11. From:提供了客户端用户的E-mail地址

  12. TE:告诉服务器可以使用那些扩展传输编码

  13. Expect:允许客户端列出某请求所要求的服务器行为

  14. Range:如果服务器支持范围请求,就请求资源的指定范围

更详细的请求头解释

  1. 请求体
  • ⑤是报文体,它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.htmlparam1=value1&param2=value2”的方式传递请求参数。
  • 请求体的多种格式
  1. multipart/form-data
  2. application/x-www-from-urlencoded
  3. raw
  4. binary
  • multipart/form-data

以表单形式提交,主要是上传文件用它,在http中格式为

  • application/x-www-from-urlencoded以键值对的数据格式提交

  • raw
  • 选择text,则请求头是: text/plain
  • 选择javascript,则请求头是: application/javascript
  • 选择json,则请求头是: application/json (如果想以json格式传参,就用raw+json就行了)
  • 选择html,则请求头是: text/html 选择application/xml,则请求头是: application/xml

  • binary

相当于Content-Type:application/octet-stream,从字面意思得知,只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件。(一般用的不多)

  • postman中 Params和Body的区别

Params 它会将参数放入url的?后面提交到后台(带到请求的接口链接里)

Body是放在请求体里面

三、HTTP响应行、响应头、响应体

  1. 响应行:
  • ①报文协议及版本;
  • ②状态码及状态描述;
  1. 响应头
  1. Cache-Control(对应请求中的Cache-Control)Cache-Control:private 默认为private 响应只能够作为私有的缓存,不能再用户间共享
  2. Content-Type:text/html;charset=UTF-8 告诉客户端,资源文件的类型,还有字符编码,客户端通过utf-8对资源进行解码,然后对资源进行html解析
  3. Content-Encoding:gzip 告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。
  4. Date: Tue, 03 Apr 2018 03:52:28 GMT 这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题。
  5. Server Server:Tengine/1.4.6 这个是服务器和相对应的版本,只是告诉客户端服务器信息。
  6. Transfer-Encoding:chunked 这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。
  7. Expires:Sun, 1 Jan 2000 01:00:00 GMT 这个响应头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本。
  8. Last-Modified: Dec, 26 Dec 2015 17:30:00 GMT 所请求的对象的最后修改日期(按照 RFC 7231 中定义的“超文本传输协议日期”格式来表示)
  9. Connection:keep-alive 这个字段作为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个tcp连接发送http请求。
  10. ETag: “737060cd8c284d8af7ad3082f209582d” 就是一个对象(比如URL)的标志值,就一个对象而言,比如一个html文件,如果被修改了,其Etag也会别修改
  11. Refresh: 5; url=http://baidu.com 用于重定向,或者当一个新的资源被创建时。默认会在5秒后刷新重定向。
  12. Access-Control-Allow-Origin: * *号代表所有网站可以跨域资源共享,如果当前字段为*那么Access-Control-Allow-Credentials就不能为true
    Access-Control-Allow-Origin: www.baidu.com 指定哪些网站可以跨域资源共享
  13. Access-Control-Allow-MethodsAccess-Control-Allow-Methods:GET,POST,PUT,DELETE 允许哪些方法来访问
  14. Access-Control-Allow-CredentialsAccess-Control-Allow-Credentials: true 是否允许发送cookie。默认情况下,Cookie不包括在CORS请求之中。

更详细的响应头解释

  1. 响应体

由Content-Type决定,一般有以下类型:

  • application/javascript
  • application/html
  • application/json

最后推荐直接看官方文档

参考文章

HTTP,request,response相关推荐

  1. JS HTTP 请求库哪家强?Axios,Request,Superagent,Fetch 还是 Supertest

    JS HTTP 请求库哪家强?Axios,Request,Superagent,Fetch 还是 Supertest Web 开发中客户端与服务器间的交互非常重要,它有利于客户端应用高度动态化.用户通 ...

  2. BLOCK层基本概念:bio,request,request_queue

    Summary bio 代表一个IO 请求 request 是bio 提交给IO调度器产生的数据,一个request 中放着顺序排列的bio 当设备提交bio 给IO调度器时,IO调度器可能会插入bi ...

  3. spring bean的使用范围:singleton,prototype,request,session,application

    singleton prototype bean的学习 /** 结论一:singleton bean 只有一个:prototype bean每次都会创建新的 结论二:对于集合对象,会有两个user对象 ...

  4. 简单了解request与response

    本文对 request. response 简单描述,未涉及到具体的浏览器缓存.重定向.请求转发等代码部分. 一.Web服务器,浏览器,代理服务器 在看 response.request 对象之前,先 ...

  5. Scrapy - Request 和 Response(请求和响应)

    Requests and Responses:http://doc.scrapy.org/en/latest/topics/request-response.html Requests and Res ...

  6. Request和Response的使用以及html连接java同步到数据的实例

    1,Request和Response的概述 Request是请求对象,Response是响应对象. request:获取请求数据 浏览器会发送HTTP请求到后台服务器[Tomcat] HTTP的请求中 ...

  7. java | (二十七) JSP(1)指令,隐式对象,动作,标签,EL表达式

    目录 java脚本代码 JSP指令 Page指令 include指令 taglib指令 JSP隐式对象 out.response JSP作用域隐式对象 jsp动作 include动作 forward动 ...

  8. 浏览器,服务器,浏览器和服务器之间的通信协议

    1,world wide web 我们通常所说的web就是指world wide web.一般来讲,这一种通过浏览器来访问资源的技术.我们经常说的上网,应该大部都是指的是上万维网(web),但是我们经 ...

  9. koa2 一网打尽(基本使用,洋葱圈,中间件机制和模拟,源码分析,核心点,生态)

    原文https://juejin.im/entry/5bfbe5a76fb9a049cb186cfa/detail koa homepage 优秀的下一代 web 开发框架. Koa 应用程序不是 H ...

最新文章

  1. PHP处理Oracle的CLOB
  2. pb 修改数据窗口种指定字段位置_如何在PB数据窗口中修改数据---设置数据窗口的更新属性...
  3. 系统由单体架构到微服务架构到底是如何演进的?
  4. c if 判断select已经选择的值_Golang语言基础教程:if分支语句
  5. NIO的Buffer
  6. EasyRE 寒假逆向生涯(5/100)
  7. 剑指Offer-LeetCode刷题
  8. xxd命令转换二进制十六进制文件
  9. CISCO CCNA路由器密码管理
  10. 安装SQL Server 2012遇到“需要更新的以前的Visual Studio 2010实例.”
  11. FPGA入门实验试验报告
  12. WPS快捷键之 EXCEL高级
  13. 办公室计算机知识考试试题,办公室人员电脑操作基本技能方面测试题--绝对经典...
  14. IaaS PaaS SaaS DaaS基础设施即服务、平台即服务、软件即服务、数据即服务详解
  15. Excel的Index函数详解
  16. iOS 通过商品短链接跳转京东商品详情页
  17. Markdown内嵌图片的解决方法
  18. React 基础学习
  19. 优盘安装红帽linux系统,从U盘安装 redhat linux 6.0及centos 6.4
  20. x86架构下的安卓虚拟化

热门文章

  1. 20190216 vagrant up 失败问题
  2. 记录一下Memcached的用法:
  3. 同域下跨文档通信iframe和window.open
  4. Xtreme ToolkitPro 初使用
  5. linux上安装samba
  6. 访问Webservice错误
  7. windows组件中没有IIS解决方法
  8. mysql 免安装版配置方法(经测试可行)
  9. c++ try catch
  10. php母版页怎么,ASP.NET