• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

网络协议系列 — 特殊字符编码, 转发程序与常见问题简答

互联网 diligentman 6天前 13次浏览

前言

这篇文章实话说我有点虚,因为平时都不怎么研究这一块的,然后涉及到的知识点超多,我只能到处看看资料总结一下相关信息,所以在此我只想说句:
本文章内容只代表个人立场,有错必改!
原本打算一次性总结,后来越扯越多超过字数限制了,就干脆做成http系列文章了,不定时更新原有内容(发现哪里出错的话),不定时新增系列文章,请见谅!

因为之前写得太臃肿又不够详细,最近刚好复习到这一块的内容,所以决定把这些文章都拆分成更加细致一点,补充详细内容,优化排版布局,目前来看还是应该的,因为自身时间问题和平台编译的问题迟迟未改,只好等都改完之后才发出来。

特殊字符编码

在使用URL进行参数传递时,经常会传递一些中文名的参数或URL地址,在后台处理时会发生转换错误。例如:
在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原来发生不一致。
使用服务器端的urlEncode函数编码的URL,与使用客户端Javascript的encodeURI函数编码的URL,结果就不一样。
在请求参数中有些字段是不能直接传输的,可能会引起问题,于是我们需要在发送前先进行编码。

方法 用法 返回值 说明
escape(string) 可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。 已编码的 string 的副本。其中某些字符被替换成了十六进制的转义序列。 该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码:* @ – _ + . / 。其他所有的字符都会被转义序列替换。
unescape(string) 可对通过 escape()编码的字符串进行解码。 string 被解码后的一个副本。 通过找到形式为 %xx 和 %uxxxx 的字符序列(x 表示十六进制的数字),用 Unicode 字符 u00xx 和 uxxxx 替换这样的字符序列进行解码。
encodeURI(URIstring) 把字符串作为 URI 进行编码。 URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换。 该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码:- _ . ! ~ * ‘ ( ) 。该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#
decodeURI(URIstring) 对 encodeURI()函数编码过的 URI 进行解码。 URIstring 的副本,其中的十六进制转义序列将被它们表示的字符替换。
encodeURIComponent(URIstring) 把字符串作为 URI 组件进行编码。 URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换。 该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码:- _ . ! ~ * ‘ ( ) 。其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。
decodeURIComponent(URIstring) 对 encodeURIComponent()函数编码的 URI 进行解码。 URIstring 的副本,其中的十六进制转义序列将被它们表示的字符替换。
  • escape()除了 ASCII 字母、数字和特定的符号外,其他所有的字符都会被转义序列替换(已被废弃使用)。
  • encodeURI()除了 ASCII 字母、数字和特定的符号外,对 URI 进行完整的编码,并且URI中的合法字符都不会被编码转换。
  • encodeURIComponent()除了 ASCII 字母、数字和特定的符号外,其他字符都是由一个或多个十六进制的转义序列替换的。

注意:

  1. 上面指明的特定符号每个方法都各不相同;
  2. encodeURIComponent()函数 与 encodeURI()函数的区别之处在于前者假定它的参数是 URI 的一部分(比如协议、主机名、路径或查询字符串)。因此 encodeURIComponent()函数将转义用于分隔 URI 各个部分的标点符号。
escape('https://www.baidu.com/index.html?abc=1&name=特殊字符编码')
// "https%3A//www.baidu.com/index.html%3Fabc%3D1%26name%3D%u7279%u6B8A%u5B57%u7B26%u7F16%u7801"

encodeURI('https://www.baidu.com/index.html?abc=1&name=特殊字符编码')
// "https://www.baidu.com/index.html?abc=1&name=%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81";

encodeURIComponent('https://www.baidu.com/index.html?abc=1&name=特殊字符编码')
// "https%3A%2F%2Fwww.baidu.com%2Findex.html%3Fabc%3D1%26name%3D%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81"

转发程序

代理

代理是位于客户端和服务器之间的HTTP中间实体。接收所有客户端的HTTP请求,并将这些请求转发给服务器(可能会对请求进行修改之后转发)。
网络协议系列 — 特殊字符编码, 转发程序与常见问题简答

(来自图解http)

因为在http通信过程中可以级联多台代理服务器,所以请求和响应的转发需要附加Via首部字段标记出经过的主机信息

代理主要分两大类

  • 缓存代理

    代理转发响应时,会预先将资源的副本缓存在自身当再次接受相同请求时直接返回缓存

  • 非/透明代理

    转发请求或者响应时是否对报文进行加工

网关

