HTTP 协议知识学习
说明:这篇文章主要是对 HTTP 的基础知识进行总结,做 web 开发对网络这方面还是有必要去学习了解的。
一、HTTP基本概念说明
HTTP 全称 (Hyper Text Transfer Protocal)超文本传输协议,是用于万维网(WWW:World Wide Web)服务器传输超文本到电脑本地浏览器的一种传送协议。
HTTP 是基于 TCP/IP通信协议进行数据传输的。HTML 文件、图片文件等都可通过 HTTP 协议传输。
HTTP 是应用层协议,因为其简洁、快速的方式,已经成为internet中应用最为广泛的一种网络传输协议,所有 WWW 开头的文件都必须遵守这个标准。
二、HTTP 发展历史
1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 26166定义了今天普遍使用的一个版本——HTTP 1.1。
三、HTTP 工作原理
HTTP协议工作与 客户端——服务端架构上,浏览器作为 HTTP 客户端通过 URL向HTTP服务器也就是 Web服务器发送请求。Web服务器根据收到的请求,向客户端浏览器发送响应消息。
Web服务器:目前最主流的三个Web服务器是Apache Nginx IIS。还有我们都比较熟悉的:Tomcat、Jboss、WebLogic等。
四、HTTP的三大特性
HTTP是无连接的:无连接的意思就是限制每次连接只处理一个请求,服务器处理完请求、并受到客户端应答之后,即断开连接。采用这种方式可以节省传输的时间。
HTTP是媒体独立的:意思是,只要客户端和服务端知道如何处理数据内容,那么任何数据类型都可以通过 HTTP来发送。客户端和服务端指定使用适合的MIME-type内容类型。一句话就是可以传输任意类型的对象。
HTTP 是无状态的:HTTP 协议是无状态协议,无状态指协议对于事务处理是没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,必须重传,这样可能导致每次传输的数据量增大。另一方面,在服务器不需要先前信息时,它的答应就较快。
思考?HTTP无状态这一特性会出现什么问题 如何解决
比如说做一个购物车程序,HTTP 无状态的特性就导致不知道用户之前倒到底选了那些商品。于是两种用于保持HTTP 连接状态的技术就诞生了,想必已经猜到了,就是 Cookie 和 Session(会话)了。有了 Cookie这样的技术实现,服务器在接收来自客户端的请求时,就能通过分析存放于请求头中的 Cookie得到信息,从而进行相应的操作。具体实现如各种网页登录时,有记住我这个选项,就是通过 Cookie 技术实现的。
五、HTTP URL详细介绍
HTTP 使用统一资源标识符即为(Uniform Resource Identifiers)简称 URI 来传输数据和建立连接。URL 是一种特殊类型的 URI ,包含了用于查找某个资源足够的信息。URL 全称为(UniformResourceLocator)也叫统一资源定位符,是互联网上用来标识某一处资源的地址。
HTTP 组成:由这条URL为例
https://localhost:8080/index/login.html?name=xnc&ID=123#xxx
从上面这条 URL 可以看出,一条完整的 URL 有以下几部分组成
1、协议部分:这条 URL 用的是 https 协议。
2、域名部分:该 URL 的域名为 jayedc.github.io
为什么这个域名没有加 www 呢,原因是这是二级域名。github是主域名,jayedc 是主机名。同理,www也是一个主机名。
3、端口部分:跟在域名后就是端口号,如 localhost:8080 这里8080就是端口号,在一条 URL 中、端口号并不是必须存在的,如果省略了该部分,将采用默认端口(80)。
4、虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,就是虚拟目录部分。虚拟目录也不是 URL必须的部分。这条 URL 的虚拟目录部分为index
5、文件名部分:从最后一个”/“开始到第一个“?”为止,这一段称为文件名部分,文件名部分也不是必须的部分,如果省略该部分,则使用默认的文件名。这条 URL 的文件名部分为login.html
6、锚部分:从“#”开始到最后,都是锚部分,这条 URL 锚部分为 more,锚部分也不是 URL 必须的部分。这条 URL 的锚部分为 xxx
7、参数部分:从“?”开始到“#”为止的部分称为参数部分,又称为搜索部分、查询部分。这条 URL没有参数部分,参数可以允许有多个,参数与参数之间使用&号分隔。这里的参数为name=xnc&ID=123
六、HTTP与 HTTPS 的区别
1、HTTP 的 URL 由 http://开头,HTTPS 的 URL 为 https://开头
2、HTTP 是不安全的,HTTP 是安全的
3、HTTP 标准的端口是80,HTTPS的标准端口为443
4、在 OSI 网络模型中,HTTP 工作于应用层,而 HTTPS 的安全传输机制工作在传输层
5、HTTP无法加密,而 HTTPS 对传输的数据加密
6、HTTP 无需证书,而 HTTPS 需要 CA 机构wosign 颁发的 SSL 证书
七、URI与 URL 的区别
URI分为 URL与 URN :
URI (uniform resource identifier)统一资源标识符 ,用来标识一个唯一资源。
Web 上可以用的每一种资源,如图片、视频、文件等都是用 URI 来定位的。URI 分为3部分组成。
- 访问资源的命名机制
- 存放资源的服务器主机名
- 资源自身的名称,由路径表示,着重强调资源。
URN(uniform resource name)统一资源命名,作用就像是一个人的名字,通过名字来命名资源,例如P2P下载中使用的磁力链接是URN的一种实现。
URL (uniform resource locator)统一资源定位器,作用就是这个人的所在地址。换句话说,就是URN确定了人的身份,URL 提供找到他的方式。
八、HTTP 请求消息 Request

