《图解HTTP》阅读笔记

HTTP基础的简单理解

在了解HTTP协议之前,我们先了解下TCP/IP的参考模型,TCP/IP参考模型分为四层:应用层、传输层、网络层、链路层(数据链路层)。

应用层:为不同的网络应用提供所需的服务。

传输层:为应用层实体提供端到端的通信/传输功能,确保数据包的按顺序传送及数据的完整性。

网络层:处理网络上流动的数据包,它所包含的协议涉及到数据包在整个网络上的逻辑传输。

链路层:监控数据交换,处理网络连接的硬件部分。

TCP/IP通信传输流如下图所示:

HTTP在各层的封装处理:

与HTTP协议密切相关的协议/服务:IP,TCP,DNS

IP协议负责数据包的传送,当然,这需要配合IP地址和MAC地址,IP间的通信依赖MAC地址,这就涉及到用以解析地址的ARP协议了。

TCP提供了可靠的字节流服务,对要发送的大块数据进行分割成小数据包以易于传输,并且该协议可确认数据包是否送达到目的方。

DNS服务负责解析域名

URI(统一资源标识符)和URL(统一资源定位符)

URI:一个用于标识某一互联网资源名称的字符串。组成:主机名(含端口号)+相对路径+标识符

URL:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。组成:协议+主机名(含端口号)+相对路径

区别:URI表示请求资源在互联网上存在的位置,URL在表示请求资源的位置同时还要说明如何访问到这个资源,URL是URI的一个子集。参考资源:URL和URI的区别

Cookies

HTTP协议用于客户端和服务端之间通过请求和响应的交换所达成的通信,并且它是一种无状态的协议,不会对请求和响应之间的通信状态进行保存(无法根据前一次请求对这次请求做出处理),但为了能够有保存状态的功能,引入了cookies技术。

持久连接

HTTP初始版本时,每进行一次HTTP请求就会断开一次TCP连接,这情况在早期传输文本很小的时候倒也不觉得如何,但是随着时代的进步,所需传输的内容种类越来越多和内容越来越大了,每次连接后都会断开请求就大幅度的增加了通信量的开销了。幸好,自HTTP/1.1和部分HTTP/1.0来,有了持久连接这么个神奇的东西,它规定了只要任何一方没有明确的提出断开连接,那么就保持TCP连接状态。而在维持的TCP连接期间,可以多次进行HTTP请求来传输需要的内容。

HTTP/1.1默认保持持久连接,在HTTP的头部信息中会有Connection: Keep-alive属性,我们也可以通过浏览器开发工具的NetWork面板查看这个属性的状态及HTTP请求信息:

如何关闭持久连接在响应头设置Connection属性为close.

得益于持久连接,HTTP实现了管线化,能够做到同时并行发送多个请求,而无需一个接一个的等待响应。

HTTP请求的内容结构

HTTP协议交互的信息称为HTTP报文,通过下面的图来看看HTTP报文的结构:

除却空行(回车符、换行符),大致分为报文首部和报文主体。报文首部包含请求行(请求的方法、URI、HTTP版本)和状态行(响应状态码、原因短语、HTTP版本),首部字段(请求和响应的条件和属性),其他(未定义的首部)。

首部字段

首部字段规定了客户端如何处理请求和服务端如何处理响应,根据用途可分为四种:请求首部(请求报文使用的首部),响应首部(响应报文使用的首部),通用首部(请求和响应通用的首部),实体首部(报文实体部分使用的首部)。

HTTP/1.1首部字段列表

通用首部字段


1

2

3

4

5

6

7

8

9

10

首部字段名                   说明

Cache-Control               控制缓存的行为

Connection                  逐跳首部、连接的管理

Date                        创建报文的日期时间

Pragma                      报文指令

Trailer                     报文末端的首部一览

Transfer-Encoding           指定报文主体的传输编码方式

Upgrade                     升级为其他协议

Via                         代理服务器的相关信息

Warning                     错误通知

请求首部字段


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

首部字段名                  说明

Accept                     用户代理可处理的媒体类型

Accept-Charset             优先的字符集

Accept-Encoding            优先的内容编码

Accept-Language            优先的语言(自然语言)

Authorization              Web认证信息

