HTTP 和 HTTPS 是老生常谈的问题,无论是在校学习还是找工作,老师和面试官几乎都会问道HTTP 是什么?HTTPS 是什么?他们有什么区别 ?
其实学好 HTTP 和 HTTPS 是很重要的,有利于我们后续的学习和参加工作。相信平时上网的时候也很少有人关注这个问题,只是知道计算机网络里 HTTP 的概念。
其实这一块的知识延伸很广,还需要了解加密算法和 SSL 协议。
未来几篇文章我们就来聊一聊这几个问题,相信仔细看完,会有很大收获。
目录
一、什么是 HTTP ?
二、HTTP 的发展阶段
1. HTTP 0.9 版本
2. HTTP 1.0 版本
3. HTTP 1.1 版本
4. HTTP 2.0 版本
三、HTTP 工作原理
1. 理论准备:
2. 原理概述:
3. 典型的HTTP事务处理有如下的过程:
四、HTTP 特性
五、HTTP 的报文分析
1. 请求报文
2. 响应报文
六、HTTP 的请求方法
七. HTTP 响应头信息
八、HTTP 状态码
1. HTTP 状态码分类
2. 常见的 HTTP 状态码:
3. HTTP 状态码表
九、专栏分享
一、什么是 HTTP ?
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在 TCP 之上。
它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
请求和响应消息的头以 ASCll 形式给出;而消息内容则具有一个类似 MIME 的格式。
这个简单模型是早期 web 成功的有功之臣,因为它使开发和部署非常地直截了当。
HTTP 协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP 是一个基于 TCP/IP 通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
HTTP 协议是基于 TCP 的应用层协议,它不关心数据传输的细节,主要是用来规定客户端和服务端的数据传输格式,最初是用来向客户端传输HTML页面的内容。
默认端口是80,http 是基于请求与响应模式的、无状态的、应用层的协议。
二、HTTP 的发展阶段
1. HTTP 0.9 版本
0.9 协议是适用于各种数据信息的简洁快速协议,但是远不能满足日益发展的各种应用的需要。
0.9 协议就是一个交换信息的无序协议,仅仅限于文字。
由于无法进行内容的协商,在双发的握手和协议中,并有规定双发的内容是什么,也就是图片是无法显示和处理的。
2. HTTP 1.0 版本
到了 1.0 协议阶段,也就是在1982年,Tim Berners-Lee 提出了 HTTP/1.0。
在此后的不断丰富和发展中,HTTP/1.0 成为最重要的面向事务的应用层协议。
该协议对每一次请求/响应建立并拆除一次连接。
其特点是简单、易于管理,所以它符合了大家的需要,得到了广泛的应用。
3. HTTP 1.1 版本
在 1.0 协议中,双方规定了连接方式和连接类型,这已经极大扩展了 HTTP 的领域,但对于互联网最重要的速度和效率,并没有太多的考虑。
毕竟,作为协议的制定者,当时也没有想到 HTTP 会有那么快的普及速度。
关于 HTTP1.1 协议的具体内容可以参考RFC 2616。
4. HTTP 2.0 版本
HTTP 2.0 的前身是 HTTP 1.0 和 HTTP 1.1 。
虽然之前仅仅只有两个版本,但这两个版本所包含的协议规范之庞大,足以让任何一个有经验的工程师为之头疼。
网络协议新版本并不会马上取代旧版本。
实际上,HTTP 1.0 和HTTP 1.1 在之后很长的一段时间内一直并存,这是由于网络基础设施更新缓慢所决定的。
关于HTTP2.0协议的具体内容可以参考RFC 7540。
三、HTTP 工作原理
1. 理论准备:
HTTP是基于 B/S 架构进行通信的,且面向连接的。
HTTP 的服务器端实现程序有 httpd、nginx 、Apache服务器,IIS 服务器等。
其客户端的实现程序主要是 Web 浏览器,例如:Firefox、Internet Explorer、Google Chrome、Safari、Opera等。
客户端的命令行工具还有elink、CURL等。
Web服务是基于TCP的,因此为了能够随时响应客户端的请求,Web服务器需要监听在80/TCP端口。这样客户端浏览器和Web服务器之间就可以通过HTTP进行通信了。
2. 原理概述:
浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
Web服务器根据接收到的请求后,向客户端发送响应信息。
1. 客户端的浏览器首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的,一般 TCP 连接的端口号是80。
2. 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(url)、协议版本号,后边是 MIME 信息包括请求修饰符、客户机信息和许可内容。
3. 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可能的内容。
3. 典型的HTTP事务处理有如下的过程:
1. 客户与服务器建立连接;(TCP三次握手)
2. 客户向服务器提出请求;
3. 服务器接受请求,并根据请求返回相应的文件作为应答;
4. 客户与服务器关闭连接。
四、HTTP 特性
1. HTTP是一种无连接协议,即一次性连接。
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。
这种一次性连接主要考虑到 WWW 服务器面向的是 Internet 中成千上万个用户,且只能提供有限个连接,故服务器不会让一个连接处于等待状态,及时地释放连接可以大大提高服务器的执行效率。
2. HTTP是一种无状态协议,即服务器不保留与客户交易时的任何状态。
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
这就大大减轻了服务器记忆负担,从而保持较快的响应速度。
HTTP是一种面向对象的协议,允许传送任意类型的数据对象。
它通过数据类型和长度来标识所传送的数据内容和大小,并允许对数据进行压缩传送。当用户在一个 HTML 文档中定义了一个超文本链后,浏览器将通过 TCP/IP协议 与指定的服务器建立连接。
3. HTTP是媒体独立的:
这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
4. HTTP 支持持久连接。
在 HTTP / 0.9 和 HTTP 1.0 中,连接在单个请求/响应对之后关闭。
在 HTTP / 1.1 中,引入了保持活动机制,其中连接可以重用于多个请求。
这样的持久性连接可以明显减少请求延迟,因为在发送第一个请求之后,客户端不需要重新协商 TCP 三次握手连接。
另一个积极的副作用是,通常,由于TCP的缓慢启动机制,连接随着时间的推移而变得更快。
五、HTTP 的报文分析
HTTP 报文由从客户机到服务器的请求和从服务器到客户机的响应构成。
1. 请求报文
请求报文格式如下:
请求行、请求头、空行、请求体
编辑
2. 响应报文
响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
编辑
六、HTTP 的请求方法
HTTP 规范定义了9种请求方法,每种请求方法规定了客户和服务器之间不同的信息交换方式,常用的请求方法是GET和POST。服务器将根据客户请求完成相应操作,并以应答块形式返回给客户,最后关闭连接。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
序号 | 方法 | 描述 |
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
9 | PATCH | 是对 |
七. HTTP 响应头信息
应答头 | 说明 |
Allow | 服务器支持哪些请求方法(如GET、POST等)。 |
Content-Encoding | 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。 |
Content-Length | 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStream,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。 |
Content-Type | 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。 |
Date | 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。 |
Expires | 应该在什么时候认为文档已经过期,从而不再缓存它? |
Last-Modified | 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。 |
Location | 表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。 |
Refresh | 表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。 |
Server | 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。 |
Set-Cookie | 设置和页面关联的Cookie。Servlet不应使用response.setHeader("Set-Cookie", ...),而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。 |
WWW-Authenticate | 客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。 |
八、HTTP 状态码
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。
当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含 HTTP 状态码的信息头(server header)用以响应浏览器的请求。
HTTP 状态码的英文为 HTTP Status Code。
1. HTTP 状态码分类
HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型。
响应分为五类:
信息响应(100–199)
成功响应(200–299)
重定向(300–399)
客户端错误(400–499)
服务器错误 (500–599)
分类 | 分类描述 |
1xx | 信息,服务器收到请求,需要请求者继续执行操作 |
2xx | 成功,操作被成功接收并处理 |
3xx | 重定向,需要进一步的操作以完成请求 |
4xx | 客户端错误,请求包含语法错误或无法完成请求 |
5xx | 服务器错误,服务器在处理请求的过程中发生了错误 |
2. 常见的 HTTP 状态码:
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误