HTTP 协议是互联网的基础协议,也是 web 开发的必备知识,最新版本 HTTP/2 更是让它成为技术热点。下面看下 HTTP 需要掌握些啥
[TOC]
这种文章开头都先祭出这一张神图以供参考
HTTP 协议到底是什么
超文本传输协议(Hypertext Transfer Protocol,简称 HTTP)是应用层协议。HTTP 是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求;服务器接到请求后,给予相应的响应信息。
HTTP 请求报文http 请求报文由请求行,请求头部,空行以及请求包体组成,如下图所示:
1、请求行 由请求方法,URL 以及协议版本三部分组成,每个部分以空格分隔。常用的请求方法有:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT;
GET:当客户端要从服务器中读取某个资源时,使用 GET 方法。GET 方法要求服务器将 URL 定位的资源放在响应报文的数据部分,回送给客户端,即向服务器请求某个资源。使用 GET 方法时,请求参数和对应的值附加在 URL 后面,利用一个问号(“?”)代表 URL 的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。
POST:当客户端给服务器提供信息较多时可以使用 POST 方法,POST 方法向服务器提交数据,比如完成表单数据的提交,将数据提交给服务器处理。GET 一般用于获取/查询资源信息,POST 会附带用户数据,一般用于更新资源信息。POST 方法将请求参数封装在 HTTP 请求数据中,以名称/值的形式出现,可以传输大量数据;
2、请求头部请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号 “:” 分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型;
Accept:客户端可识别的响应内容类型列表;星号 “ ” 用于按范围将类型分组,用 “/” 指示可接受全部类型,用 “ type/ ” 指示可接受 type 类型的所有子类型;
Accept-Language:客户端可接受的自然语言;
Accept-Encoding:客户端可接受的编码压缩格式;
Accept-Charset:可接受的应答的字符集;
Host:请求的主机名,允许多个域名同处一个 IP 地址,即虚拟主机;
connection:连接方式(close 或 keepalive);
Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的 cookie;
这么多个请求头参数中,Host 是必须的,其他都是可选的
3、空行最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头;
4、请求体 请求体不在 GET 方法中使用,而是在 POST 方法中使用。POST 方法适用于需要客户填写表单的场合。与请求体相关的最常使用的是类型 Content-Type 和长度 Content-Length;
HTTP 响应报文
HTTP 响应与 HTTP 请求相似,HTTP 响应也由 3 个部分构成,分别是:
状态行
响应头 (Response Header)
响应正文
状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。
常见的状态码有如下几种:
200 OK 客户端请求成功
301 Moved Permanently 请求永久重定向
302 Moved Temporarily 请求临时重定向
304 Not Modified 文件未修改,可以直接使用缓存的文件。
400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized 请求未经授权。这个状态代码必须和 WWW-Authenticate 报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
404 Not Found 请求的资源不存在,例如,输入了错误的 URL
500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。
503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。
下面是一个 HTTP 响应的例子:
1
2
3
4
5
6
7
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
...
无状态性
HTTP 协议是无状态的(stateless)。无状态是指协议对于事务处理没有记忆能力,也就是说,同一个客户端第二次访问同一个服务器上的页面时,服务器无法知道这个客户端曾经访问过,服务器也无法分辨不同的客户端。HTTP 的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的 HTTP 请求。
所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。如果是一个连接的话,服务器进程中就能保持住这个连接并且在内存中记住一些信息状态。而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住任何状态,所以 HTTP 是无状态连接。
短连接
Http 协议是建立在 TCP 协议基础之上的,TCP 协议对应于传输层,而 HTTP 协议对应于应用层。
HTTP 通讯过程是首先通过 TCP 建立起一个到服务器的连接通道(三次握手),当 HTTP 请求的数据传输完毕后,就会断开 TCP 连接(四次挥手)。这个过程是很短的,所以说 HTTP 是短连接。
但是现在默认是开启keep-alive以保持连接性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接 Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如 Apache)中设定这个时间。当这个时间到了,还是会断开连接。
后来,通过 Session, Cookie 等相关技术,也能保持一些用户的状态。但是依然是无状态连接,原理不同罢。
会话跟踪什么是会话?
客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话。
什么是会话跟踪?
会话跟踪指的是对同一个用户对服务器的连续的请求和接受响应的监视。
为什么需要会话跟踪?
浏览器与服务器之间的通信是通过 HTTP 协议进行通信的,而 HTTP 协议是” 无状态” 的协议,它不能保存客户的信息,即一次响应完成之后连接就断开了,下一次的请求需要重新连接,这样就需要判断是否是同一个用户,所以才有会话跟踪技术来实现这种要求。
会话跟踪常用的方法:
URL 重写
URL(统一资源定位符) 是 Web 上特定页面的地址,URL 重写的技术就是在 URL 结尾添加一个附加数据以标识该会话,把会话 ID 通过 URL 的信息传递过去,以便在服务器端进行识别不同的用户。
隐藏表单域
将会话 ID 添加到 HTML 表单元素中提交到服务器,此表单元素并不在客户端显示
Cookie
Cookie 是 Web 服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将 Cookie 发送到客户端,在客户端可以进行保存,以便下次使用。
客户端可以采用两种方式来保存这个 Cookie 对象,一种方式是保存在客户端内存中,称为临时 Cookie,浏览器关闭后这个 Cookie 对象将消失。另外一种方式是保存在客户机的磁盘上,称为永久 Cookie。以后客户端只要访问该网站,就会将这个 Cookie 再次发送到服务器上,前提是这个 Cookie 在有效期内,这样就实现了对客户的跟踪。
Cookie 是可以被禁止的。
Session:
每一个用户都有一个不同的 session,各个用户之间是不能共享的,是每个用户所独享的,在 session 中可以存放信息。
在服务器端会创建一个 session 对象,产生一个 sessionID 来标识这个 session 对象,然后将这个 sessionID 放入到 Cookie 中发送到客户端,下一次访问时,sessionID 会发送到服务器,在服务器端进行识别不同的用户。
Session 的实现依赖于 Cookie,如果 Cookie 被禁用,那么 session 也将失效。
HTTP 工作原理
HTTP 协议采用请求/响应模型。客户端向服务器发送一个请求报文,服务器以一个状态作为响应。
以下是 HTTP 请求/响应的步骤:
客户端连接到 web 服务器:HTTP 客户端与 web 服务器建立一个 TCP 连接;
客户端向服务器发起 HTTP 请求:通过已建立的 TCP 连接,客户端向服务器发送一个请求报文;
服务器接收 HTTP 请求并返回 HTTP 响应:服务器解析请求,定位请求资源,服务器将资源副本写到 TCP 连接,由客户端读取;
释放 TCP 连接:若 connection 模式为 close,则服务器主动关闭 TCP 连接,客户端被动关闭连接,释放 TCP 连接;若 connection 模式为 keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
客户端浏览器解析 HTML 内容:客户端将服务器响应的 html 文本解析并显示;
例如:在浏览器地址栏键入 URL,按下回车之后会经历以下流程:
浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接;
浏览器发出读取文件(URL 中域名后面部分对应的文件)的 HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
释放 TCP 连接;
浏览器将该 html 文本并显示内容;
HTTPS 又是啥
HTTPS ,超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用SSL/TLS来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
协议层
HTTP 协议和安全协议同属于应用层(OSI 模型的最高层),具体来讲,安全协议工作在 HTTP 之下,运输层之上:安全协议向运行 HTTP 的进程提供一个类似于 TCP 的套接字,供进程向其中注入报文,安全协议将报文加密并注入运输层套接字;或是从运输层获取加密报文,解密后交给对应的进程。严格地讲,HTTPS 并不是一个单独的协议,而是对工作在一加密连接(TLS或 SSL)上的常规 HTTP 协议的称呼。
HTTPS 报文中的任何东西都被加密,包括所有报头和荷载。除了可能的选择密文攻击之外,一个攻击者所能知道的只有在两者之间有一连接这一事实。
与 HTTP 的差异HTTP 是不安全的,且攻击者通过监听和中间人攻击等手段,可以获取网站帐户和敏感信息等。HTTPS 被设计为可防止前述攻击,并在正确配置时被认为是安全的。
http 是 HTTP 协议运行在 TCP 之上。所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。
https 是 HTTP 运行在 SSL/TLS 之上,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。此外客户端可以验证服务器端的身份,如果配置了客户端验证,服务器方也可以验证客户端的身份。