Expect                     期待服务器的特定行为

From                       用户的电子邮箱地址

Host                       请求资源所在服务器

if-Match                   比较实体标记(ETag)

if-Modified-Since          比较资源的更新时间

if-None-Match              比较实体标记(与if-Match相反)

if-Range                   资源未更新时发送实体Byte的范围请求

if-Unmodified-Since        比较资源的更新时间(与if-Modified-Since相反)

Max-Forwards               最大传输逐跳数

Proxy-Authorization        代理服务器要求客户端的认证信息

Range                      实体的字节范围请求

Referer                    对请求中URI的原始获取方法

TE                         传输编码的优先级

User-Agent                 HTTP客户端程序的信息

响应首部字段


1

2

3

4

5

6

7

8

9

10

首部字段名                  说明

Accept-Ranges              是否接受字节范围请求

Age                        推算资源创建经过时间

ETag                       资源的匹配信息

Location                   令客户端重定向至指定的URI

Proxy-Authenticate         代理服务器对客户端的认证信息

Reter-After                对再次发起请求的时机要求

Server                     HTTP服务器的安装信息

Vary                       代理服务器缓存的管理信息

WWW-Authenticate           服务器对客户端的认证信息

实体首部字段


1

2

3

4

5

6

7

8

9

10

11

首部字段名                  说明

Allow                      资源可支持的HTTP方法

Content-Encoding           实体主体的适用的编码方式

Content-Language           实体主体的自然语言

Content-Length             实体主体的大小(单位:字节)

Content-Location           替代对应资源的URI

Content-MD5                实体主体的报文摘要

Content-Range              实体主体的位置范围

Content-Type               实体主体的媒体类型

Expires                    实体主体过期的日期时间

Last-Modified              资源的最后修改日期时间

此外,还有一些如Cookie、Set-Cookie和Content-Disposition等在其他RFC中定义的首部字段也经常会被用到。

传输编码

HTTP传输数据的时候可以传输原数据,也可以在传输过程中编码以提升传输速率。通过传输时的编码处理,能有效的处理大量的访问请求。常用的内容编码有以下几种

· gzip(GUN zip)
· compress(UNIX系统的标准压缩)
· deflate(zlib)
· identity(不进行编码)

多部分对象集合

HTTP协议中采纳了多部分对象集合,允许发送的报文主体内可含有多类型实体。多用于上传文件或者图片时使用,可以设置Content-Type属性对其进行规定。如以下几种常见的形式:

Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的

Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据

Application:用于传输应用程序数据或者二进制数据

范围请求

实现这项功能需要指定下载的实体范围,如:一份1000字节大小的文件,想取300-3000字节范围内的资源,可以设置Range:bytes=300-3000;想取300-3000字节和5000字节到最后的资源,可以设置Range:bytes=300-3000,5000-

内容协商

内容协商机制是指客户端和服务端就响应资源内容进行交涉,然后提供给客户最为适合的资源,内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。涉及到以下首部字段:

· Accept

· Accept-Charset

· Accept-Encoding

· Accept-Language

· Content-Language

内容协商技术又分为三种类型

服务器驱动协商:服务端以请求的首部字段作为参考,在服务端处理并且返回对应资源。

客户端驱动协商:用户通过浏览器提供的可选列表进行手动选择,或者利用js脚本在web页面上自行选择。

透明协商:服务器驱动协商和代理驱动协商的结合体,当一个缓存被提供了构成响应的一系列可得的表现形式,并且维度的差异能完全被缓存理解,那么此缓存变得有能力代表源服务器为那个资源的后续请求去执行服务器驱动协商

内容协商可参考:内容协商

HTTP方法及状态码

HTTP方法

HTTP中也包含了一些方法,用于指定请求的资源按期望产生某种行为。对于这些方法,其中用的最多的是get和post,大家也一定很熟悉了~

HTTP/1.1和HTTP/1.0支持的方法

+

HTTP状态码

HTTP状态码表示客户端HTTP请求的返回结果,通过状态码,用户可以知道HTTP请求是否出现问题,问题出在哪,下面简单罗列一些HTTP状态码:

+

一些常见的状态码:

+

HTTP代理及缓存

代理

