【网络知识】| 作者 / Edison Zhou
这是EdisonTalk的第293篇原创内容
作为一个专业的IT技术人,一个Web应用开发者,不了解网络基础和协议,怎么能行?本文是我2016年阅读《图解HTTP》一书的读书笔记,希望对你有所帮助!
1关于《图解HTTP》
目前国内讲解HTTP协议的书实在太少了,记忆中有两本被誉为经典的书《HTTP权威指南》与《TCP/IP详解,卷1》,但内容晦涩难懂,学习难度较大。其实,HTTP协议并不复杂,理解起来也不会花费太多学习成本,这本书的出现就及时缓解了该问题。对基础及核心部分的深入学习是成为一名专业技术人员的前提,以不变应万变才是立足之本。此外,这本书也是我在2016年度读书计划中的一本,它和《图解TCP/IP》一起作为计算机网络基础部分为我温故知新了一把,谢谢作者和译者,画了这么多图解让我们理解。
2HTTP协议初探
各种协议与HTTP协议的关系
请求处理相应模型
HTTP协议规定,请求从客户端发出,最后服务端响应应该请求并返回。
请求报文:由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的。
响应报文:由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。
HTTP协议是一种无状态协议
HTTP协议对于发送过的请求或响应都不做持久化处理:协议本身并不保留之前一切的请求或响应报文的信息,这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能,于是引入Cookie技术。有了Cookie再用HTTP协议通信,就可以管理状态了。
Cookie根据服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端自动在请求报文中加入Cookie值后发送出去。服务端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
告知服务器意图的HTTP方法
(1)GET:获取资源
(2)POST:传输实体主体 → POST的主要目的并不是获取响应的主体内容
(3)PUT:传输文件 → 就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置
但是,鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,所以存在安全性问题,因此一般的Web网站不使用该方法。
(4)HEAD:获得报文首部 → HEAD与GET一样,只是不返回报文主体部分,用于确认URI的有效性及资源更新的日期时间等等。
(5)DELETE:删除文件 → DELETE与PUT相反,DELETE按请求URI删除指定资源。
但是,HTTP/1.1的DELETE方法本身与PUT方法一样不带验证机制,所以一般的Web网站也不使用DELETE方法。
(6)OPTIONS:询问支持的方法 → 查询针对请求URI指定的资源所支持的方法(例如该资源支持GET、POST、PUT等)。
(7)TRACE:追踪路径 → 让Web服务器端将之前的请求通信还回给客户端的方法。(不常用,容易引发XST攻击)
(8)CONNECT:要求用隧道协议连接代理 → 要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和TLS协议把通信内容加密后经过网络隧道传输。
CONNECT方法的格式:CONNECT 代理服务器名:端口号 HTTP版本
持久连接
在HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。因此,每次的请求都会造成无谓的TCP连接建立与断开,增加通信量的开销。为了解决这个问题,HTTP/1.1想出了持久连接(也称为HTTP keep-alive),其特点是:只要任意一端没有明确提出断开连接,则保持TCP连接状态。
持久连接的好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器的负载,也使得HTTP请求和响应能够更早地结束,这样Web页面的显示速度也就相应的提高了。在HTTP/1.1中,所有的连接默认都是持久连接。
3HTTP报文详解
用于HTTP协议交互的信息就被称为HTTP报文,请求段的叫做请求报文,响应端的叫做响应报文。HTTP报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。
HTTP报文结构
(1)HTTP报文大致可以分为报文首部和报文主体两块
(2)请求报文和响应报文的结构实例
部分内容的范围请求
通常下载一个大文件时如果遇到网络中断的情况,那就必须重头开始,因此为了解决上述问题,就需要一种可恢复的机制。所谓恢复就是指从之前下载的中断处恢复下载。要实现该功能需要制定下载的实体范围,这就叫范围请求(Range Request)。
对一份10000字节大小的资源,如果使用范围请求,可以只请求5001~10000字节内的资源。执行范围请求时,就会用到Range来指定资源的byte范围。
内容协商机制
内容协商机制就是指在客户端和服务端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源。内容协商会议响应资源的语言、字符集、编码方式等作为判断的基准。
So,有哪些判断的基准呢?
Accept Accept-Charset
Accept-Encoding
Accept-Language
Content-Language
HTTP状态码
HTTP状态码负责表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
(1)2XX 成功 → 表明请求被正常处理了,如200 OK,204 No Content,206 Partial Content
(2)3XX 重定向 → 表明浏览器需要执行某些特殊的处理以正确处理请求。如301 Moved Permanently(永久移动),302 Found(临时移动),303 See Other(资源的URI已更新,是否能临时按新的URI访问)、304 Not Modified(资源已找到,但未符合条件请求)、307 Temporary Redirect(临时重定向)
(3)4XX 客户端错误 → 表明客户端是发生错误的原因所在。如400 Bad Request(请求报文中存在语法错误),401 Unauthorized(认证失败或未认证)、403 Forbidden(不允许访问这个资源)、404 Not Found(服务器上没有请求的资源)。
(4)5XX 服务器错误 → 表明服务器本身发生错误。如500 Internal Server Error(服务器端在执行请求时发生了错误,也可能是Web应用存在的Bug或某些临时的故障),503 Service Unavailable(表明服务器暂时处于超负载或正在停机维护,无法处理请求)。
HTTP首部
HTTP/1.1规范定义了如下47种首部字段:
(1)通用首部字段
(2)请求首部字段
(3)响应首部字段
(4)实体首部字段
Ref参考资料
[日]上野宣,《图解HTTP》
后台回复:图解HTTP,即可获得pdf下载链接哟!
姊妹篇:《图解TCP/IP》学习总结
????扫码关注EdisonTalk
设为星标,不再失联!
往期推文合集:2020年上半年推文合集
成都新鲜坑位:喜鹊生活招聘.NET开发