当前位置: 首页 > news >正文

【个人向】《HTTP图解》阅后小结

前言

计算机网络课程的学习已经是在大二下学期的时候了,过去了半年多,有很多东西似乎都忘记了QAQ。况且当时上课的时候就感觉专业术语多,很多知识也难以理解,但是还是硬着头皮学了下来,如今阅读《HTTP图解》这本书发现很好理解,但是需要加强印象还得自己总结与实践,所以写了这篇文章。

网络基础

最初的念想
借助多文档之间的关联形成的超文本连成可互相参阅的万维网。

三项WWW构建技术:

  1. SGML作为页面的文本标记语言的HTML(HTML5已不在SGML基础上)
  2. 作为文档传递协议的HTTP
  3. 指定文档所在地址的URL

HTTP(超文本传输协议,书上说称为超文本转移协议更严谨)
破壳日:1989年3月
客户端到服务器通信的流程是建立在HTTP协议之上的。

TCP/IP的协议模型
图片描述
在每次进行信息传输的时候,信息都要从高层传到底层,会经过不断的“包装”。再从对方的底层传到高层,这时会不断的“拆包装”。
在这之中也会用到各个层的一些很重要的协议,在一次HTTP请求发送中:
应用层(应用层、表示层、会话层):HTTP、DNS
传输层:TCP
网络层:IP、ARP
其中DNS协议用于解析域名,TCP协议用于确定目标计算机资源端口,IP协议用于确定目标计算机的IP地址,ARP协议用于把IP地址转换为真正的物理地址MAC。

TCP协议
TCP提供可靠的字节流服务,会把数据分割成报文段进行发送。
TCP用SYN和ACK标志来确认对方是否成功送达:
1.发送端发送:SYN。
2.接收端接收后,发送SYN和ACK。
3.发送端接收后,再次发送ACK,握手结束。

综上,当我们从浏览器输入一个URL后,发生了这些事:
客户端想浏览URL为 http://www.mochiko.cn 的页面,HTTP协议生成请求页面资源报文,TCP协议把HTTP请求报文分割为多个文段,把文段可靠的传给对方。随后IP协议搜索对方的地址,一遍中转,一遍传送。(省略了网络层以下的了)随后TCP协议把收到的报文段重新组合成原来的顺序,然后HTTP协议把WEB服务器请求的内容进行处理,并返回请求的结果和内容。
图片描述
wireshark抓包结果可看到,首先发生了三次握手,建立起了TCP链接。随后发出HTTP请求,TCP再把报文分成了四段发送,其中收到了三个数据接收回复,最后HTTP返回200 OK表示成功发送完了主页的HTML文件。
图片描述
在此次抓包中,这里的x=0,y=0,第二次x=1,第三次,x=y=1,符合图中的规则。

URL
URI 统一资源标识符(在《HTTP权威指南》里面对URI的解释更充分一点)

协议方案名://登录信息@服务器地址:端口号/带层次的文件路径?查询字符串#片段标识符

初识HTTP

  • HTTP协议用于客户端和服务器端之间的通信,请求必定由客户端发出,服务器端被动回复。
  • HTTP协议不保存状态,是无状态协议。
  • HTTP协议使用URI定位互联网资源。

请求报文

图片描述

开头GET是请求服务器的类型,即方法,随后的“/”表示请求访问的资源对象。最后的HTTP1.1是版本号。

请求报文结构
0069luTRgy1fn5k0z12mpj30nd0ak3z1.jpg

响应报文

图片描述

开头是HTTP的版本,200是状态码,OK是短语。下面(没截)还带有HTML的主体代码。

响应报文结构
0069luTRgy1fn5k11fm9pj30n70at3z3.jpg

HTTP方法

GET:获取资源
指定的资源经过服务器解析后返回相应内容,即文本直接返回,CGI返回经过执行后的结果。

POST: 传输实体主题
PUT和GET功能相似,但是POST的主要目的不是获取响应的主题内容

PUT:传输文件
像FTP文件上传一样,要把请求报文主题包含在文件内容,保存在请求URI的指定位置上。
HTTP/1.1的PUT自身不带验证,任何人都可以上传,存在安全性问题,一般不使用。若配合WEB应用程序的验证机制或架构设计采用REST标准则可能开放使用。

HEAD:获得报文首部
和GET方法一样,但不返回报文主体部分。用于确认URI有效性和资源更新的日期等。

DELETE:删除文件
与PUT相反的方法,同样存在安全性问题。

OPTIONS:询问支持的方法
查询针对请求URI指定的资源支持方法。
1.1版本才支持。

TRACE:追踪路径
让WEB服务器端将之前的请求通信环回给客户端,发送请求把Max-Forwards首部字段填入数值,每经过一个服务器端就把该数字减1,是0时停止传输。容易引发XST攻击,通常不会用到。
1.1版本才支持。

