协议

  先来说说什么是协议,协议其实指的是通信协议(Communications Protocol),也称传输协议。Wiki中的描述的是这样的,通信协议定义了通信中的语法学,语义学和同步规则以及可能存在的错误检测与纠正。通信协议在硬件,软件或者两者之间皆可实现。为了交换大量信息,通信系统使用通用格式(协议)。每条信息都有明确的意义使得预定位置给予响应,并独立实现回应指定的行为,通信协议须参与实体都同意才能生效。为了达成一致,协议必须要有技术标准. 编程语言在计算方面也应有相应标准,所以在这个方面可以用编程语言做类比: 编程语言是为了模式化的计算,而传输协议为了更畅通的交流.

Http

  Http协议也一样,是为了更畅通的交流。在Http之前,我们先来说说Html。Html大名是超文本标记语言(HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、JavaScript一起被众多网站用于设计网页、网页应用程序以及移动应用程序的用户界面。网页浏览器可以读取HTML文件,并将其渲染成可视化网页。HTML描述了一个网站的结构语义随着线索的呈现,使之成为一种标记语言而非编程语言。而我们要谈到的Http呢,大名是超文本传输协议(HyperText Transfer Protocol,缩写:HTTP)。这样就不难理解Http的作用了,Http就是为了方便传输与接收Html的一种协议。

  我们知道OSI标准的七层网络协议中由顶至下依次是,应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。Http是最顶部的会话层协议。事实上HTTP可以在任何互联网协议或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用,所以其在TCP/IP协议族使用TCP作为其传输层。

请求方法

  关于Http中的请求方法,Wiki上是这么描述的:

  HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:

  GET
    向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在网络应用程序中。其中一个原因是GET可能会被网络爬虫等随意访问。参见安全方法。浏览器直接发出的GET只能由一个url触发。GET上要在url之外带一些参数就只能依靠url上附带querystring。
  HEAD
  与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
  POST
  向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。每次提交,表单的数据被浏览器用编码到HTTP请求的body里。浏览器发出的POST请求的body主要有有两种格式,一种是application/x-www-form-urlencoded用来传输简单的数据,大概就是"key1=value1&key2=value2"这样的格式。另外一种是传文件,会采用multipart/form-data格式。采用后者是因为application/x-www-form-urlencoded的编码方式对于文件这种二进制的数据非常低效。
  PUT
  向指定资源位置上传其最新内容。
  DELETE
  请求服务器删除Request-URI所标识的资源。
  TRACE
  回显服务器收到的请求,主要用于测试或诊断。
  OPTIONS
  这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
  CONNECT
  HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。

  HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当符合下述的方法各自的语义定义。

  各位开发小伙伴们最熟悉的应该是GET, PUT, POST, DELETE这几个方法了。

版本

   http目前最为流行的版本应该是Http1.1与Http2这两个版本。其中Http1.1版本由这样几个特点:

  默认采用持久连接,并能很好地配合代理服务器工作。还支持同时发送多个请求,以便降低线路负载,提高传输速度。

  HTTP/1.1相较于HTTP/1.0协议的区别主要体现在:

  • 缓存处理
  • 带宽优化及网络连接的使用
  • 错误通知的管理
  • 消息在网络中的发送
  • 互联网地址的维护
  • 安全性及完整性

  Http2版本于2015年5月作为互联网标准正式发布。

状态码

   403,404,500这些是非常常见的状态码。我们知道一个Http的完整的过程保护请求于响应。其中每个响应的第一行都是状态行,其内容依次是当前HTTP版本号,3位数字的状态码,以及描述状态的短语,彼此由空格分隔。

  例如我访问百度所拿到的Response:

  

  第一行就显示了我当前使用的是Http/1.1版本,百度正常给了我我返回值,对应的状态码为200,OK。

  状态码其实可以按照百位的数字来进行分类:

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求
  • 4xx请求错误——请求含有词法错误或者无法被执行
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误

长连接

  前面提到了,HTTP1.1相比1.0规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。这样长连接在一个连接中可以重复在多个请求/回应使用。持续连线的方式可以大大减少等待时间,因为在发出第一个请求后,双方不需要重新运行TCP握手程序。

  

  待续咯。。。

最新文章

  1. 【less】Bootstrap / Less 学习
  2. Servlet、JSP中页面跳转的方式
  3. WinForm程序全局捕捉异常处理办法
  4. virtualbox无法安装VBoxLinuxAdditions.run
  5. JS的event对象--知识点总结
  6. 解决 Android Studio 乱码问题
  7. 操作系统:进程管理和IO控制
  8. vs2010 使用SignalR 提高B2C商城用户体验(二)
  9. HDU 4800/zoj 3735 Josephina and RPG 2013 长沙现场赛J题
  10. 二分图最大匹配(匈牙利算法Dfs模板)
  11. Spring之SpringMVC的Controller(源码)分析
  12. React的学习(上)
  13. 实现quartz定时器及quartz定时器原理介绍(转)
  14. Python基础学习(第一周)
  15. k8s经典实战—搭建WordPress
  16. linux安装nodejs运行vue程序
  17. RENAME方法进行分区改造
  18. python 任务计划
  19. 【PHP】当mysql遇上PHP
  20. 整理一下原生js的dom操作

热门文章

  1. Seafile对接Amazon S3存储后端
  2. 基于Jenkins的开发测试全流程持续集成实践
  3. ConcurrentHashMap源码走读
  4. js 获取当前日期和时间
  5. 【译】如何使用docker-compose安装anchore
  6. VSC 创建 Net Core 3.0 版本 WebAPI
  7. python3 tornado api + angular8 + nginx 跨域问题
  8. 2019 DevOps 必备面试题——容器化和虚拟化
  9. SolrCloud 高可用集群搭建
  10. sqlserver默认隔离级别下并发批量update同一张表引起的死锁