总图
- 左边:与HTTP有关系的各种协议,偏向理论
- 右边:与HTTP有关系的各种应用技术,偏向实际应用
右边
网络世界
- 互联网的正式名称是 Internet,里面存储着无穷无尽的信息资源
- 互联网世界像是由数不清的大小岛屿组成的“千岛之国”,我们可以从一个节点无障碍的访问到另一个节点
- 我们通常所说的“上网”实际上访问的只是互联网的一个子集“万维网”(World Wide Web),它基于HTTP协议,传输HTML等超文件资源,能力也被限制在HTTP协议之内
- 互联网还有很多万维网之外的资源,比如电子邮件、BT、FTP、SSH等,它们需要用各自的专有协议来访问
- 不过由于HTTP协议非常灵活、易于扩展,而且“超文本”的表述能力很强,所以很多其他不属于HTTP的资源也可以“包装”成HTTP协议来访问,这就是我们为什么能够总看到各种“网页应用”——例如“微信网页版”“邮箱网页版”——的原因。
- 现在的互联网 90% 以上的部分都被万维网,也就是 HTTP 所覆盖,所以把互联网约等于万维网或 HTTP 应该也不算大错。
浏览器
- 上网就要用到浏览器
- 所谓的浏览器,就是指web browser,即检索、查看互联网上网页资源的应用程序。名字里面的web,实际上指的是“world wide web”,也就是万维网
- 浏览器本质上是一个HTTP协议中的请求方,使用HTTP协议能够获取网络上的各种资源。当然,为了让我们更好地检索查看网页,它还集成了很多额外的功能。
- 在HTTP协议里,浏览器的角色被称为“user agent”,即“用户代理”,意思是作为访问者的“代理”来发起HTTP请求。不过在不引起混淆的情况下,我们通常都简单地称之
为“客户端”。
web服务器
刚刚我们说浏览器是HTTP里的请求方,那么协议另一端的应答方又是什么呢?
- 就是服务器,web server。
- web服务器是HTTP协议里响应请求的主体,通常也把控着绝大多数网络资源。
我们谈到“web服务器”是由两个层面的含义:
- 硬件含义:就是物理形式或者“云”形式的机器,在大多数情况下它可能不是一台服务器,而是利用反向代理、负载均衡等技术组成的庞大集群。但从外界看来,它仍然表现为一台机器,但这个形象是“虚拟的”。
- 软件含义:(一般概念“web服务器”就是说软件含义的)就是提供web服务的应用程序,通常会运行在硬件含义的服务器上。它利用强大的硬件能力响应海量的客户端HTTP请求,处理磁盘上的网页、图片等静态文件,或者把请求转发给后面的tomcat、node.js等业务应用,返回动态的信息
常用的web服务器如下:
CDN
浏览器和服务器是HTTP协议的两个端点,但是通常浏览器不会直接连到服务器,中间会经过“重重关卡”,其中一个重要角色就是CDN:
- CDN,全称是“Content Delivery Network”,翻译过来就是“内容分发网络”。
- 它应用了HTTP协议里的缓存和代理技术,代替源站响应客户端的请求
CDN 也是现在互联网中的一项重要基础设施,除了基本的网络加速(缓存源站的数据;找到离用户最近的节点等)外,还提供负载均衡、安全防护、边缘计算、跨运营商网络等功能,能够成倍地“放大”源站服务器的服务能力,
爬虫
什么是爬虫
我们知道,浏览器是一种用户代理,代替我们访问互联网。
但HTTP协议并没有规定用户代理后面必须是“真正的人类”,它也可以是“机器人”,这些“机器人”的正式名称就叫做“爬虫”(Crawler),实际上是一种可以自动访问web资源的应用程序。
如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小 蜘蛛,沿着蜘蛛网抓取自己想要的数据
- 解释1:通过一个程序,根据Url(http://www.taobao.com)进行爬取网页,获取有用信息
- 解释2:使用程序模拟浏览器,去向服务器发送请求,获取响应信息
爬虫核心
- 1.爬取网页:爬取整个网页 包含了网页中所有得内容
- 2.解析数据:将网页中你得到的数据 进行解析
- 3.难点:爬虫和反爬虫之间的博弈
爬虫分类?
(1)通用爬虫
-
实例
- 百度、360、google、sougou等搜索引擎‐‐‐伯乐在线
-
功能
- 访问网页‐>抓取数据‐>数据存储‐>数据处理‐>提供检索服务
-
网站排名(SEO)
-
- 根据pagerank算法值进行排名(参考个网站流量、点击率等指标)
-
- 百度竞价排名
-
-
缺点
-
- 抓取的数据大多是无用的
-
- 不能根据用户的需求来精准获取数据
-
-
说明: 绝大多数是各大搜索引擎“放”出来的,抓取网页存入数据库,在建立关键字索引,这样我们才能在搜索引擎中快速地搜索到互联网角落里的页面。
(2)聚焦爬虫
- 功能
- 根据需求,实现爬虫程序,抓取需要的数据
- 设计思路
- 1.确定要爬取的url
- 如何获取Url
- 2.模拟浏览器通过http协议访问url,获取服务器返回的html代码
- 如何访问
- 3.解析html字符串(根据一定规则提取需要的数据)
- 如何解析
- 1.确定要爬取的url
爬虫的缺点
- 过渡消耗网络资源,占用服务器和带宽
- 影响网站对真实数据的分析,甚至导致敏感信息泄露。
所以,有出现了“反爬虫”技术,通过各种手段来限制爬虫。
- robots协议
- 添加robots.txt文件,约定哪些该爬,哪些不该爬,
- 是一种“君子协定”,起不到限制作用
- User‐Agent:
- User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版 本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
- 验证码访问
- 动态加载网页 网站返回的是js数据 并不是网页的真实数据
- 数据加密
用到的技术
无论是“爬虫”还是“反爬虫”,用到的基本技术都是两个,一个是 HTTP,另一个就是HTML。
问题: 你觉得 CDN 在对待浏览器和爬虫时会有差异吗?为什么?
CDN 应当是不区分的
- 不区分,因为爬虫主要就是无限模仿浏览器行为
- 不区分,因为爬虫本身也是对 Web 资源的访问,且对于爬虫识别并不是100% 准确的,因此 CDN 只会去计算实际使用了多少资源而不管其中多少来自爬虫;
问题: 有些网站全新上线的,没有外链,也没特意提交过,为什么也会有爬虫经过呢,入口在哪里
这可能是从dns域名服务商那里获取了你的网站。
HTML
- HTML是HTTP协议传输的主要内容之一。它描述了超文本页面,用各种“标签”定义文字、图片等资源和排版布局,最终由浏览器“渲染”出可视化页面。
- HTML 目前有两个主要的标准,HTML4 和 HTML5。
- 广义上的 HTML 通常是指 HTML、JavaScript、CSS 等前端技术的组合,能够实现比传统静态页面更丰富的动态页面。
Web Service
它的名字与 Web Server 很像,但却是一个完全不同的东西。
- Web Service 是一种由 W3C 定义的应用服务开发规范,使用 client-server 主从架构,通常使用 WSDL 定义服务接口,使用 HTTP 协议传输 XML 或 SOAP 消息
- 也就是说,它是一个基于 Web(HTTP)的服务架构技术,既可以运行在内网,也可以在适当保护后运行在外网。
- 因为采用了 HTTP 协议传输数据,所以在 Web Service 架构里服务器和客户端可以采用不同的操作系统或编程语言开发。例如服务器端用 Linux+Java,客户端用 Windows+C#,具有跨平台跨语言的优点。
Web Service 是网络服务实体,而 Web Server 是网络服务器,后者的存在是为了承载前者。
WAF
WAF,意为“网络应用防火墙”。
- 与硬件“防火墙”类似,它是应用层面的“防火墙”,专门用于检测HTTP流量,是防护web应用的安全技术
- WAF通常位于Web服务器之前,可以阻止SQL注入、跨站脚本等攻击,目前应用较多的一个开源项目是 ModSecurity,它能够完全集成进 Apache 或 Nginx。
右边:与http相关的协议
TCP/IP协议
- TCP/IP协议是目前网络世界“事实上”的标准通信协议
- 它实际上是一系列网络通信协议的统称,其中最核心的协议是TCP/IP,其他的还有UDP、ICMP、ARP等等,共同组成了一个复杂而有层次的协议栈
- 这个协议栈有四层:
- 最上层是“应用层”
- 最下层是“链接层”
- TCP 和 IP 则在中间:TCP 属于“传输层”,IP 属于“网际层”
- IP协议是“Internet Protocol”的缩写,主要目的是解决寻址和路由文件,以及如何在两点键传输数据包。IP协议使用“IP 地址”的概念来定位互联网上的每一台计算机。IP地址相当于手机号码,目前有两个版本:IPv4和IPv6
+** TCP 协议是“Transmission Control Protocol”的缩写,意思是“传输控制协议”,它位于IP协议之上,基于IP协议提供可靠的、字节流**形式的通信,是HTTP协议得以实现的基础。- “可靠”是指保证数据不丢失
- “字节流”是指保证数据完整,所以在 TCP 协议的两端可以如同操作文件一样访问传输的数据,就像是读写在一个密闭的管道里“流动”的字节。
- HTTP 是一个"传输协议",但它不关心寻址、路由、数据完整性等传输细节,而要求这些工作都由下层来处理。因为互联网上最流行的是 TCP/IP 协议,而它刚好满足 HTTP 的要求,所以互联网上的 HTTP 协议就运行在了 TCP/IP 上,HTTP 也就可以更准确地称为“HTTP over TCP/IP”。
- 如果使用Unix/Linux操作系统,HTTP可以运行在本机的UNIX Domain Socket上,它是一种进程间通信机制,但是页满足HTTP对下层的“可靠传输”的要求,所以就成了“HTTP over UNIX Domain Socket”。
IP协议曾有v1、v2、v3版本,但是因为不够完善而没有对外发布,而v5仅用于实验室内部研究,也从未公开,所以我们只能看到v4、v6两个版本。
DNS
- 在 TCP/IP 协议中使用 IP 地址来标识计算机,数字形式的地址对于计算机来说是方便了,但对于人类来说却既难以记忆又难以输入。
- 于是“域名系统”(Domain Name System)出现了,用有意义的名字来作为 IP 地址的
等价替代。设想一下,你是愿意记“95.211.80.227”这样枯燥的数字,还是“nginx.org”这样的词组呢? - 但想要使用 TCP/IP 协议来通信仍然要使用 IP 地址,所以需要把域名做一个转换,“映
射”到它的真实 IP,这就是所谓的“域名解析”。
继续用刚才的打电话做个比喻,你想要打电话给小明,但不知道电话号码,就得在手机里的号码簿里一项一项地找,直到找到小明那一条记录,然后才能查到号码。这里的“小明”就相当于域名,而“电话号码”就相当于 IP 地址,这个查找的过程就是域名解析。
HTTP协议并没有明确要求必须使用DNS,但实际上为了方便访问互联网上的Web服务,通常都会使用DSN来定位或者标记主机名,间接的把DNS和HTTP绑定到了一起
URI/URL
有了 TCP/IP 和 DNS,是不是我们就可以任意访问网络上的资源了呢?
还不行,DNS 和 IP 地址只是标记了互联网上的主机,但主机上有那么多文本、图片、页面,到底要找哪一个呢?就像小明管理了一大堆文档,你怎么告诉他是哪个呢?
所以就出现了 URI(Uniform Resource Identifier),中文名称是统一资源标识符,使用它就能够唯一地标记互联网上资源。
URI 另一个更常用的表现形式是 URL(Uniform Resource Locator), 统一资源定位
符,也就是我们俗称的“网址”,它实际上是 URI 的一个子集,不过因为这两者几乎是相同的,差异不大,所以通常不会做严格的区分。
DNS和URL的关系
- URL 包含了协议+主机名+路径,DNS 会将其中的主机名解析为 IP,进而方便根据 IP协议进行寻址、路由;
- 打个比方:我让老婆帮我去楼下超市买瓶水,DNS可以帮她找到楼下超市,URI可以帮她找到水放在超市的具体位置
HTTPS
在 TCP/IP、DNS 和 URI 的“加持”之下,HTTP 协议终于可以自由地穿梭在互联网世界
里,顺利地访问任意的网页了。
但是HTTP传输的是明文,很容易被窃听。
这个时候就引入了HTTPS,可以用来加密明文
- 它的全称是“HTTP over SSL/TLS”,也就是运行在 SSL/TLS 协议上的 HTTP。即HTTPS 相当于“HTTP+SSL/TLS+TCP/IP”
- 注意它的名字,这里是SSL/TLS,而不是TCP/IP,它是一个负责加密通信的安全协议,建立在TCP/IP上,所以它也是个可靠的传输协议,可以被用作HTTP的下层
- SSL 的全称是“Secure Socket Layer”,由网景公司发明,当发展到 3.0 时被标准化,改名为 TLS,即“Transport Layer Security”,但由于历史的原因还是有很多人称之为SSL/TLS,或者直接简称为 SSL。
- SSL综合了对称加密、非对称加密、摘要算法、数字签名、数字证书等技术,能够在不安全的环境中为通信的双方创建出一个秘密的、安全的传输通道,为 HTTP 套上一副坚固的盔甲
代理
代理(proxy)是HTTP协议中请求发和应答方中间的一个环节,作为“中转站”,既可以转发客户端的请求,又可以转发服务器的应答。
CDN,实际上就是一种代理,它代替源站服务器响应客户端的请求,通常扮演着透明代理和反向代理的角色。
由于代理在传输过程中插入了一个“中间层”,所以可以在这个环节做很多有意思的事情,比如:
- 负载均衡:把访问请求均匀分散到多台机器,实现访问集群化;
- 内容缓存:暂存上下行的数据,减轻后端的压力;
- 安全防护:隐匿 IP, 使用 WAF 等工具抵御网络攻击,保护被代理的机器;
- 数据处理:提供压缩、加密等额外的功能。
下面是一个代理抓包:
- 客户端55061先用三次握手连接到代理的80端口,然后发送GET请求
- 代理并不直接生产内容,所以就代表客户端,用55063端口连接到源服务器,也就是三次握手
- 代理连接到源服务器之后,发出了一个HTTP/1.0的GET请求
- 因为HTTP/1.0默认是短连接,所以源服务器发送响应报文后立即用四次挥手关闭连接
- 代理拿到响应报文后再发回给客户端,完成了一次代理服务