(1-1)
HTTP 请求报文 request,主要分为四部分。
1 | 这是一个 GET 请求的 request |
报文首部 图1-1
1、请求行(request line):请求包括请求的类型,要访问的资源URI,HTTP 版本消息 Request URL 说明请求要访问的资源以及所使用的 HTTP 版本。这个 GET 请求中 /img/baidu_85beaf5496f291521eb75ba38eacbd87.svg 为访问的资源,HTTP/1.1则是版本信息。
2、请求头部(request header): 请求头部,请求行下一条就是请求头部信息,指服务器要使用的附加信息。
- User-Agent :客户端浏览器的类型和版本。
- Accept : 请求的对象类型。如果是“/”表示任意类型,如果是指定的类型,则会变成 “类型/”
- Referer:表示一个来源,告诉服务器是从哪个页面链接请求过来的,服务器可以获得一些信息用于处理。如统计访问人数。
- Accept-Encoding :页面编码种类。
- Accept-Language : 使用的语言种类。
3、空行:请求头部后必须要有空行,无论报文主体有没有内容,必须有空行。
4、报文主体:报文主体也就是请求数据,可以添加任意类型的数据。只有 POST 方法的请求才会有请求实体。这里是 Get 请求所以没有请求实体。
Post请求例子

(1-2)
1 | 红色框中第一行为请求行。 |
九、HTTP 响应消息 response

(1-3)
响应报文:当收到 Get 或者 Post 方法发来的请求后,服务器就要对报文进行响应。

