计算机网络协议分析 第16课 HTTP
第12章 HTTP(附HTTP常见面试题)
常见面试题
- Q: 浏览器输入一个地址到页面展示中间经历了什么?
- Q:HTTP是什么协议?
- Q:HTTP报文的结构是怎样的?
- Q:HTTP常见请求方法有哪些?GET与POST的区别?POST与PUT的区别?
- Q:HTTP常见状态码有哪些?
- Q:怎么理解“HTTP是无状态协议”?怎么解决HTTP的无状态
- Q:cookies机制和session机制的区别?
- Q:浏览器在与服务器建立了一个TCP连接后是否会在一个HTTP请求完成后断开?什么情况会断开?
- Q:一个TCP连接中多个HTTP请求可以同时发送吗?
- Q:浏览器对同一Host建立TCP连接的数量有没有限制?
- Q:浏览器收到的HTML文档包含几十个图片标签,如何下载这些图片?(考虑方式、顺序、建立连接数量)
- HTTP和HTTPS的区别?
12.1 HTTP报文
-
Q: 浏览器输入一个地址到页面展示中间经历了什么?
A:- 浏览器进程收到URL请求。首先进行信息处理,然后转给网络进程发起真正的请求
- 网络进程发送请求
- 网络进程读取响应头信息,分析处理数据,再转交给浏览器进程
- 浏览器进程收到响应头数据之后,发送提交导航到渲染进程
- 渲染进程接收到提交导航的信息之后,准备HTML数据,通过管道和网络进行监理连接接受到数据
- 渲染进程向浏览器进程确认提交,通知浏览器准备好接受数据和解析数据了
- 浏览器进程接收到提交文档消息之后,开始更新浏览器页面
- 详细见:浏览器页面工作流程
-
Q:HTTP是什么协议?
A:- Hyper Text Transfer Protocol(超文本传输协议),是用于从万维网服务器传输超文本到本地浏览器的传送协议。
- 是一个机遇TCP/IP通信协议的来传递数据的协议。
- 是一个属于应用层的面向对象的协议。
- 是一个工作于客户端-服务端架构为上的协议。
-
Q:HTTP报文的结构是怎样的?
A:- HTTP请求报文包括请求行、首部行、空行和请求数据四个部分组成;
- HTTP响应报文包括状态行、首部行、空行和数据(响应体)四个部分组成。
- 首部行由一个首部字段名、一个冒号、一个空格和一个值
常用HTTP方法
-
Q:HTTP常见请求方法有哪些?GET与POST的区别?POST与PUT的区别?
A:- GET:发送请求来获得服务器上的资源,请求体重不会包含请求数据,请求数据放在协议头中。另外GET支持快取、缓存、可保留书签等。幂等。
- POST:和GET一样很常见,向服务器提交资源让服务器处理,比如提交表单、上传文件等,可能导致建立新的资源或者对原有资源的修改。提交的资源放在请求体重。不支持快取。非幂等
- PUT:和POST类似,HTML表单不支持,发送资源与服务器,并存储在服务器指定位置,要求客户端事先知道该位置
- GET和POST 的区别:点击返回/刷新按钮时GET没有影响,POST有;GET可以缓存添加书签,POST不行;GET有历史记录,POST没有;GET幂等,POST非幂等;GET只能传输ASCII类型数据,POST没有限制;GET数据全部展示在URL中,不安全,POST通过request body传递数据比较安全;GET可见,POST不可见;GET传输数据的大小会被浏览器和服务器限制,一般是2k,而POST可以传输较大量数据
- POST与PUT的区别:POST非幂等,PUT幂等;POST资源是在集合上,PUT在具体某一个资源上,所以put较安全,无论请求多少次都是在这个资源上改,post可能请求多少次就创建多少次资源
- 具体详见:常见请求方法
- 幂等的:连续调用一次或者多次的效果相同
常见HTTP响应
- Q:HTTP常见状态码有哪些?
A:
通用首部
Connection: Keep-Alive\r\n
Keep-Alive: timeout=5,max=100\r\n
含义:空闲5秒后关闭连接,服务器最多再为100个事务保持连接状态
MIME
MIME是一种文本标记,表示对象的类型和子类型
请求首部
HOST:从URL中提取出来
Referer:上一个页面的URL
响应首部
X-Frame-Option响应首部
- 用来设置页面是否可被嵌套到别的页面中
- 用来防御利用iframe嵌套的点击劫持攻击
- Deny:表示该页面不允许在frame中展示
- Sameorigin:表示该页面可以在相同域名页面的frame中展示
- Allow-from uri:表示该页面可以在指定来源的frame中展示
断点续传
- 并发分块下载
- 客户端并发请求相同资源的不同片段
- 如迅雷、IDM等
- Range请求首部:请求的资源范围
- Range:bytes = 306302-
- 请求这个资源中从306302个字节到末尾的部分
- Content-Range响应首部:响应的资源范围
- Content-Range:bytes 306302-604047/604048
- 响应中指示携带的是该资源的第306302-604047的字节,该资源共604048个字节
12.2 HTTP代理
HTTP代理服务器:位于客户和服务器之间的中间实体
为什么要使用代理?
- Web缓存:保存常用文档的副本
- 文档访问控制:设置不同用户访问服务器的权限
- 安全防火墙:检查流量
- 过滤代理:禁止访问某些特定网站
- 匿名者:删除HTTP请求报文中身份特征信息
- 转码代理:英文–》法文
Web代理
web代理中设置web高速缓存,保存最近请求过的对象的副本。
代理如何获取流量?
- 修改客户端:客户端主动配置
- 修改网络:在客户未知情况下将流量导向代理
- 修改DNS:手工编辑DNS名称列表或使用动态DNS服务器
- 修改web服务器:web服务器向客户发送一个重定向HTTP响应报文,将客户请求重定向到代理
代理相关请求首部
以及Trace请求方法
追踪HTTP报文
via首部:HTTP报文每经过一个代理,都必须将代理信息添加到Via列表的末尾
例如:Via:101 proxy.irenes-isp.net,i.1 p1127.att.net
Via的四组件:协议(HTTP时可声),版本,代理主机名,注释(可选)
请求Via和响应Via
请求Via总是与响应Via相反
Trace方法
用来跟踪请求报文经过哪些代理,以及请求报文被修改的信息
Max-Forwards首部
用来限制转发跳数
用来查看代理链中任意一个代理上收到的请求
每经过一个代理,Max-Forwards值减一
为0时,代理不再转发,并向客户发送TRACE响应
如上图,客户的Max-Forwards值为2
12.3 缓存文档的有效期
例:Expires:Tue,08 Feb 2022 11:35:14 GMT
Cache-Control:Max-age = 484200
If-Modified-Since请求首部
例如:If-Modified-Since:Mon,24 Dec 2018 09:07:57 GMT
- 与Last-Modified响应首部配合使用
- 客户之前请求过该文档,再次请求相同文档时使用
- 把已缓存文档的时间与服务器上实际文档的最后修改时间进行对比
- 相同:返回304 Not Modified,不返回文档的主体
- 不同:返回200 OK,返回新文档
思考:文档内容没变但修改日期改变,或文档内容变化微小的情况
个人认为,如果文档内容变化,即使微小也会发送If-Modified-Since请求首部,发现两端修改时间不一致,从而返回200,修改日期同理,应该也是返回200
If-None-Match请求首部
例如:If-None-Match:“03f2b33c0bfcc1:0”
- 与ETag响应首部配合使用
- 服务器给文档添加ETag信息(包含文档的版本、序列号、内容校验等);修改文档时,可修改文档的ETag
- 客户在HTTP请求报文中加入If-None-Match首部(=ETag值)
- 服务器验证文档的ETag是否改变:
- 没变:返回304 Not Modified,不返回文档的主体
- 改变:返回200 OK,返回新文档和新ETag
缓存和广告的矛盾
- 缓存:帮助用户提高响应速度;帮助网络运营商减少流量
- 广告:内容提供商的收益:广告的访问次数
- Cache-Control首部:
- no-cache:文档可以被缓存,但不提供给客户(除非文档进行了再验证)
- no-store:禁止缓存文档
- Meter首部:周期性地把对特定URL的命中次数回送给服务器
12.4 用户识别与Cookie
- Q:怎么理解“HTTP是无状态协议”?怎么解决HTTP的无状态
A:无状态是指协议对于事务处理没有记忆,服务器不知道客户端是什么状态。即我们给服务器发送HTTP请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。这意味着每个请求都是独立的。优点在于解放了服务器,每一次请求“点到为止”不会造成不必要连接占用,缺点在于每次请求会传输大量重复的内容信息。于是两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个是Session
Cookie应用于用户识别方向,常见的应用有:个性化问候、商品推荐、在线购物车、收货地址、信用卡等
- Q:cookies机制和session机制的区别?
A:Cookie可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了。而与之相对的Session是通过服务器来保持状态的。当客户端访问服务器时,服务器根据需求设置Session,将会话信息保存在服务器上,同时将标示Session的Sessionld传递给客户端浏览器,浏览器将其保存在内存中,以后浏览器每次请求都会额外加上这个参数值,服务器会根据这个Sessionld,就能取得客户端的数据信息。
12.5 HTTP认证
WWW-Authentication响应首部:服务器对客户的认证
Athentication请求首部:客户提供给服务器进行认证的数据
基本认证
摘要认证
12.6 HTTPS
HTTP的缺点:通信使用明文(易被窃听)、身份验证不强大(易被伪装)、无法证明报文的完整性(易被纂改)
- HTTP和HTTPS的区别?
A:HTTP+加密+认证+完整性保护=HTTPS
对称密钥加密技术
加密解密使用相同的密钥,任何人只要拿到密钥,都能破解密码
发送密钥就有被窃听的风险,但不发送,对方就不能解密。再说,密钥若能够安全发送,那数据也应该能安全送达
公开密钥加密技术
HTTPS采用混合加密机制
- 使用公开密钥加密方式安全地交换在稍后的共享密钥加密中要使用的密钥
- 确保交换的密钥是安全的前提下,使用共享密钥加密方式进行通信
报文被篡改
HTTPS用数字签名防止篡改,防否认,防伪造
也可以证明该报文是谁发送的
HTTP不验证身份
任何人都可以发起请求,任何请求都会返回一个响应
HTTPS使用证书证明身份
HTTPS没有代替HTTP的原因
加密通信会消耗更多的CPU及内存资源
要进行HTTPS通信,证书是必不可少的,而证书必须向认证机构(CA)购买
12.7 优化HTTP
HTTP请求只能由客户端发起,要实时显示更新内容,必须频繁向服务器发送请求
Ajax的解决方法
Ajax:实现局部Web页面更新
Comet的解决方法
收到客户请求,Comet先将响应挂起,当服务器端有内容更新时,再返回该响应
Ajax和Comet通信的特点:被动性(即服务端不能主动联系客户端,只能由客户端发起)
对服务器的要求:Ajax通信需要有很高的处理速度,Comet通信需要很高的并发处理能力
WebSocket
支持由服务器向客户端推送数据
需要先建立HTTP数据,之后使用WebSocket协议
12.8 HTTP2.0
二进制分帧、请求分优先级、HTTP首部压缩、服务器推送
二进制分帧
每个数据流以消息的形式发送,消息由一或多个帧组成
帧可以乱序发送,再根据每个帧首部的流标识符重新组装
请求分优先级
HTTP1.1持久连接Keepalive:等待订单1完成后,才能接收订单2
HTTP1.1 流水线Pipling:先响应订单1,再响应订单2
HTTP2.0 多路复用和请求优先级:订单2请求优先,服务器优先响应订单2
首部压缩
12.9 QUIC协议
QUIC(Quick Udp Internet Connection):google提出,基于UDP,并发传输
连接建立延时低
改进的拥塞控制
解决TCP重传的歧异问题
TCP重传时序号一样,这个ACK到底是原始报文段的响应还是重传报文段的响应?
Quic重传的Packet和原始Packet的Packet Number是严格递增的
连接迁移
一条TCP连接=(源IP,源端口,目的IP,目的端口)
在WIFI和4G移动网络切换时,客户端IP会发生变化,需要和服务端重新建立TCP连接
QUIC连接是以一个64位的随机数作为ID来标识,连接不受IP地址或者端口变化影响
BASE64编码
数字表示索引值
示例:
练习:求“Student”经BASE64编码后的字符
答:U3R1ZGVudA==
问题的回答
其他问题都能在上面找到答案,剩下的这里单独给出
-
Q:浏览器在与服务器建立了一个TCP连接后是否会在一个HTTP请求完成后断开?什么情况会断开?
A:在HTTP1.0中,一个服务器在发送完一个HTTP相应后,会断开TCP连接。但是这样每次请求都会重新建立和断开TCP连接,代价过大。所以HTTP1.1中就把持久连接写进标准且默认开启。除非请求中写明Connection:close,那么浏览器和服务器之间是会维持一段时间的TCP连接,不会一个请求结束就断掉 -
Q:一个TCP连接中多个HTTP请求可以同时发送吗?
A:根据上一题就可以知道,如果维持连接,一个TCP连接是可以发送多个HTTP请求的。但是HTTP1.1存在一个问题,单个TCP连接在同一时刻只能处理一个请求,虽然HTTP1.1规范中规定了Pielining来试图解决这个问题,但是这个功能在浏览器中默认是关闭的。因为这个功能看起来很美好,但是在实践中会出现很多问题:一些代理服务器不能正确的处理HTTP Pipelining;正确的流水线实现是复杂的,连接头端阻塞等等。但是,HTTP2.0提供了多路传输特性,可以在一个TCP连接中同时完成多个HTTP请求 -
Q:浏览器对同一Host建立TCP连接的数量有没有限制?
A:如果是HTTP1.1,没有2.0的多路传输,遇到资源过多的网页不可能建立巨量的TCP连接和HTTP请求,所以是有限制的,chrome的上限是允许对同一个Host建立6个TCP连接。不同浏览器有一些区别 -
Q:浏览器收到的HTML文档包含几十个图片标签,如何下载这些图片?(考虑方式、顺序、建立连接数量)
A:如果图片都是 HTTPS 连接并且在同一个域名下,那么浏览器在 SSL 握手之后会和服务器商量能不能用 HTTP2,如果能的话就使用 Multiplexing 功能在这个连接上进行多路传输。不过也未必会所有挂在这个域名的资源都会使用一个 TCP 连接去获取,但是可以确定的是 Multiplexing 很可能会被用到。
如果发现用不了 HTTP2 呢?或者用不了 HTTPS(现实中的 HTTP2 都是在 HTTPS 上实现的,所以也就是只能使用 HTTP/1.1)。那浏览器就会在一个 HOST 上建立多个 TCP 连接,连接数量的最大限制取决于浏览器设置,这些连接会在空闲的时候被浏览器用来发送新的请求,如果所有的连接都正在发送请求呢?那其他的请求就只能等等了。
这些问题都可以在占小狼的博客中找到,具体内容里面会有说明
好了,计算机网络协议学习笔记系列到这里结束了,共16次笔记,个人的考试是在6月初,所以近期会再发一篇计算机网络协议分析的总结作为个人的复习资料
上一课:第15课 FTP