10-URI的基本格式以及与URL的区别
HTTP连接的常见流程
从TCP编程上看HTTP请求处理
长连接与短连接
补充一下代理的知识
什么是正向代理,什么是反向代理?
想在外部公网访问公司内部局域网时,需要连公司的代理跳板机进行代理访问;再比如后端开发部署 java项目时,在公司里面也听到了运维那边各种利用 nginx来支持反向代理部署。
正向代理
正向代理是是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容, 客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
正向代理是最常接触到的代理模式,最大的特点是客户端非常明确要访问的服务器地址,服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端,正向代理模式屏蔽或者隐藏了真实客户端信息。
正向代理的用途:
-
访问原来无法访问的资源,如Google
-
可以做缓存,加速访问资源
-
对客户端访问授权,上网进行认证
-
代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
反向代理( Reverse Proxy )
反向代理是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
多个客户端给服务器发送的请求,Nginx服务器接收之后,按照一定的规则分发给了后端的业务处理服务器进行处理了,此时,请求的来源是客户端,但是请求具体来自哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理的角色。
客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。反向代理,"它代理的是服务端",主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
反向代理的作用:
- 代理服务器,隐藏了真实的服务器,为服务器收发请求,使真实服务器对客户端不可见。
- 保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网
- 负载均衡,通过反向代理服务器来优化网站的负载,将用户的请求分发到空闲的服务器上。
- 意味着用户和负载均衡服务器直接通信,即用户解析服务器域名时得到的是负载均衡服务器的 IP。
结构图如下:
共同点:
-
都是做为服务器和客户端的中间层。
-
都可以加强内网的安全性,阻止 Web 攻击。
-
都可以做缓存机制,提高访问速度。
区别:
-
正向代理其实是客户端的代理,反向代理则是服务器的代理。
-
正向代理中,服务器并不知道真正的客户端到底是谁;而在反向代理中,客户端也不知道真正的服务器是谁。
-
作用不同。正向代理主要是用来解决访问限制问题;而反向代理则是提供负载均衡、安全防护等作用。
我们在此补充一下缓冲机制:
Cache(缓存)技术和代理服务技术是紧密联系的(不光是正向代理,反向代理也使用了Cache(缓存)技术。
如果在用户A访问服务器B某数据J之前,已经有人通过代理服务器Z访问过服务器B上得数据J,那么代理服务器Z会把数据J保存一段时间,
如果有人正好取该数据J,那么代理服务器Z不再访问服务器B,而把缓存的数据J直接发给用户A。这一技术在Cache中术语就叫Cache命中。
如果有更多的像用户A的用户来访问代理服务器Z,那么这些用户都可以直接从代理服务器Z中取得数据J,而不用千里迢迢的去服务器B下载数据了。
几种常用的 web服务器对比:
Connection仅针对当前连接有效
代理服务器对长连接的支持
16-HTTP消息在服务器端的路由
- Host=uri-host[":"port]
为什么引入host头部?ip地址相对较少,域名相对较多。一个ip地址可能对应着多个域名。
Host
是 HTTP 1.1 协议中新增的一个请求头,主要用来实现虚拟主机技术,不传递Host头部则返回400错误响应码。
有一台 ip 地址为 xxx.xxx.xxx.xxx 的服务器,在这台服务器上部署着谷歌、百度、淘宝的网站。为什么我们访问 https://www.google.com 时,看到的是 Google 的首页而不是百度或者淘宝的首页?
原因就是 Host 请求头决定着访问哪个虚拟主机。
虚拟主机(virtual hosting)即共享主机(shared web hosting),可以利用虚拟技术把一台完整的服务器分成若干个主机,因此可以在单一主机上运行多个网站或服务。
为防止陈旧的代理服务器,发向正向代理的请求 request-target 必须以absolute-form形式出现
- request-line=method SP request-target SP HTTP-version CRLF
- absolute-form=absolute-URI
- absolute-URI=scheme ":"hier-part["?"query]
规范与实现间是有差距的
https://tools.ietf.org/html/rfc7230#section-5.4
A client MUST send a Host header field in all HTTP/1.1 request messages
A server MUST respond with a 400 (Bad Request) status code to any
HTTP/1.1 request message
- that lacks a Host header field
- to any request message that contains more than one Host header field
- a Host header field with an invalid field-value.
Host 头部与消息的路由(nginx为例)
1.建立TCP连接 ·确定服务器的IP地址 2.接收请求 3.寻找虚拟主机 ·匹配Host头部与域名 4.寻找URI的处理代码 ·匹配 URI 5.执行处理请求的代码 ·访问资源 6.生成HTTP响应 ·各中间件基于PF架构串行修改响应 7.发送HTTP响应 8.记录访问日志
12-详解HTTP的请求行
客户端与源服务器间存在多个代理
DNS知识补充:
一、DNS域名结构与域名服务器
域名系统DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换成为IP地址,也可以说是一种组织成域层次结构的计算机和网络服务命名系统,
它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。
网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如“202.96.134.133”之类的IP地址,而不能认识域名。
我们无法记住10个以上IP地址的网站,所以我们访问网站时,更多的是在浏览器地址栏中输入域名,就能看到所需要的页面,
这是因为有一个叫“DNS服务器”的计算机自动把我们的域名“翻译”成了相应的IP地址,然后调出IP地址所对应的网页。
域名系统其实就是名字系统。为什么不叫“名字”而叫“域名”呢?这是因为在这种因特网的命名系统中使用了许多的“域(domain)”,因此就出现了“域名”这个名词。“域名系统”明确地指明这种系统是应用在因特网中。
DNS 的过程?
关于DNS的获取流程:
DNS是应用层协议,事实上他是为其他应用层协议工作的,包括不限于HTTP和SMTP以及FTP,用于将用户提供的主机名解析为ip地址。
具体过程如下:
①用户主机上运行着DNS的客户端,就是我们的PC机或者手机客户端运行着DNS客户端了
②浏览器将接收到的url中抽取出域名字段,就是访问的主机名,并将这个主机名传送给DNS应用的客户端
③DNS客户机端向DNS服务器端发送一份查询报文,报文中包含着要访问的主机名字段(中间包括一些列缓存查询以及分布式DNS集群的工作)
④该DNS客户机最终会收到一份回答报文,其中包含有该主机名对应的IP地址
1、域名结构
在了解DNS服务器之前,需要先了解因特网上的域名空间结构,具体如下图所示:
DNS 是一种分层结构,在整个互联网中组成一个树状系统,顶层是系统的根域名,下层为 TLD 以及二级域名,叶子就构成了所谓的 FQDN(Fully Qualified Domain Names),
根域名通常使用 "." 来表示,其实际上也是由域名组成,全世界目前有 13 组域名根节点,由少数几个国家进行管理,而国内仅有几台根节点镜像。
如查询 www.im.qq.com
,简略描述 DNS 的过程就是,先查询 com
这个域名的name server
有哪些,
然后选一个继续查询qq
这个子域名的name servers
有哪些,再选一个继续查询im
这个子域名的name servers
有哪些,www
不是域名,查询结束。
2.DNS服务的体系架构是怎样的?
运行在用户主机上的某些应用程序(如Webl浏览器或者邮件阅读器)需要将主机名转换为IP地址。这些应用程序将调用DNS的客户机端,并指明需要被转换的主机名。
用户主机的DNS客户端接收到后,向网络中发送一个DNS查询报文。所有DNS请求和回答报文使用的UDP数据报经过端口53发送
经过若干ms到若干s的延时后,用户主机上的DNS客户端接收到一个提供所希望映射的DNS回答报文。
这个查询结果则被传递到调用DNS的应用程序。
因此,从用户主机上调用应用程序的角度看,DNS是一个提供简单、直接的转换服务的黑盒子。
但事实上,实现这个服务的黑盒子非常复杂,它由分布于全球的大量DNS服务器以及定义了DNS服务器与查询主机通信方式的应用层协议组成。
DNS为什么不采用单点的集中式的设计方式,而是使用分布式集群的工作方式?
DNS的一种简单的设计模式就是在因特网上只使用一个DNS服务器,该服务器包含所有的映射,在这种集中式的设计中,客户机直接将所有查询请求发往单一的DNS服务器,同时该DNS服务器直接对所有查询客户机做出响应,
但是这种设计方式不适用当前的互联网,因为当今的因特网有着数量巨大并且在持续增长的主机,这种集中式设计会有单点故障,通信容量(上亿台主机发送的查询DNS报文请求,包括但不限于所有的HTTP请求,电子邮件报文服务器,TCP长连接服务)
,远距离的时间延迟(澳大利亚到纽约的举例),维护开销大(因为所有的主机名-ip映射都要在一个服务站点更新)等问题
因特网上的DNS服务器按照层次安排,根据不同层次的域名服务器所起的作用,可以把域名服务器分为4种不同的类型。
- 根域名服务器
- 顶级域名服务器
- 权威域名服务器
- 本地域名服务器
使用分布式的层次数据库模式以及缓存方法来解决单点集中式的问题。
3.DNS 查询的过程如下图所示
1、在浏览器中输入www . qq .com 域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
2、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
4、如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
5、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(http://qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找http://qq.com域服务器,重复上面的动作,进行查询,直至找到www . qq .com主机。
6、如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
Gateway
网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连,也可以用于局域网互连。
网关是一种充当转换重任的计算机系统或设备。使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。
网关实质上是一个网络通向其他网络的IP地址。比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩 码为255.255.255.0。
在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器) 上,TCP/IP协议也会根据子网掩码(255.255.255.0)判定两个网络中的主机处在不同的网络里。
而要实现这两个网络之间的通信,则必须通过网关。
如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。网络B向网络A转发数据包的过程也是如此。
消息的转发
Max-Forwards 头部
• 限制 Proxy 代理服务器的最大转发次数,仅对 TRACE/OPTIONS 方法有效
• Max-Forwards = 1*DIGIT
Via 头部
- 指明经过的代理服务器名称及版本
- Via = 1#( received-protocol RWS received-by [ RWS comment ] )
- received-protocol = [ protocol-name "/" ] protocol-version
- received-by = ( uri-host [ ":" port ] ) / pseudonym
- pseudonym = token
Cache-Control:no-transform
-
- 禁止代理服务器修改响应包体
问题:如何传递IP地址?
知识补充ADSL和CDN
ADSL解读:
这是这个世纪初的技术了,就是电话线不仅可以打电话还可以上网的技术。
ADSL(Asymmetric Digital Subscriber Line ,非对称数字用户环路)是一种新的数据传输方式。
它因为上行和下行带宽不对称,因此称为非对称数字用户线环路。它采用频分复用技术把普通的电话线分成了电话、上行和下行三个相对独立的信道,从而避免了相互之间的干扰。
即使边打电话边上网,也不会发生上网速率和通话质量下降的情况。通常ADSL在不影响正常电话通信的情况下可以提供最高3.5Mbps的上行速度和最高24Mbps的下行速度。
ADSL是一种通过现有普通电话线为家庭、办公室提供宽带数据传输服务的技术。ADSL即非对称数字信号传送,它能够在现有的铜双绞线,即普通电话线上提供高达8Mbit/s的高速下行速率,
{由于ADSL对距离和线路情况十分敏感,随着距离的增加和线路的恶化,速率会受到影响}远高于ISDN速率;而上行速率有1Mbit/s,传输距离达3km----5km。
ADSL技术的主要特点是可以充分利用现有的铜缆网络(电话线网络),在线路两端加装ADSL 设备即可为用户提供高宽带服务。
ADSL的另外一个优点在于它可以与普通电话共存于一条电话线上,在一条普通电话线上接听、拨打电话的同时进行ADSL传输而又互不影响。
用户通过ADSL接入宽带多媒体信息网与因特网,同时可以收看影视节目,举行一个视频会议,还可以很高的速率下载数据文件,这还不是全部,你还可以在这同一条电话线上使用电话而又不影响以上所说的其它活动.安装ADSL也极其方便快捷。
在现有的电话线上安装ADSL,除了在用户端安装 ADSL通讯终端外,不用对现有线路作任何改动。使
用ADSL(Asymmetric Digital Subscriber Line,非对称数字用户线)技术,通过一条电话线,以比普通MODEM快一百倍浏览因特网,通过网络学习、娱乐、购物,享受到先进的数据服务如视频会议、视频点播、网上音乐、网上电视、网上MTV的乐趣,已经成为现实。
CDN 解读:
CDN是什么?
CDN其全称是Content Delivery Network,即内容分发网络。CDN是构建在网络上的内容分发网络,具备内容存储和分发两个关键要素。其基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。比如说,北京的用户让他访问北京的节点,上海的用户让它访问上海的节点,而不是北京的用户访问上海的节点,上海的用户访问北京的节点,这样会极大增加用户的访问时长,及访问的成本。通过就近访问,加速用户对网站的访问,解决Internet网络拥堵状况,提高用户访问网络的响应速度。
CDN是如何发挥自己的作用呢?
1. 当用户点击网站页面上的内容URL,经过本地DNS系统解析,DNS系统会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器;
2. CDN的DNS服务器将CDN的全局负载均衡设备IP地址返回用户;
3. 用户向CDN的全局负载均衡设备发起内容URL访问请求;
4. CDN全局负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求;
5. 区域负载均衡设备会根据用户IP,访问资源以及服务能力为用户选择一台合适的缓存服务器提供服务;
6. 全局负载均衡设备把服务器的IP地址返回给用户;
7. 用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,那么这台服务器就向网站的源服务器请求内容,源服务器返回内容给缓存服务器,并根据用户自定义的缓存策略判断是否进行缓存,并返回给用户。
哪些资源比较适合使用CDN进行加速呢?
一个完整的网页资源包括CSS,JS,图片,音频,视频和页面等文件。
JS、CSS、图片、音频和视频等都是静态文件,一个成熟的网站在上线过程中对静态文件的变更是比较少的或是不会变更的,这些类型的文件是最适合使用CDN进行加速。
通过CDN将这些静态资源分发至全国各地的服务器节点,便可以实现从任何一个地方访问网页都可选择最近的节点服务器进行下载资源。
页面文件主要分为静态页面文件和动态页面文件。像各大公司的官网首页,退出页面等一般都是静态文件,静态页面文件的结构一般是不会改变的,主要做展示用,这类静态页面文件也很适合做CDN加速。
动态页面文件指的是页面会根据服务器端返回的响应内容进行动态渲染,例如JSP,PHP文件等。这些页面文件内容是动态获取的,所以并不适合做CDN加速。
因为网页的内容是动态变化的,在服务器端存储的内容有效期是比较短的,这样在浏览器请求到CDN服务器上的内容后会总是以过期来处理,最终还是要向源站服务器发送请求,在这种情况下,CDN的存在就没有意义了。
12-请求与相应的上下文
请求的上下文:User-Agent
请求的上下文:Referer
请求的上下文:From
响应的上下文:Server
响应的上下文:Allow与Accept-Ranges
16.请求与响应的上下文内容协商与资源表述
内容协商
每个URI指向的资源可以是任何事物,可以有多种不同的表述,例如一份文档可以有不同语言的翻译、不同的媒体格式、可以针对不同的浏览器提供不同的压缩编码等。
内容协商的两种方式
Proactive 主动式内容协商
Reactive 响应式内容协商
常见的协商要素
国际化与本地化
资源表述的元数据头部