代理指的是具有转发功能的应用程序,接收客户端的请求转发给服务端,也接收服务端的响应转发给客户端。代理不会改变请求的URI,会直接发送给持有资源的服务器。

在HTTP通信过程中可以级联多台代理服务器,并且转发时需要附加Via首部字段以标记经过的主机信息。

缓存

缓存是代理服务器或客户端本地磁盘内保存的资源副本,利用缓存来减少对源服务器的访问以便于节省通信流量和通信时间,也可以达到更好的交互体验。

请求的资源如果已经被缓存则直接由缓存服务器返回给客户端,或者客户端直接从本地磁盘读取。缓存可以设置有效时间,当判断缓存过期后,客户端/缓存服务器可像源服务器重新请求新资源。

HTTP安全升级--HTTPS

讲了一些HTTP的优点后,来看看HTTP的缺点

· 通信使用明文(未经加密),内容可能被窃听

· 不验证通信方的身份,请求/响应会遭伪装

· 无法证明报文的完整性,存在被篡改的可能

互联网的任何角落都存在通信内容被窃听的风险

按照TCP/IP协议的工作机制,通信内容在所有的通信线路上都有可能遭受窥视。即使是加密处理过的通信,也会被窥视到通信内容,只是经过了加密,就有可能让人无法破解出正确完整的报文信息含义,加密后的报文信息本身内容还是会被看到。

一般来说,窃听通信是通过收集在互联网上流动的数据包来做解析,这些可以通过抓包和嗅探工具实现,这也使得一些使用公共wifi账号被盗的事情时有发生。

针对明文传输这点,也可以对报文主体(传输内容)进行加密处理

针对身份验证这点,可通过在本地安装证书,存储身份认证信息等

针对确保信息完整性,MD5/SHA-1的散列值校验,数字签名等

HTTP => HTTPS

HTTP不带加密机制,但可以通过和SSL(安全 套接层...标注下阅读时的停顿)或TLS(安全层传输协议)的组合使用,用SSL建立安全通信线路后,就可以在这条线路上欢快的进行HTTP通信了。由于结合了SSL,HTTP升级成为HTTPS(或者 HTTP over SSL),然而这还不能说是个完整的HTTPS。

完整的HTTPS = HTTP + 加密 + 认证 + 完整性保护

一次完整的HTTPS请求

1.客户端发送Client Hello报文开始SSL通信,报文中包含客户端支持的SSL的指定版本、加密组件列表等

2.服务端可进行SSL通信时,会以Serve rHello报文作为应答

3.服务端发送Certificate报文,报文包含公开密钥证书

4.服务端发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束

5.SSL第一次握手结束后,客户端以Client Key Exchange报文作为回应,其中包含通信加密中使用的随机密码串

6.客户端发送Change Cipher Spec报文,提示服务端此报文之后的通信采用符合上一步的随机密码串的密钥加密

7.客户端发送Finished报文,其中包含连接至今全部报文的整体校验值

8.服务端发送Change Cipher Spec报文

9.服务端发送Finished报文

10.Finished报文交换完毕后,SSL连接建立完成

11.应用层协议通信,HTTP

12.客户端断开连接,发送close notify

WebSocket 和 http/2.0

WebSocket

WebSocket实现了再Web客户端和服务端之间的全双工通信,一旦Web服务端与客户端之间建立WebSocket协议的通信连接,之后的所有通信都依赖这个专用协议进行。

WebSocket具有推送功能,服务端可直接向客户端推送数据,不必等待客户端的请求;由于WebSocket一直保持连接状态,并且首部信息小,使得通信量也相应的减少。

为了实现WebSocket通信。需要用到前面说到的HTTP首部字段Upgrade,达到告知服务端通信协议发生改变,当成功握手确立WebSocket连接之后,通信时不再使用HTTP的数据帧,而采用WebSocket独立的数据帧。

HTTP/2.0

核心优势/特性

多路复用:多个请求都是通过一个 TCP 连接并发完成(HTTP/1.1管线化在多个请求之间的响应会被阻塞,HTTP/2.0解决了这问题,并且支持优先级和流量控制)

头部压缩:报文头部压缩处理,数通信量更小

服务端推送:服务端能够更快的把资源推送给客户端