1、状态行 : 状态行给出了服务器的http版本,以及一个响应代码。响应代码是服务器根据请求进行查找后得到的结果的一种反馈,共有5大类。分别以1、2、3、4、5开头。
2、消息报头:附带的消息
Accept-Ranges : 用于告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源,可指定的字段值有两种,可处理范围请求时指定其为bytes,反之则指定其为none.
Cache-Control : 响应过期时间 ,
Content-Length : 服务器发送给浏览器数据的长度。
- Content-Type : 服务器发送给浏览器数据类型。
Date : 生成响应的日期和时间。
Etag : 用来帮助服务器控制Web端的缓存验证。
- Expires: 响应过期时间。
- Last-Modified: 服务器资源最后修改时间。
- Server:服务器类型。
- Connection:服务器和浏览器连接状态。
1 | 状态码 |
GET请求与POST请求的区别
1、先从表面上去别 GET请求 与 POST请求的区别:
GET请求是从服务器中获取数据,Post则是向服务器传送数据,说到这提一下剩余两种请求,分别是 delete 和 put ,这四个请求方式,分别对应了对服务器的 CRUD 操作,但是现在已经不这样区分了。但是他们的本质都是发送请求和接收结果,知识在格式和数据量上有差别。
从格式上差别文章前面已经有详细的信息,这里就不在赘述了,主要说数据的差别吧:
GET 把请求的数据放在 URL 上,数据若果是英文字母或是数字,则原样发送,若是中文或其他字符,则吧字符串用 BASE64加密,也就是 “ % ” 加上字符串的16进制ASCll码。
Post 请求把数据放在 HTTP 的包体内(也就是消息主体中)
GET 请求提交的数据最大是2k,原则上 URL的长度是不做限制的,但是由于大多数浏览器都会限制 URL 的长度在 2k 个字节,即使大多数服务器最大能处理64k大小的 URL,浏览器也依然限制URL为2k。( IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。)
总结为一句话:对使用GET方法提交数据时,在IE环境下,需要考虑URL长度2083字节的限制
Post 请求提交数据理论上是没有大小限制的,在 HTTP 协议规范也没有限制大小,但是实际上 IIS4中最大量为80KB,IIS5中为100KB,IIS 6.0默认ASP POST数据量最大为200KB,每个表单域限制是100KB。IIS 6.0默认上传文件的最大大小是4MB。IIS 6.0默认最大请求头是16KB。IIS 6.0之前是没有这些限制。
GET 请求只产生一个 TCP 数据包,浏览器会把 HTTP Header 和 data 一起发送给服务器。
Post 请求则先把 HTTP Header 发送出去,等待服务器响应返回 100 continue,浏览器再发送 data。需要发送两个 TCP 数据包
GET 请求在浏览器回退时时无害的,Post 在回退会再次提交请求
GET 请求产生的 URL 是可以被Bookmark(书签),Post 不可以
GET 请求会被浏览器主动cache(缓存),而 Post 请求不会,除非手动设置
GET 请求只能进行 URL 编码,而 Post 请求支持多种编码格式,常见的有编码格式:
1.application/x-www-form-urlencoded (浏览器原生的 form 表单,并且不设置enctype属性,就是此类型)
2.multipart/form-data(我们使用表单上传文件时,必须让 form 的 enctype 等于这个值。这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持。这两种 POST 数据的方式,都是浏览器原生支持的。)
3.application/json (大概很多人都用过这个类型作为响应头的类型,但是现在也越来越多人使用它作为请求头,用来告诉服务器端消息主体是序列化后的 JSON 字符串,由于现在 JSON越来越多人使用,除了低版本的 IE 之外,大多数浏览器都支持 JSON.stringify,服务端也都有处理 JSON 的函数,使用 JSON 作为请求头参数也是不错的选择。)
4.text/xml (这是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范,它的使用也很广泛,能很好的支持已有的 XML-RPC 服务。不过,XML 结构还是过于臃肿,一般场景使用 JSON 会更加方便)
我们应该使用哪一种编码格式呢?
1、和后端约定好提交的方式
2、看提交的数据类型,如果是提交文件格式这要使用 multipart/form-data
GET 请求参数会被完整的保留在浏览器历史记录中,Post 不会
GET 只接受 ASCll 字符类型的参数,Post 没有限制。
总结为一句话: Post 啥都好,但是 GET 效率高。
2、从安全性上看区别
根据 HTTP 规范,GET 是用于信息获取,而且应该是安全的和幂等的。
1、安全的意思是,只用于获取信息,而不会修改信息,仅此而已。就像数据库的查询语句一样。
2、幂等性的意思是,在GET 请求返回的数据上,引用别人文章的例子:新闻站点的头条一直在更新,虽然每次请求都是不一样的数据,但是该操作它是幂等的,应为他总是返回当前的头条新闻。通俗讲就是:幂等的意味着对同一URL的多个请求应该返回同样的结果、从自身的角度来看没有改变资源,这就是幂等的
根据 HTTP 规范,Post 是可能修改服务器资源的请求。
以上就是本篇文章的全部内容了。写了有几天吧,在查阅了很多资料后终于写完了,整篇文章写了很多 HTTP 常用的知识点,之前对 HTTP 的概念不是很清晰,在写完这篇文章后也对HTTP 有了一个清晰的认知。最后感谢您的观看 thanks。
参考文献
参考一:关于 HTTP 协议,一篇就够了