CONNECT:用隧道协议连接代理
主要用SSL和TSL协议把通信内容加密经网络隧道传输。
1.1版本才支持。

其他特性

持久链接节省通信量
HTTP 1.1和部分HTTP 1.0提供持久链接,只要任意一段没有提出断开链接,就保持TCP链接状态。
图片描述

可以查看抓包数据,发送成功一个请求后没有断开TCP连接,此图也适用于管线化的说明,同时发送几个HTTP请求。

管线化
从前必须要收到响应才发送新的请求,而管线化技术不需要等待,可以同时发送多个请求。

Cookie管理状态
因为HTTP是无状态的协议,所以需要Cookie来管理状态:
1.客户端发送请求。
2.服务器对这个客户端生成一个Cookie,保存下来,并发送回去。
3.客户端保存这个Cookie。
4.客户端第二次发送请求,带着Cookie一起发送。
5.服务器坚持Cookie,分析出是刚才那个客户端。

了解HTTP

HTTP报文本身是由多行(CR+LF换行符)数据构成的文本。[这点上头的示例报文很明显了]。

压缩内容编码
原貌传输速度没有压缩后的编码速度快,但是相应会消耗资源。
常见编码有:

  1. gzip(GUN zip)
  2. compress
  3. deflate
  4. identity

报文主体和实体主体
报文主体用于传输请求或者响应实体主体。

分块传输编码
把实体主体分成多个部分,每一块用十六进制标记块大小,最后一块用“0(CR+LF)”标记。

发送多种数据多对象集合
MINE机制允许多个不同类型的二进制数据以ASCII码指明。
多部分对象集合包含:
1.multipart/form-data
2.multipart/byteranges
3.multipart/form-data
用boundary字符串(指定各个实体开始和结束加入--)划分多部分对象集合类型。
图片描述

range获取指定范围数据
图片描述

图为一个大图的GET请求,Range表示请求933343~2151819之间的字节

图片描述

针对范围请求,会有206状态码返回。若服务器无法响应,就是返回200状态码。

Accept内容协商
包括服务器驱动协商,客户端驱动协商和透明协商
Accept
Accept-Charset
Accept-Encoding
Accept-Language
Content-Language

协作HTTP的WEB服务器

虚拟主机
物理层面只有一台服务器,利用虚拟主机可以实现为多个域名提供各自的服务。
DNS服务把域名解析为IP地址,服务器假如托管了多个域名,必须要弄清楚到底是访问了哪个。即应在HTTP报文Host首部标记清楚。

HTTP通信除了客户端和服务器之间,还有一些用于通信数据转发的应用程序:代理、网关、隧道配合工作。
代理
具有转发功能的应用程序,服务器与客户端之间的中间角色。

网关
转发其他服务器通信数据的服务器,即与非HTTP协议进行通信。

隧道
相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接。

代理
接收客户端发送请求转发给其他服务器,代理不改变请求URI,直接发送给前方拥有资源的目标服务器。
每次经过一个代理,会追加写入Via首部信息。
缓存代理:转发响应会把预先资源的副本保存在代理服务器上,有一个期限,下次请求可以直接返回。(缓存还可以留在浏览器中,叫做临时网络文件)
透明代理:转发不对报文做任何加工(反之则是非透明代理)。

状态码和短语

1XX Information

接受的请求正在处理

2XX Success

请求正常处理完毕

200 OK
客户端发来的请求被正常处理了,返回的信息因为方法不同而不同。

204 No Content
客户端发来的请求被正常处理了,但不包含实体的主体部分。

206 Partial Content
客户端进行了范围请求,且服务器正确执行了请求,响应报文中包含由Content-Range指定范围的主体。

3XX Redirection

重定向,需要进行附加操作

301 Move Permanently
永久性重定位,状态码表示请求的资源已经被分配了新的URI,以后应用现在指定的URI。如果URI保存书签了,也应该按照Location首部字段提示保存。
图片描述
输入URL最后不加/会产生301状态码

302 Not Found
临时性重定向,请求的资源被分配了新的URI,希望用户用新的URI访问。

303 See Other
与302有相同的功能,但是303明确表示客户端用GET方法获取资源。

304 Not Modified
客户端发送附带条件的GET请求:If-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since,服务器允许请求资源,但因发生请求不满足条件而返回。

307 Temporary Redirect
临时重定向,与302 Found相同含义。307不会从POST变成GET,不过要看具体浏览器。

4XX Client Error

客户端错误

400 Bad Request
请求报文中存在语法错误。

401 Unauthorized
发送请求需要通过HTTP认证的认证信息。头部必须包含一个WWW-Authentiate首部质询用户信息

403 Forbidden
访问请求资源被拒绝。

404 Not Found
无法找到资源或者服务器拒绝请求且不想说明理由。

5XX Server Error

500 Internal Service Error
服务器在执行请求时发生了错误。

