HTTP协议基础(HTTP 1.1)

http协议(目前主要是HTTP 1.1)是目前世界上使用最多的应用层协议,是互联网的基础,同时它也是程序开发中最基础的协议,所有程序员都应该知道http协议。这里根据本人目前的工作学习情况,参考一些规范,简单总结一下HTTP协议的一些基础知识。 主要参考规范: rfc2616 - Hypertext Transfer Protocol – HTTP/1.1 rfc3986 - Uniform
摘要由CSDN通过智能技术生成

http协议(目前主要是HTTP 1.1)是目前世界上使用最多的应用层协议,是互联网的基础,同时它也是程序开发中最基础的协议,所有程序员都应该知道http协议。这里根据本人目前的工作学习情况,参考一些规范,简单总结一下HTTP协议的一些基础知识。
主要参考规范:
rfc2616 - Hypertext Transfer Protocol – HTTP/1.1
rfc3986 - Uniform Resource Identifier (URI): Generic Syntax
rfc7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing
rfc7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content
下面的东西,如有问题,烦请指出,谢谢!

一、http特点
1、客户端/服务端模式
http协议是典型的服务端客户端模式,一切http请求都是由客户端发起,服务端只能被动接受。浏览器是很大的一类客户端,这种一般也叫作b/s,可以说http既能支持传统的c/s,也支持b/s。不过因为服务端不能主动发起通讯请求,所以http在开发即时应用时有先天不足,html5的websocket和新出的http2.0中的server push功能是对这一重大缺陷的改进。
2、无状态
http本身对事务无记忆能力,本身不保存通讯上下文,也就是这一次通讯不知道前一次通讯的结果,几次通讯之间本身可以不干扰。这样做的好处是服务器不用管之前的通讯,可以应答地很快,同时能够很简单的扩展服务端,缺点就是单独靠http无法完成复杂的逻辑。
要解决http本身不维持状态的问题,需要依靠自定义的协议,这种协议一般很简单,主要是在http报文中加一个唯一标识,同时依赖这个唯一标识保存一些会话信息。这个标识叫法有很多,比如sessionId、token等等,它们的基本作用是差不多的,就是标识请求方的综合身份(这个综合身份需要具体业务解释);具体的会话信息理论上双方都可以保存,但是现在为了安全,一般都由服务端保存。
3、弱连接(连接可主动断开)
http1.1之前,每次通讯完成后都有断开连接,这样影响了传输效率。http1.1引入Connection: keep-alive,并作为默认属性,使得建立一次tcp可以进行多次http通讯。虽然有keep-alive,但是仍然不能认为http连接是长期可靠的,客户端服务端都可以主动断开连接的。通常的做法是客户端在最后一次请求时携带Connection: close主动要求断开,服务端是一段时间无请求就主动断开。一般的基于原生tcp的应用都会想法设法维持连接,绝大多数时候连接断开属于异常行为,而http协议在通讯完成时断开连接是合理也是很正常的。
4、灵活简单
http对具体body报文格式如何解释并不作规定,可以方便地传输各种格式的报文,http本身对tcp进行了很好的封装,同时它的无状态、弱连接的特性,让大家在使用http协议通讯时基本不用关心tcp层的情况,开发者无需了解很多网络编程的知识即可快速有效地使用http。

二、Http Request
1、Http Request 基本格式
这里写图片描述
上图中标红的符号说明:
SP:代表白空格,也就是ASCII的0x20
CRLF:代表\r\n,也就是回车换行,\r是ASCII中的0x0d,\n是ASCII中的0x0a
COLON:代表英文冒号,也就是ASCII中的0x3a

2、Http Method
基于rfc2616的HTTP1.1规定了8个方法,分别是:

  • OPTIONS:用于查询服务器或指定资源的选项信息的请求,比如支持的方法以及一些特殊的配置,实际中本人仅仅是在跨域POST上传文件时碰到过这种请求,关于这个具体可以查看这两篇博文,讲了跨域与OPTIONS请求:
    http://www.ruanyifeng.com/blog/2016/04/cors.html
    http://stylechen.com/options-cors.html?utm_source=tuicool&utm_medium=referral

  • GET:rfc2616建议get做成幂等的、只读安全的、用于获取服务器数据的方法,实际情况中GET主要被用在获取网页静态数据、查询类接口、jsonp请求中,算是一个万能请求。

  • POST:用来向服务器提交数据,这个定义很宽泛,给了服务端很大的主动性,因此POST实际中也是一个万能的请求。最常见的是使用POST进行提交数据服务器写操作,一些webapi设计上也有使用POST提交json/xml等数据进行查询功能

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值