《图解HTTP》读后笔记
作者:互联网
图解HTTP读后笔记
- 第一章 了解Web以及网络基础
- 第二章 简单的HTTP协议
- 第三章 HTTP报文内的HTTP信息
- 第四章 返回结果的HTTP状态
- 第五章 HTTP协作的Web服务器
- 第六章 HTTP首部
- 第七章 确保Web安全的HTTPS(重点)
- 第八章 确认访问用户身份的认证
- 第九章 基于HTTP的功能追加
- 后续章节
第一次写博文,有错误请指教,感谢!
第一章 了解Web以及网络基础
TCP的三次握手
SYN – synchronize
ACK – acknowledgement
负责域名解析的DNS服务
DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。
URL和URI
URI:统一资源标识符。用字符串标识某一互联网资源,用某个协议方案表示资源的定位标识符。
URL:统一资源定位符。表示资源的地点(互联网上所处的位置)。
URL是URI的子集。
来源于网络的解释:
URI包括URL和URN两个类别,URL是URI的子集,所以URL一定是URI,而URI不一定是URL
URI = Universal Resource Identifier 统一资源标志符,用来标识抽象或物理资源的一个紧凑字符串。
URL = Universal Resource Locator 统一资源定位符,一种定位资源的主要访问机制的字符串,一个标准的URL必须包括:protocol、host、port、path、parameter、anchor。
URN = Universal Resource Name 统一资源名称,通过特定命名空间中的唯一名称或ID来标识资源。
举个例子:个人的身份证号就是URN,个人的家庭地址就是URL,URN可以唯一标识一个人,而URL可以告诉邮递员怎么把货送到你手里。
第二章 简单的HTTP协议
http是不保存状态的协议
Http协议自身不具备保存之前发送过的请求和响应的功能。
HTTP方法
GET&POST常用。
PUT不常用,用来传输文件, 就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。 由于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全问题,所以一般Web网站不采用该方法。
DELETE也不常用,存在和PUT一样的安全问题。
HEAD请求和GET类似,只是不返回响应体。
OPTIONS方法 用来查询针对请求URI指定的资源支持的方法。
TRACE方法是 让Web服务器端将之前的请求通信环回给客户端的方法,不常用。
CONNECT方法 要求用隧道协议连接代理。
HTTP/1.1持久连接
特点: 将任意一端没有明确提出断开,连接则保持TCP连接状态。
COOKIE实现状态管理
上图中响应中添加的Cookie是在响应体里面Set-Cookie键对应的值里面的。
第三章 HTTP报文内的HTTP信息
Http请求空行
CR+LF:CR(Carriage Return, 回车符:16进制0x0d)和LF(Line Feed, 换行符: 16进制0x0a)
Http报文
是http通信中的基本单位,由八个位字节流组成。
支持发送多种数据的多部分对象集合
采用了MIME机制(多用途因特网邮件扩展)
与首部字段content-type有关
获取部分内容的范围请求
用到首部字段Range
针对范围请求,响应会返回状态码为206的响应报文。
补充:对于多重范围请求,响应会在首部字段Content-Type标明multipart/byteranges后返回响应报文。如果服务器无法响应范围请求,则会返回状态码200 OK和完整的实体内容。
内容协商
内容协商机制,是指客户端和服务器端就相应的资源内容进行交涉,然后提供给客户端最为适合的资源内容,协商会议响应资源的语言,字符及编码方式等作为判断的基准。
相关的首部字段有:
Accept, Accept-Charset, Acccept-Encoding, Accept-Language, Content-Language
三种协商方式:
- 服务器驱动协商: 由服务器端进行内容协商。以请求的首部字段为参考在服务器端自动处理。
- 客户端驱动协商: 由客户端进行内容协商的方式。
- 透明协商: 是服务器驱动和客户端驱动的结合体,由服务器端和客户端各自进行内容协商的一种办法。
第四章 返回结果的HTTP状态
状态码
状态码如 200 OK,以3位数字和原因短语组成。
2XX成功
200 OK
表示从客户端发来的请求在服务器端被正常处理了
204 No Content
该状态码表示服务器接收的请求已经成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。
一般在只需要往服务器发送信息,而客户端不需要发送新信息内容的情况下使用。
206 Partial Content
该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。响应报文中包含由Content-Range指定范围的实体内容。
3XX 重定向
301 Moved Permanently
永久性重定向。该状态码表示请求的资源已经被分配了新的URI,以后应该使用资源现所指的URI。
302 Found
临时性重定向。该状态码表示请求的的资源已经分配了新的URI,希望用户(本次)能使用新的URI访问。
303 See Other
该状态码表示,由于请求对应的资源存在着另一个URI,应该使用GET方法,定向获取请求的资源。303和302有着相同的功能,但是303明确GET方法。
当301、302、303响应状态码返回时, 几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。
301、302标准是禁止将POST方法改成GET方法的,但是实际使用时大家都会这么做。
304 Not Modified
该状态码表示客户端发送附带条件的请求时,服务器允许请求访问资源,但是未满足条件的情况。304状态码返回时,不包含任何响应的主体部分。304虽然被划分到3XX中,但是和重定向并没有什么关系。
附带条件的请求:采用GET方法的请求报文中包含If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since中的任一首部。
307 Temporary Redirect
临时重定向。与302有相同的含义。307会遵守浏览器规范,不会从POST编程GET。
4XX 客户端错误
400 Bad Request
该状态码表示请求报文中存在语法错误。
401 Unauthorized
该状态码表示发送请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。另外若之前已进行过1次请求,则表示用户认证失败。
返回含有401的响应必须包含一个合适于被请求资源的WWW-Authenticate 首部用以质询(chanllenge)用户信息。当浏览器初次接收到401响应,会弹出认证用的对话窗口。
403 Forbidden
该状态码表明对请求资源的访问被服务器拒绝了。(拒绝访问)
404 Not Found
该状态码表明服务器上无法找到请求的资源。(找不到资源)
5XX 服务器错误
500 Internal Server Error
该状态码表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。
503 Service Unavailable
该状态码表明服务暂时处于超负载或正在进行停机维护,现在无法处理请求。
第五章 HTTP协作的Web服务器
用单台虚拟机实现多个域名
物理层面只有一台服务器,但是只要使用虚拟主机的功能,则可以假想成已经有多台服务器。
若两个域名同时部署在同一个服务器上(相同的ip地址),使用DNS服务解析域名之后,两者的访问IP是相同的,因此要区分的时候必须在Host首部内完整指定主机名或域名的URI。
通信数据转发程序
代理
代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求,并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
-
代理不会改变URI,会直接发送给前方持有资源的目标服务器。
-
Via首部信息
-
使用代理服务器的理由:利用缓存技术减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的,等等。
-
代理分类基准:一种是是否使用缓存,另一种是是否修改报文
-
- 缓存代理:代理转发响应时,缓存代理会预先将资源的副本缓存在代理服务器上。
- 透明代理:转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理。
网关
网关是转发其他服务器通信数据的服务器,接收从客户端发送过来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。
利用网关可以由HTTP请求转化为其他通信协议通信
因此利用网关能提高通信的安全性
隧道
隧道是在相隔很远的客户端和服务器之间进行中转,并保持通信连接的应用程序。
目的是建立安全的通信,例如SSL等加密手段进行通信,隧道本身是透明的,客户端不用在意隧道的存在。
保存资源的缓存
缓存可以避免多次从源服务器转发资源
缓存具有有效期限
分为客户端缓存和缓存服务器缓存
第六章 HTTP首部
HTTP首部字段
-
通用首部字段
-
Cache-Control 控制缓存的行为
-
Connection 控制不再转发给代理的首部字段;管理持久连接
-
Date 表明创建HTTP报文的日期和时间
-
Pragma 作为HTTP/1.0的向后兼容而定义的
-
Trailer 说明在报文主体后记录了哪些首部字段
-
Tramsfer-Encoding 传输报文主体时草用的编码方式
-
Upgrade 检测协议是否可以用更高版本
-
Via 客户端和服务器之间报文传输路径
-
……
-
-
请求首部字段
- Accept 告诉服务器用户代理能处理的媒体类型和相对优先级
- Accept-Charset 告诉服务器用户代理能支持的字符集和相对优先级
- Accept-Encoding 告诉服务器用户代理能支持的用户编码和相对优先级
- Accept- Language 告诉服务器用户代理能处理的自然语言集和相对优先级
- Authorization 告诉服务器用户代理的认证信息
- Host 告知服务器请求的资源所处的互联网主机名和端口号(!!因为有多虚拟主机在一个ip的情况!!)
- If-xxx 条件请求,满足特定条件才会返回请求
- Max-Forwards 每经过一个服务器转发,值减一,常用来服务器故障判断
- Range 获取部分资源请求
- ……
-
响应首部字段
- Accept- Ranges:能否处理范围请求
- Age 告知客户端源服务器多久前创建了响应
- Location 常常与重定向连用
- WWW-Authenticate
-
实体首部字段
- Allow 通知客户端支持的HTTP方法
- Content - Encoding 告知客户端服务器对实体的主体部分选用的内容编码方式
- Content - Language 语言
- Content - Length 大小
- ……
-
为Cookie服务的首部字段
- Set-Cookie 响应首部字段
- Cookie 请求首部字段
第七章 确保Web安全的HTTPS(重点)
Http的缺点(重点)
- 通信使用明文,内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,有可能已经遭到篡改
Http+加密+认证+完整性验证 = Https
Https不是应用层的新协议,而是Http通信接口部分用SSL和TLS协议代替而已。
SSL是独立于HTTP的协议,不光是HTTP,其他运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。可以说SSL是当今世界上应用最为广泛的网络安全技术。
共享密钥加密(对称密钥加密)
加密和解密用一个密钥
公开密钥加密
非对称加密,私钥和公钥
Https采用混合加密机制
在交换密钥的环节使用公开密钥的加密方式,之后建立连接后交换报文阶段使用共享密钥加密。
证明非对称加密中来自服务器的公钥正确性的证书
数字证书认证机构(CA)
确认派发公钥流程(重要):
- 服务器运营人员向数字证书认证机构提出公开密钥的申请。
- 数字证书认证机构对公开密钥做签名
- 并将公开密钥放入数字证书里面
- 客户端在接收到该数字证书后,用CA提供的公钥(事先已经分配给浏览器客户端的)对其进行解密,能成功解密拿到服务器端公钥的话则证明:
- 数字证书权威且有效
- 服务器端公开密钥有效
Http通信流程(面试必问)
- 客户端向服务器发送请求,连接到服务器的443接口,发送的信息是随机值1和客户端支持的加密算法,SSL版本信息等;
- 服务器接收到信息后响应握手信息,包括随机数2和匹配好的协商加密算法等;
- 随即服务器给客户端回送的第二个报文是数字证书(上面流程中说过的);
- 客户端解析证书,这部分工作由TLS来完成,验证证书的时效,机构等信息确保拿到客户端的公钥;
- 客户端认证证书通过后,生成随机数3,用服务器端公钥加密组装成会话密钥;
- 传送加密信息给服务器端,服务器私钥解密拿到随机数3,和之前的随机数2和1组装成会话密钥,作为后续共享密钥通信的密钥;
- 客户端通过会话密钥加密发送一条消息给服务端,主要验证服务器是否能正常接收解密;
- 服务器成功接收解密后也会通过会话密钥加密发送一条消息回传给客户端,如果客户端接收解密成功,则SSL建立完成。
SSL速度慢吗?
Https比Http慢2~100倍
SSL的慢分为两种
- 通信慢
- 由于SSL必须进行加密处理,会导致大量消耗内存和CPU等资源,导致处理速度变慢
为什么不一直使用HTTPS?
- 有些场合对信息安全性要求不高,对访问速度的要求更高
- 与纯文本通信相比,加密通信会消耗更多的CPU和内存资源
- 购买证书需要一定的开销
第八章 确认访问用户身份的认证
Http/1.1使用的认证方式
- BASIC 认证(基本认证)
- DIGEST 认证(摘要认证)
- SSL 客户端认证
- FormBase 认证
BASIC 认证
缺点:Base64编码不是加密,相当于明文传输,安全性不高,一般浏览器无法实现认证注销操作,不灵活,所以并不常用;
DIGEST 认证
采用质询/响应方式(challenge/response)
缺点:认证等级虽然比BASIC认证高,可以防止明文窃听,但是并不存在防止用户伪装的保护机制;
SSL客户端认证
缺点:CA costs a lot.
基于表单认证
认证多半是表单认证。
一般使用Cookie来管理会话Session。
第九章 基于HTTP的功能追加
HTTP的瓶颈
- 一条连接上只可以发送一个请求。
- 请求只能从客户端开始。客户端不可以接收除响应外的指令。
- 请求/响应的首部未经压缩就发送。首部信息越多延迟越大。
- 可以选择数据压缩格式。非强制压缩发送
HTTP/2.0和1.1区别(面试题)
- HTTP/2.0采用二进制格式而非文本格式
- 比起像HTTP/1.x这样的文本协议,二进制协议解析起来更高效、“线上”更紧凑,更重要的是错误更少。
- HTTP/2.0是完全多路复用的,而非有序并阻塞的——只需一个连接即可实现并行
- HTTP/1.x 有个问题叫线端阻塞(head-of-line blocking), 它是指一个连接(connection)一次只提交一个请求的效率比较高, 多了就会变慢。 HTTP/1.1 试过用流水线(pipelining)来解决这个问题, 但是效果并不理想(数据量较大或者速度较慢的响应, 会阻碍排在他后面的请求). 此外, 由于网络媒介(intermediary )和服务器不能很好的支持流水线, 导致部署起来困难重重。而多路传输(Multiplexing)能很好的解决这些问题, 因为它能同时处理多个消息的请求和响应; 甚至可以在传输过程中将一个消息跟另外一个掺杂在一起。所以客户端只需要一个连接就能加载一个页面。
- 使用报头压缩,HTTP/2.0降低了开销
- 假定一个页面有80个资源需要加载(这个数量对于今天的Web而言还是挺保守的), 而每一次请求都有1400字节的消息头(这同样也并不少见,因为Cookie和引用等东西的存在), 至少要7到8个来回去“在线”获得这些消息头。这还不包括响应时间——那只是从客户端那里获取到它们所花的时间而已。这全都由于TCP的慢启动机制,它会基于对已知有多少个包,来确定还要来回去获取哪些包 – 这很明显的限制了最初的几个来回可以发送的数据包的数量。相比之下,即使是头部轻微的压缩也可以是让那些请求只需一个来回就能搞定——有时候甚至一个包就可以了。这种开销是可以被节省下来的,特别是当你考虑移动客户端应用的时候,即使是良好条件下,一般也会看到几百毫秒的来回延迟。
- HTTP/2.0让服务器可以将响应主动“推送”到客户端缓存中
- 当浏览器请求一个网页时,服务器将会发回HTML,在服务器开始发送JavaScript、图片和CSS前,服务器需要等待浏览器解析HTML和发送所有内嵌资源的请求。服务器推送服务通过“推送”那些它认为客户端将会需要的内容到客户端的缓存中,以此来避免往返的延迟。
后续章节
是构建Web内容和Web攻击相关的知识,没有细看。
标签:HTTP,请求,报文,认证,服务器,图解,读后,客户端 来源: https://blog.csdn.net/qq_40651356/article/details/111773206