语义改进:采用二进制格式传输数据

http/2.0参考资料:英文版  中英对照版

Web的攻击技术

以服务器为目标的主动攻击,代表性的有SQL注入和OS命令注入,SQL注入是指攻击者通过直接访问Web应用,把攻击的SQL代码传入服务端以执行数据库来获取所需的数据信息或篡改数据库信息(调用SQL语句的方式所产生的漏洞);OS命令攻击指的是在服务端执行非法的操作系统命令达到攻击的目的。

以服务器为目标的被动攻击,其模式如下:

1.攻击者诱导用户触发已经设置好的陷阱,启动发送已嵌入攻击代码的HTTP请求

2.含有攻击代码的HTTP发送到服务端并允许

3.运行完攻击代码后,存在安全漏洞的Web应用便会成为攻击者的跳板,导致个人信息被窃取(网络安全课的知识全还给老师了...起初看到这些,一脸懵逼...)

以客户端为目标的主动攻击,代表性的跨站脚步攻击(XSS),通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或者JavaScript代码进行的一种攻击方式,该攻击可获取用户个人信息等

还有HTTP首部注入攻击、邮件首部注入攻击、目录遍历攻击、远程文件所包含的漏洞等

设置或设计导致的安全漏洞

强制浏览,从安置在Web服务端的公开目录下的文件中浏览那些原本非自愿公开的文件,导致个人信息/内部文件信息的泄露

抛出错误信息导致的漏洞,暴露出系统的出错点,给攻击者提供了攻击的突破点

开放重定向,对任意URL作重定向跳转的功能,攻击者可诱导用户到具有恶意的Web站点

会话管理疏忽导致的安全漏洞

会话劫持,攻击者通过一些手段拿到用户会话ID,并使用此会话ID伪装成用户达到攻击的目的

攻击者可能获得会话ID的一些方式:

· 通过非正规的生成方法推测出会话ID

· 通过窃听或XSS攻击盗取会话ID

· 通过会话固定攻击强行获取会话ID

会话固定攻击,大致模式为:攻击者访问站点拿到未认证的会话ID,设置陷阱强制用户使用这个会话ID前去认证,一旦用户触发陷阱并完成认证,攻击者就可使用用户的身份顺利登陆网站

跨站点请求伪造,攻击者通过设置的陷阱强制对已完成认证的用户进行非预期的信息某些状态的更新

其他安全漏洞

密码破解,获取密码,突破认证(通过网络密码试错或者对已加密的密码进行破解),密码破解如字典攻击、彩虹表、获取密钥、加密算法漏洞等

点击劫持,又称界面伪装,大多以透明层元素作为陷阱以达到攻击目的

Dos攻击,让服务端的服务呈停止状态(利用访问请求造成资源过载,资源用尽以停止服务;通过攻击安全漏洞停止服务)

后门程序,开发者debug的程序,开发者为自身利益植入的程序等

时间: 2024-10-03 14:03:07

《图解HTTP》阅读笔记的相关文章

《The C Programing Language》阅读笔记

<The C Programing Language> 要理解一种程序语言,而不仅仅只是会使用它. -----我的心声 介绍部分: 作者 C语言设计者 Kernighan  Ritchie  标准C语言及其程序设计方法 应用级编程两个主流语言 C++  Java 都建立于C的语法和基本结构上 现在世界上许多软件都是C语言及其衍生的各种语言的基础上开发出来的. C在传播中,肯定会有变化和进展,88年 ANSI(美国国家标准协会) 为C语言指定了一个精确的标准.即ANSI C. 自C诞生之后,C悄

CI框架源码阅读笔记4 引导文件CodeIgniter.php