网关是一种转发其他服务器通信数据的服务器,作为其他服务器的中间实体使用。接收从客户端发送的请求就像自己拥有源服务器(即真正拥有资源实体的服务器)一样对请求进行处理.
网络协议系列 — 特殊字符编码, 转发程序与常见问题简答

功能与代理相似,但是网关可以提供非Http协议通信,在客户端和网关之间的通信线路上加密可以提高连接的安全性

隧道

在距离较远的客户单和服务器之间进行中转,并保持双方通信连接

隧道是建立起来之后,就会在两条连接之间对原始数据进行盲转发的HTTP应用程序。常见用途是通过HTTP连接承载加密的安全套接字层(SSL)流量,这样SSL流量就可以穿过只允许Web流量通过的防火墙了。
网络协议系列 — 特殊字符编码, 转发程序与常见问题简答

疑难杂症

HTTP控制的常见特性?

  1. 缓存
    服务端能告诉代理和客户端哪些文档需要被缓存,缓存多久,而客户端也能够命令中间的缓存代理来忽略存储的文档;
  2. 开放同源限制
    为了防止网络窥听和其它隐私泄漏,浏览器强制对Web网站做了分割限制。只有来自于相同来源的网页才能够获取网站的全部信息。这样的限制有时反而成了负担,HTTP可以通过修改头部来开放这样的限制,因此Web文档可以是由不同域下的信息拼接成的(某些情况下,这样做还有安全因素考虑);
  3. 认证
    一些页面能够被保护起来,仅让特定的用户进行访问。基本的认证功能可以直接通过HTTP提供,使用Authenticate相似的头部即可,或用HTTP Cookies来设置指定的会话;
  4. 代理和隧道
    通常情况下,服务器(和|或)客户端是处于内网的,对外网隐藏真实 IP 地址。因此 HTTP 请求就要通过代理越过这个网络屏障。但并非所有的代理都是 HTTP 代理。例如,SOCKS协议的代理就运作在更底层,一些像 FTP 这样的协议也能够被它们处理;
  5. 会话
    使用HTTP Cookies允许你用一个服务端的状态发起请求,这就创建了会话;

代理(Proxies)作用?

  • 缓存(可以是公开的也可以是私有的,像浏览器的缓存);
  • 过滤(像反病毒扫描,家长控制。。。);
  • 负载均衡(让多个服务器服务不同的请求);
  • 认证(对不同资源进行权限管理);
  • 日志记录(允许存储历史信息);

什么是Agent代理?

用户Agent代理是代表用户发起HTTP的客户端程序。比如Web浏览器。另外有些自动发送HTTP请求并获取内容的代理,比如“网络蜘蛛”或者“Web机器人”。

可以禁止浏览器缓存的方法?

  • Expires设置0;
  • Cache-Control: no-cache, no-store, must-revalidate
  • Pragma: no-cache;

关于Cache-Control中no-cache、no-store、max-age=0区别?

  • no-cache代表不缓存过期的资源,缓存会向服务器进行有效处理确认之后处理资源;
  • no-store才是真正的不进行缓存;
  • max-age=<0就请求服务器,如果资源修改了服务器就会返回最新资源,如果资源没修改服务器就只返回304(Not Modified)状态码;

什么是CDN?

CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上,其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

  • 本地Cache加速: 提高了企业站点(尤其含有大量图片和静态页面站点)的访问速度,并大大提高以上性质站点的稳定性
  • 镜像服务: 消除了不同运营商之间互联的瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问质量。
  • 远程加速: 远程访问用户根据DNS负载均衡技术智能自动选择Cache服务器,选择最快的Cache服务器,加快远程访问的速度
  • 带宽优化: 自动生成服务器的远程Mirror(镜像)cache服务器,远程用户访问时从cache服务器上读取数据,减少远程访问的带宽、分担网络流量、减轻原站点WEB服务器负载等功能。
  • 集群抗攻击: 广泛分布的CDN节点加上节点之间的智能冗余机制,可以有效地预防黑客入侵以及降低各种DDOS攻击对网站的影响,同时保证较好的服务质量 。

缓存服务器作用?

加速资源访问速度,降低源服务器的负载。缓存服务器从源服务器获取资源,并返回给浏览器。此外,缓存服务器一般还会在本地保存资源的副本,当有相同的资源请求到来,缓存服务器可返回资源副本,以此提高资源访问速度。

使用cookie保存登陆信息的方法?

  • Cookie保存用户名与密码,与数据库比较;
  • Cookie保存加密后的密码,访问时解密与数据库比较;
  • Cookie保存用户名与加密后的用户名,与数据库比较账号的加密规则是否正确;

喜欢 (0)