HTTP协议初探
HTTP协议初探
什么是http协议?
- rfc文档中文版
- 官方rfc文档位置
- rfc文件,Request For Comments(RFC),是一系列以编号排定的文件
- ietf 组织,国际互联网工程任务组(The Internet Engineering Task Force,简称 IETF)是一个公开性质 的大型民间国际团体,汇集了与互联网架构和互联网顺利运作相关的网络设计者、运营者、投资人和 研究人员,并欢迎所有对此行业感兴趣的人士参与。
- RFC 1945定义了HTTP/1.0版本
- RFC 2616定义了今天普遍使用的一个版本——HTTP 1.1
- RFC 7540定义了HTTP/2.0版本
既然http是超文本传输协议,那么遵守协议的双方是谁呢?
遵守协议的双方
- 浏览器君:ie,chrome ,firefox
- web服务器君:(iis , Apache,Tomcat ,lighttpd , nginx ,http://tengine.taobao.org/ , gws-google )
再来回答什么是http协议
- 不就是客户端往服务端发送一段文本,服务端回复客户端一段文本么。
- 当然,这个过程是不可逆的
抓到这两段文本
可以使用以下工具抓取到这段文本
TOOLS: chrome dev tool ,firefox firebug ,fiddler ……
示例:
可以总结出以下规律
- Http请求由三部分组成,分别是:请求行、消息报头、请求正文
- HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
HTTP 请求命令(动作,谓词 ,METHOD)
GET 和 POST
- GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中。
- GET请求没有请求体,
- GET提交的数据大小有限制,最多只能有1024字节(因为浏览器对URL的长度有限制),而POST方法提交的数据理论上没有限制。(服务端会限制)
- GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。
常见HTTP状态码
- 200 请求被正常处理
- 206 部分请求被成功响应,返回对应的部分(其实不常见,用于断点续下,多线程下载)
- 301 永久重定向
- 302 临时重定向
- 304 你请求的内容没有更新,可以用你本地缓存的(不属于重定向)
- 400 你说的什么,听不懂
- 404 找不到你请求的资源
- 500 服务端出现异常
HTTP报头
类型:
- 普通(通用)报头 General Headers
请求响应都会使用的 - 实体报头 Entity Headers
用来描述请求体或者响应体的报头,跟实体有关 - 请求报头 RequestHeaders 响应报头 Response Headers
出现的地方不同,只会出现在请求和响应上的报头
HOST 报头是必须的请求报头
报头的数量在不断的增加中,来满足互联网需求的变更
可以自定义报头
- 常见普通(通用)报头如下:
- 常见实体报头
- 常见请求报头
- 常见响应报头
如何发出http请求
- 浏览器
- Code
- telnet
- 工具 fiddler postman 等等
- ……
回到问题,什么是HTTP协议
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
HTTP协议永远都是客户端发起请求,服务器回送响应。
HTTP协议的主要特点可概括如下:
- 支持客户/服务器模式。支持基本认证和安全认证。
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象。
- 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
关于应用层协议有一幅很流行的图示:
参考资料:
- http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html
- http://www.cricode.com/1880.html
- https://yq.aliyun.com/articles/5892
- https://tools.ietf.org/html/rfc2616#section-1
- http://www.ruanyifeng.com/blog/2011/03/ietf.html
- http://www.ruanyifeng.com/blog/2009/03/tcp-ip_model.html
- http://www.cnblogs.com/JohnTsai/p/4859801.html
- http://javascript.ruanyifeng.com/htmlapi/websocket.html
- http://man.chinaunix.net/develop/rfc/default.htm
- http://www.ietf.org/rfc/
- https://tools.ietf.org/rfc/index
- 书籍推荐:《图解HTTP》
HTTP协议初探的更多相关文章
- gopher 协议初探
Gopher 协议初探 最近两天看到了字节脉搏实验室公众号上有一篇<Gopher协议与redis未授权访问>的文章,其中对gopher协议进行了比较详细的介绍,所以打算跟着后面复现学习一下 ...
- HTTP协议和HTTPS协议初探
概况 HTTP是hypertext transfer protocol(超文本传输协议)的简写.它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEBserver之间交换数据的过程. HT ...
- (转载)PIM-SM协议初探(一)路由角色选举
PIM是Protocol Independent Multicast(协议无关组播)的简称,表示可以利用静态路由或者任意单播路由协议(包括RIP.OSPF.IS-IS.BGP等)所生成的单播路由表为I ...
- RTP-RTCP-RTSP协议的区别与联系
一.产生的背景 随着互连网的发展,人们已经不满足于传统的HTTP,FTP和电子邮件等文本信息和服务,而对内容丰富多彩的多媒体信息,服务以及多媒体通信方式提出了需求,包括声音,图象,图形,视频信息等等, ...
- 《图解HTTP》读书笔记
目前国内讲解HTTP协议的书是在太少了,记忆中有两本被誉为经典的书<HTTP权威指南>与<TCP/IP详解,卷1>,但内容晦涩难懂,学习难度较大.其实,HTTP协议并不复杂,理 ...
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- (一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
(一)----使用HttpClient发送HTTP请求(通过get方法获取数据) 一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 “超文本传输协议”,是 ...
- 《图解HTTP》读书笔记(转)
reference:https://www.cnblogs.com/edisonchou/p/6013450.html 目前国内讲解HTTP协议的书是在太少了,记忆中有两本被誉为经典的书<H ...
- Android之网络----使用HttpClient发送HTTP请求(通过get方法获取数据)
[正文] 一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 "超文本传输协议",是一种为分布式,合作式,多媒体信息系统服务,面向应用层 ...
随机推荐
- zookeeper原理与实践(一)----zookeeper的基本功能
我们现在围绕两个问题来学习zookeeper: 什么是zookeeper? zookeeper基础知识 什么是zookeeper: zookeeper是hadoop下面的一个子项目,是一个分布式协调服 ...
- poj3468(线段树区间更新&区间求和模板)
题目链接: http://poj.org/problem?id=3468 题意: 输入 n, m表初始有 n 个数, 接下来 m 行输入, Q x y 表示询问区间 [x, y]的和: C x y z ...
- NOIp2013 火柴排队【逆序对/思维】 By cellur925
题目大意:给你两列数\(ai\)和\(bi\),你可以交换每列数中相邻的两个数,求一个最小交换次数使\(\sum_{i=1}^{n}(a_i-b_i)^2\) 最小. 最后满足条件的两个序列一定是各个 ...
- JS高级学习历程-11
[继承] 在php,一个类去继承另一个类,本类实例化出来的对象,既可以调用本身类的成员,也可以调用父类的成员. 在javascript继承主要通过原型实现,构造函数继承一个对象,构造函数的实例会拥有被 ...
- code blocks无法输出中文解决方法
是CodeBlocks编译器设置问题,在CodeBlocks菜单 settings -> compiler and debugger settings -> global compiler ...
- 【手撸一个ORM】第一步、实体约定和描述
一.约定 数据实体必须实现 IEntity 接口,该接口定义了一个int类型的Id属性,既每个实体必须有一个名称为Id的自增主键. 若数据表的主键列名称不是Id,可以通过 [MyKey("主 ...
- Netty(1-2)Discard Client
一.DiscardClientHandler import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelFuture; import ...
- NET Core准备:使用Hyper-V安装Ubuntu Server 16.10
NET Core准备:使用Hyper-V安装Ubuntu Server 16.10 概述 Hyper-V是微软的一款虚拟化产品,和VMWare一样采用的hypervisor技术.它已经被内嵌到Win1 ...
- 洛谷P1057 传球游戏
f[i][j]表示第i轮j拿到球的方案数 转移:f[i][j]=f[i-1][j+1] +f[i-1][j+-1].注意: 边界f[0][1]=1; 还有当j=1或N时 #include<ios ...
- 使用 xib 设置 button 等款等高
很多时候需要使用平分的控件来布局,当然xib中可以之间使用 UIToolBar 使用 UIBarButtonItem 添加弹簧即可完成平均分布 但是,直接使用 button 也可以实现平均布局