到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.com/usr/reg 经过引导文件,实际上会交给Application中的UsrController控制器的reg方法去处理. 这之中,CodeIgniter.php做了哪些工作?我们一步步来看. 1.    导入预定义常量.框架环境初始化 之前的一篇博客(CI框架源码阅读笔记2 一切的入

javascript高级程序设计阅读笔记(一)

javascript高级程序设计阅读笔记(一) 工作之余开发些web应用作为兴趣,在交互方面需要掌握javascript和css.HTML5等技术,因此读书笔记是必要的. javascript简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能. 文档对象模型 DOM doc

论文《Chinese Poetry Generation with Recurrent Neural Network》阅读笔记

这篇文章是论文'Chinese Poetry Generation with Recurrent Neural Network'的阅读笔记,这篇论文2014年发表在EMNLP. ABSTRACT 这篇论文提出了一个基于RNN的中国古诗生成模型. PROPOSED METHOD 第一句的生成 第一句的生成是规则式的. 先自定义几个keywords,然后通过<诗学含英>(这是清朝人编写的)扩展出更多的相关短语.然后生成所有满足格式约束(主要是音调方面的)的句子,接下来用一个语言模型排个序,找到最好

《构建之法阅读笔记02》

这次主要对<构建之法>的第四章“两人合作”作一次阅读笔记. 首先是代码规范问题. 我过去对于代码规范问题并没有做到注意.在编程中,许多变量和函数的命名都非常的简单而没有实际的意义.而且编程时不注意对齐缩进.很多时候也不加注释,导致对这些简单的变量名称不熟悉. 这样做会使得很多人读代码费劲,甚至是自己都要花时间再次阅读懂自己的代码.而且很多没必要的注释也会使得注释失去意义.当自己再次在原基础上编程时,可能要重新编程等问题. 因此,通过阅读“代码规范”,我找到一些解决方法.代码的风格要简明.易读.

《代码阅读方法与实践》阅读笔记之二

时间过得真快,一转眼,10天就过去了,感觉上次写阅读笔记的场景仿佛还历历在目.<代码阅读方法与实践>这本书真的很难写笔记,本来我看这本书的名字还以为书里大概写的都是些代码阅读的简易方法,心想着这就好写笔记了,没想到竟然好多都是我们之前学过的东西,这倒让我有点无从下手了.大概像我们这些还没有太多经历的大学生,总是习惯于尽量避免自己的工作量,总是试图找到一些完成事情的捷径吧.总之,尽管我不想承认,但我自己心里很清楚,我就是这种人.下面开始言归正传,说说接下来的几章内容归纳. 这本书在前面已经分析了

《大道至简》阅读笔记1

<大道至简>阅读笔记1 不知不觉间看完了第一章,从这个章节里我看到了一些我们都明白可是却自己很难做到的道理. 书中从愚公移山的故事和编程相结合给出了编程的精义就是顺序.分支.循环,这些都是我们所熟悉的,也是老师在教学中耳提面命的,可是我们又有几个人能做到呢. 我们总是在找着各种各样的学不好学不会理由,“它太难了”,“我太笨了”,认真的想一想难道真的是它太难了或者是自己太笨了么?不,答案是否定的,追根究底是懒惰,是没能坚持.从根本上来说,不存在会不会写程序的问题,除了先天智障和后天懒惰者,这要你

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index

构建之法阅读笔记05

2017.5.20 今天阅读的是<构建之法>第8章需求分析的阅读笔记,我们如果要开始做一个软件,最先要进行的就是需求分析,我们应该充分的了解我们这个软件是否具有前景,我们为用户提供的服务是不是用户所需要的,这一章详细的叙述了如何进行需求分析. 首先是获取和引导需求,我们应该找到软件的利益相关者,了解挖掘他们对软件的需求,引导他们表达出真实的需求.然后分析和定义需求,对各个方面的需求进行规整,定义需求内涵,从各个角度将需求量化,然后估计实现这些需求所需要的时间和资源,确定各个需求的优先级.紧接着

《构建之法》阅读笔记(2)

<构件之法>阅读笔记2 看了前面两章,我感觉我现阶段距离一个程序员还很远,软件工程师更是遥不可及.在学校的我学习了很多,如c++,数据结构,面向对象--学的多而不精,纵观现在我就是一个盲目学习的学生,上课时认真听了课后却没有花更多的时间去研究,遇到不懂的容易掉价死胡同,总是花很多时间闷闷思考,不到最后都没有去请教同学,去百度.看着其他很厉害的同学,自己就只能在一旁羡慕嫉妒恨.那现在在怎么样才能将自己对编程的兴趣提高,加强自己的编程思想?提高自己的价值?能够尽早地迈进程序员.软件工程师的行列之中