2. HTTP协议相关问题
2.1 HTTP的请求报文结构和响应报文结构
HTTP 请求报文主要由请求行、请求头、空行、请求正文(Get 请求没有请求正 文)4 部分组成。
1、请求行
由 3 部分组成,分别为:请求方法、URL 以及协议版本,之间由空格分隔;
请求方法包括 GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE 以及扩展 方法,当然并不是所有的服务器都实现了所有的方法,部分方法即便支持,出 于安全性的考虑也是不可用的;
协议版本的格式为:HTTP/主版本号.次版本号,常用的有 HTTP/1.0 和 HTTP/1.1;
2、请求头
请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对, 名和值之间使用冒号分隔。
3、空行
请求头的最后会有一个空行,表示请求头部结束,接下来为请求正文,这 一行非常重要,必不可少。
4、请求正文
可选部分,比如 GET 请求就没有请求正文。
如下面的例子:
HTTP 响应报文主要由状态行、响应头、空行、响应正文 4 部分组成。
1、状态行
由 3 部分组成,分别为:协议版本,状态码,状态码描述,之间由空格分隔;
2、响应头
与请求头类似,为响应报文添加了一些附加信息。
3、空行
4、响应正文
2.2 常见的http首部字段
1、通用首部字段
Date:创建报文时间
Connection:连接的管理
Cache-Control:缓存的控制
Transfer-Encoding:报文主体的传输编码方式,如 Transfer-Encoding:chunked。
2、请求首部字段
Host:请求资源所在服务器
Accept:可处理的媒体类型
Accept-Charset:可接收的字符集
Accept-Encoding:可接受的内容编码
Accept-Language:可接受的自然语言
Referer:HTTP Referer 是 header 的一部分,当浏览器向 web 服务器发送请求的时候, 一般会带上 Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信 息用于处理。
3、响应首部字段
Accept-Ranges:可接受的字节范围
Location:令客户端重新定向到的 URI
Server:HTTP 服务器的安装信息
4、实体首部字段
Allow:资源可支持的 HTTP 方法
Content-Type:实体主类的类型
Content-Encoding:实体主体适用的编码方式
Content-Language:实体主体的自然语言
Content-Length:实体主体的字节数
Content-Range:实体主体的位置范围,一般用于发出部分请求时使用。
2.3 http状态码含义
200 OK 服务器已成功处理了请求并提供了请求的网页。
202 Accepted 已经接受请求,但处理尚未完成。
204 No Content 没有新文档,浏览器应该继续显示原来的文档。
206 Partial Content 客户端进行了范围请求。响应报文中由 Content-Range 指定实体内容的范围。实现断点续传。
301 Moved Permanently 永久性重定向。请求的网页已永久移动到新位置。
302(或 307) Moved Temporatily 临时性重定向。请求的网页临时移动到新位置。
304 Not Modified 未修改。自从上次请求后,请求的内容未修改过。
401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个 WWW-Authenticate 头,浏览器据此显示用户名字/密码对话框,然后在填写合适的 Authorization 头后再次发出请求。
403 Forbidden 服务器拒绝请求。
403.6- IP address rejected
404 Not Found 服务器上不存在客户机所请求的资源。
500 Internal Server Error 服务器遇到一个错误,使其无法为请求提供服务
2.4 http中有关缓存的首部字段有哪些?浏览器缓存机制是怎样的
-
什么是Last-Modified 和 If-Modified-Since:
都是用于记录页面最后修改时间的 HTTP 头 信 息 , 只 是 Last-Modified 是 由 服 务 器 往 客 户 端 发 送 的 HTTP 头 , 而 If-Modified-Since 则是由客户端往服务器发送的头,可以看到,再次请求本地存在的缓存页面时,客户端会通过 If-Modified-Since 头把浏览器端缓存页面的最后一次被服务器修改的时间一起发到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行 比较,通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,就返回 HTTP 状态码 200 和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显 示到浏览器中;如果是最新的,则返回 304 告诉客户端其本地缓存的页面是最新的,就直 接把本地缓存文件显示到浏览器中,这样在网络上传输的数据量就会大大减少,同时也减 轻了服务器的负担。 -
ETag 和 If-None-Match
ETag 和 If-None-Match 是一种常用的判断资源是否改变的方法。类似于 Last-Modified 和 If-Modified-Since。但是有所不同的是 Last-Modified 和 If-Modified-Since 只判断资源的 最后修改时间,而 ETag 和 If-None-Match 可以是资源任何的任何属性。
ETag 和 If-None-Match 的工作原理是在 HTTP Response 中添加 ETags 信息。当客户 端再次请求该资源时,将在 HTTP Request 中加入 If-None-Match 信息(也就是 ETags 的 值)。如果服务器验证资源的 ETags 没有改变(该资源的内容没有改变),将返回一个 304 状态;否则,服务器将返回 200 状态,并返回该资源和新的 ETags。 -
什么是”Etag”?
服务器会为每个资源分配对应的 ETag 值,根据资源的内容得到其值。当资源内容发 生改变时,其值也会改变。以下是服务器端返回的格式:
ETag: “50b1c1d4f775c61:df3”
客户端的查询更新格式是这样的:
If-None-Match: W/“50b1c1d4f775c61:df3”
如果 ETag 没改变,则返回状态 304,这也和 Last-Modified 一样。 -
.Expires / Cache-Control(优先使用)
用来控制缓存的失效日期,控制浏览器是直接从浏览器缓存取数据还是重新发请求到 服务器取数据。
Expires 是 Web 服务器响应消息头字段,在响应 http 请求时告诉浏览器在过期时间前 浏览器可以直接从浏览器缓存取数据,而无需再次请求。Expires 的一个缺点就是,返回 的到期时间是服务器端的时间,这样存在一个问题,如果客户端的时间与服务器的时间相 差很大(比如时钟不同步,或者跨时区),那么误差就很大,所以在 HTTP 1.1 版开始,使 用 Cache-Control: max-age=(秒)替代。
当服务器发出响应的时候,可以通过两种方式来告诉客户端缓存请求:
第一种是 Expires,比如:
Expires: Sun, 16 Oct 2016 05:43:02 GMT
在此日期之前,客户端都会认为缓存是有效的。
不过 Expires 有缺点,比如说,服务端和客户端的时间设置可能不同,这就会使缓存的失效可能并不能精确的按服务器的预期进行。
第二种是 Cache-Control,比如:
Cache-Control: max-age=315360000
这里声明的是一个相对的秒数,表示从现在起,315360000 秒内缓存都是有效的,这 样就避免了服务端和客户端时间不一致的问题。
2.5 http1.1和http1.0的区别
1、默认持久连接和流水线
-
HTTP/1.1 默认使用持久连接,只要客户端服务端任意一端没有明确提出断开 TCP 连 接,就一直保持连接,在同一个 TCP连接下,可以发送多次 HTTP请求。默认采用流水线的方式发送请求,即客户端每遇到一个对象引用就立即发出一个请求,而不必等到收到前一个响应之后才能发出下一个请求。服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容。
-
HTTP/1.0 默认使用短连接,要建立长连接,可以在请求消息中包含 Connection: Keep-Alive 头域,如果服务器愿意维持这条连接,在响应消息中也会包含一个 Connection: Keep-Alive 的头域。Connection 请求头的值为 Keep-Alive 时,客户端通知服务器返回本次 请求结果后保持连接;Connection 请求头的值为 close 时,客户端通知服务器返回本次请求结果后关闭连接。
2、分块传输数据
-
HTTP/1.0 可用来指定实体长度的唯一机制是通过 Content-Length 字段。静态资源的长度可以很容易地确定,但是对于动态生成的响应来说,为获取它的真实长度,只能等它完全生成之后,才能正确地填写 Content-Length的值,这便要求缓存整个响应,在服务器端占用大量的缓存,从而延长了响应用户的时间。
-
HTTP/1.1 引入了被称为分块(chunked)的传输方法。该方法使发送方能将消息实体 分割为任意大小的组块(chunk),并单独地发送他们。在每个组块前面,都加上了该组块 的长度,使接收方可确保自己能够完整地接收到这个组块。更重要的是,在最末尾的地方, 发送方生成了长度为零的组块,接收方可据此判断整条消息都已安全地传输完毕。可以避免在服务器端占用大量的缓存空间。
3、状态码100 Continue
- HTTP/1.1 加入了一个新的状态码 100 Continue,用于客户端在发送 POST数据给服务器前,征询服务器的情况,看服务器是否处理 POST 的数据。
当要 POST 的数据大于 1024 字节的时候,客户端并不会直接就发起 POST 请求, 而 是会分为 2 步:
(1) 发送一个请求, 包含一个 Expect:100-continue, 询问 Server 是否愿意接受数据。
(2)接收到 Server 返回的 100 continue 应答以后, 才把数据 POST 给 Server。
4、Host域
- HTTP1.1 在 Request 消息头里多了一个 Host 域,HTTP1.0 则没有这个域。
- 在 HTTP1.0中认为每台服务器都绑定一个唯一的 IP 地址,这个 IP 地址上只有一个主机。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个 IP 地址。
2.6 常用的http方法
注意:只有 POST 和 PUT 方法才有请求内容。
-
GET: 用于请求访问已经被 URI(统一资源标识符)识别的资源,可以通过 URL 传参 给服务器。
它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组 HTTP 头和呈现数据(如 HTML 文本,或者图片或者视频等)返回给客户端。GET 请求中,永远不会包含呈现数据。 -
POST:用于传输信息给服务器,主要功能与 GET 方法类似,但一般推荐使用 POST方式。向服务器提交数据。
-
PUT: 传输文件,报文主体中包含文件内容,保存到对应 URI 位置。
-
HEAD: 获得报文首部,与 GET 方法类似,只是不返回报文主体。
-
DELETE:删除文件,与 PUT 方法相反,删除对应 URI 位置的文件。
-
OPTIONS:查询相应 URL 支持的 HTTP 方法。
2.7 Http的get和post请求方法的区别
1.GET 一般用于获取或者查询资源信息,这就意味着它是幂等的(对同一个 URL 的 多个请求返回同样的结果)和安全的(没有修改资源的状态),而 POST 一般用于更新资 源信息,POST 既不是安全的,也不是幂等的。
2.采用 GET 方法时,客户端把要发送的数据添加到 URL 后面(就是把数据放置在 HTTP 协议头中,GET 是通过 URL 提交数据的),并且用“?”连接,各个变量之间用“&” 连接。
3、通过 GET 提交数据,用户名和密码将明文出现在 URL 上。而 POST 把要传递的数据放到 HTTP 请求报文的消息体中;HTTP 协议也没有进行大 小限制,起限制作用的是服务器的处理程序的能力,但是,传送的数据量比 GET 方法更大 些;由于传递的数据在消息体中,安全性高。
4、.GET 请求的数据会被浏览器缓存起来,会留下历史记录;而 POST 提交的数据不会被浏览器缓存,不会留下历史记录。
2.8 Http为什么是无状态的,如何保持状态(会话跟踪、状态管理)
-
无状态是指协议对于事务处理没有记忆能力,不能保存每次客户端提交的信息,即当服务器返回应答之后,这次事务的所有信息就都丢掉了。如果用户发来一 个新的请求,服务器也无法知道它是否与上次的请求有联系。
-
优点:
服务器不用为每个客户端连接分配内存来记忆大量状态,也不用在客户端失去连 接时去清理内存,节省服务器端资源,以更高效地去处理业务。 -
缺点:
缺少状态意味着如果后续处理需要前面的信息,则客户端必须重传,这样可能导 致每次连接传送的数据量增大。
采用会话跟踪技术来解决这个问题。把状态保存在服务器中,只发送回一个标识符,浏览器在下次提交中把这个标识符发送过来;这样,就可以定位存储在服务器上的状态信息了。
有四种会话跟踪技术:
1.COOKIE
2.Session
3.URL 重写
4.作为隐藏域嵌入 HTML 表单中(隐藏表单域)
在浏览器和服务器之间来回传递一个标识符,这就是所谓的会话(session)跟踪。来 自浏览器的所有包含同一个标识符(这里是 SESSIONID)的请求同属于一个会话。
会话的有效期直到它被显式地终止为止,或者当用户在一段时间内没有动作,由服务器自动设置为过期。
2.9 Http长连接和短连接的原理
-
在 HTTP/1.0 中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次 HTTP 操作,就建立一次连接,但任务结束就中断连接。如果客户端访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源,如 JavaScript 文件、图像文件、CSS 文件等,当浏览器每遇到这样一个 Web 资源,就会建立一个 HTTP 会话。HTTP1.0 需要在 request 中增加”Connection:keep-alive“ header 才能够支持长连接。
-
但从 HTTP/1.1 起,默认使用长连接,用以保持连接特性。使用长连接的 HTTP 协议, 会在请求头和响应头加入这行代码:Connection:keep-alive
Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如 Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。长连接中关闭连接通过 Connection:closed 头部字段。如果请求或响应中的 Connection 被指定为 closed,表示在当前请求或响应完成后将关闭 TCP 连接。
TCP 的 keep alive 是检查 当前 TCP 连接是否活着;HTTP 的 Keep-alive 是要让一个 TCP 连接活久点。
HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。
- Http长连接优点:
1.通过开启和关闭更少的 TCP 连接,节约 CPU 时间和内存。
2.通过减少 TCP 开启和关闭引起的包的数目,降低网络阻塞。 - Http长连接缺点:
服务器维护一个长连接会增加开销。 - http 短连接的优点:
服务器不用为每个客户端连接分配内存来记忆大量状态,也不用在客户端失去连接时去清理内存,节省服务器端资源,以更高效地去处理业务。 - http 短连接的缺点:
如果客户请求频繁,将在 TCP 的建立和关闭操作上浪费时间和带宽。
2.10 Http的特点
(1)支持客户端/服务器端通信模式。
(2)简单方便快速:
当客户端向服务器端发送请求时,只是简单的填写请求路径和请求 方法即可,然后就可以通过浏览器或其他方式将该请求发送就行了。
(3)灵活:
允许客户端和服务器端传输任意类型任意格式的数据对象。
(4)无连接:
每次建立的连接只处理一个客户端请求。当服务器处理完客户端的请求之后,并且收到客户的反馈应答后,服务器端立即断开连接。
(5)无状态:
指协议对于请求的处理没有记忆功 能。无状态意味着如果要再次处理先前的信息,则这些先前的信息必须要重传,这就导致 了数据量传输的增加。
2.11 Http的安全问题
1、通信使用明文不加密,内容可能被窃听
2、不验证通信方身份,可能遭到伪装
3、无法验证报文完整性,可能被篡改
HTTPS 就是 HTTP 加上加密处理(一般是 SSL 安全通信线路)+认证+完整性保护。
2.12 Https的作用
• 内容加密 建立一个信息安全通道,来保证数据传输的安全;
• 身份认证 确认网站的真实性
• 数据完整性 防止内容被第三方冒充或者篡改
2.13 浏览器和服务器在基于 https 进行请求链接到数据传输过程中,用 到了哪些技术?
1、对称加密算法
用于对真正传输的数据进行加密。
2、非对称加密算法
用于在握手过程中加密生成的密码。
3、散列算法
验证数据完整性
4、数字证书
数字证书其实就是一个小的计算机文件,其作用类似于我们的身份证、护照,用于证明身份,在 SSL 中,使用数字证书来证明自己的身份。
2.14 Http和socket的区别
- 创建 Socket 连接时,可以指定使用的传输层协议,Socket 可以支持不同的传输层协 议(TCP 或 UDP),当使用 TCP 协议进行连接时,该 Socket 连接就是一个 TCP 连接。 Socket 连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。注意, 同 HTTP 不同的是 http 只能基于 tcp,socket 不仅能走 tcp,而且还能走 udp,这个是 socket 的第一个特点。
- HTTP 连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要 客户端向服务器发出请求后,服务器端才能回复数据。
2.15 Http与Https的区别
1、https更安全
HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比 http 协议安全,所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器 方的证书进行了非对称加密。
http 是超文本传输协议,信息是明文传输,没有加密,通过 抓包工具可以分析其信息内容。
2、https需要申请证书
3、端口不同
http 使用的是 80 端口,而 https 使用的是 443 端口。
4、所在层次不同
HTTP协议运行在 TCP 之上,HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP之上。