503 Service Unvaliable
服务器暂时超载或正在进行停机维护,无法进行处理。若事先知道时间,返回Retry-after字段。

HTTP/1.1通用首部字段

即响应报文和请求报文都可以用的字段
Cache-Control
操作缓存,参数可选,逗号分隔
public:其他用户也可以利用缓存。
private:特定用户可以利用缓存。
no-cache:不是不缓存,是客户端不接受缓存过的响应,所以缓存服务器必须要把请求转发出去。若对它赋值(如no-cache=Location),表示客户端接收到这个参数的响应报文后不能使用缓存。
no-store:按时请求或响应中包含机密信息。规定缓存不能在本地存储请求或响应的部分。
s-maxage: 功能和max-age相同,但这个适用于多位用户使用的公共缓存服务器。
max-age: 单位秒,缓存时间比指定时间数值小则接收数据。HTTP/1.1还存在Expires首部字段,会优先处理max-age,而HTTP/1.0中max-age会被忽略。
min-fresh:缓存服务器返回至少还未过指定时间的缓存资源。
max-stale:过期缓存资源也接收。
only-if-cached:客户端仅在缓存服务器本地缓存目标资源的情况下返回,若请求缓存服务器本地缓存无反应,返回504。
must-revalidate:代理向源服务器再次验证即将返回响应缓存是否有效。无法连接服务器返回504。用这条会忽略max-stale。
proxy-revalidate:所有缓存服务器在收到客户端指令请求返回时,再次验证缓存有效性。
no-transform:请求或相应中都不能改变主体媒体类型。

Connection

  1. 控制不再转发给代理的首部字段
  2. 管理持久连接:HTTP/1.1默认是持久链接,想断开连接指定Connection:Close。旧版本默认是非持久,所以需要指明Connection:Keep-Alive。

    Connection:不再转发的首部字段名
    Connection:close

Date
创建HTTP报文的日期时间

Pragma
历史遗留字段,为了兼容而存在
Pragma:no-cacheyao要求中间缓存服务器不返回缓存。

Trailer
事先说明在报文主体后记录了哪些首部字段。

Transfer-Encoading
规定报文主体采用的编码方式。进队分块传输编码有效。

Upgrade
检测HTTP协议及其他协议是否可使用高版本进行通信,参数可以指定一个完全不同的通信协议。

Via
追踪客户端与服务器之间的请求和响应报文的传输路径。

Warning
从1.0版本的Retry-After演变过来的,通常会告知用户一些缓存相关的问题警告。
1.1版本定义了7种警告:
110 Response is stale 代理返回已过过期资源
111 Revalidation failed 代理再验证资源有效失败
112 Disconnection operation 断开连接操作
113 Heuristic expiration 试探性过期,响应试用期超过24小时
199 Miscellaneous warning 任意的警告内容
214 Transformation applied 代理对内容编码或媒体类型执行了某些处理
299 Miscellaneous persistent warning 任意的警告内容

相关文章:

  • complexType
  • JAVA利用HttpClient进行POST请求(HTTPS)
  • 关于terracotta在tomcat集群中做session共享的问题
  • JAVA生成微信JSSDK接口签名
  • 工作总结-发送修改数据的请求时,修改数据成功,但是报非安全https请求,响应失败...
  • 陈松松:一个视频如何获得不同视频网站的排名秘诀
  • [译]自主权身份简介
  • [Linux] PHP程序员玩转Linux系列-telnet轻松使用邮箱
  • Linux程序接口实验:取进程标志及用户信息
  • SHELL编程练习-批量创建删除用户和组
  • angular学习第一篇-----环境搭建
  • 回溯算法入门及经典案例剖析(初学者必备宝典)
  • Linux系统的LOG日志文件及入侵后日志的清除
  • C# int? 关键字
  • 4-机器学习启蒙- 聚类和相似度模型
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 4. 路由到控制器 - Laravel从零开始教程
  • 78. Subsets
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Intervention/image 图片处理扩展包的安装和使用
  • java概述
  • Java教程_软件开发基础
  • Js基础——数据类型之Null和Undefined
  • React-flux杂记
  • 大主子表关联的性能优化方法
  • 工程优化暨babel升级小记
  • 回流、重绘及其优化
  • 利用jquery编写加法运算验证码
  • 前端工程化(Gulp、Webpack)-webpack
  • 使用 QuickBI 搭建酷炫可视化分析
  • 树莓派 - 使用须知
  • 详解NodeJs流之一
  • 用element的upload组件实现多图片上传和压缩
  • 与 ConTeXt MkIV 官方文档的接驳
  • kubernetes资源对象--ingress
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • (04)odoo视图操作
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (多级缓存)多级缓存
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET 4.0中的泛型协变和反变
  • .net 7 上传文件踩坑
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 中 GetProcess 相关方法的性能
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • @html.ActionLink的几种参数格式