代理是什么?用来做什么?为啥要用代理?

1. 代理是什么?

代理是网络传输的中间实体,它在服务器跟客户端之间,来回传输HTTP报文,面对客户端的时候 它假装是服务端,面对服务端的时候 它假装是客户端。所以它同时需要模拟HTTP的request和response。
都是中间实体,代理跟网关有什么区别?网关可以连接不同的协议,比如一边是HTTP,另一边是POP邮件协议;代理连接的两侧一般是相同的协议,实际上,代理也会做一些协议转换工作,两者的界限其实挺模糊的。
添加图片注释,不超过 140 字(可选)

2. 代理可以用来做啥?为啥要用代理?

代理因为拦截在服务端和客户端之间,作为一个中间人。它可以过滤请求/回应;修改返回的数据;缓存返回的数据;平衡服务器的压力,做负载均衡;为客户端隐藏身份。
实际的场景:
1) 绿坝
2) 请求权限控制
3) 防火墙
4) web缓存
5) 反向代理:负载均衡 安全防护
6) 转码:比如图片格式转换,大小调整,以应对不同的请求方
7) 隐身模式:去除cookie里的身份信息,去除User-Agent里的计算机与OS信息,删除From字段,删除Referer字段。
添加图片注释,不超过 140 字(可选)

3. 代理怎么部署?相互之间怎么连接?

代理服务可以部署在网络的出口 或者 网络的入口;反向代理可以部署在服务器前面;也可以放在因特网对等交换点上,可以加监控。代理可以有多层,父子关系可以是动态的(负载均衡;地理位置就近选择;特定协议的请求转发到特定的代理;付费的高速代理)。
因特网对等交换点:在不同的互联网服务提供商之间做数据交换的。https://baike.baidu.com/item/%E5%9B%A0%E7%89%B9%E7%BD%91%E4%BA%A4%E6%8D%A2%E7%82%B9/12767367
添加图片注释,不超过 140 字(可选)

4. 流量怎么指向

代理的?
浏览器里可以配置代理;路由或者其他网络设施上可以拦截;修改DNS的指向;服务器返回305重定向,同时提供代理的ip,让客户端指向代理。
添加图片注释,不超过 140 字(可选)

5. 客户端怎么配置代理?有哪些方式?

浏览器里可以手工配,但是这样对于一个公司来讲不好管理和更新;PAC文件,就是一个js的脚本,用正则匹配URL,不同的URL可以使用不同的代理,返回词有"DIRECT"(不经过代理)、"PROXY host:port"(使用指定代理)、"SOCKS host:port"(使用指定的SOCKS服务器)。
WPAD:自动查找PAC文件的协议,全称是web-proxy-auto-discory-protocol,感觉有了这玩意儿PAC文件就可以发布更新了。它包括DHCP(动态主机配置协议),SLP(服务器定位协议),DNS等技术。
SOCKS服务器:防火墙安全会话转换协议 (Socks: Protocol for sessions traversal across firewall securely)https://baike.baidu.com/item/Socks5/8915011
DHCP:服务器控制一段IP地址,客户端登录时自动分配IP的协议。https://baike.baidu.com/item/DHCP
SLP:如果网络中有服务更改位置或删除,可以使用SLP自动发现服务的变更。https://www.ibm.com/developerworks/cn/linux/l-slp/index.html
添加图片注释,不超过 140 字(可选)

6. 代理技术本身有哪些难点?

服务端的URI相对路径就可以了,代理需要完整路径,所以它们请求不同。
另外浏览器有的时候会自动补全链接,比如补一下www. 或者 .com 甚至可能纠正拼写,但是如果配置了显示代理的话,这些补全动作浏览器就不处理了,交给代理。
拦截代理,也就是客户端不知道用了代理的情况,可能客户端发的是相对路径,那这时候解析就可能出问题,如果有 部分URI+HOST 可以找到,如果只有部分URI 那可能就不行,返回一条错误报文,建议用户升级到支持HOST的浏览器。
URI在转发过程中可能被代理修改,比如显示的加 :80 这种,但是这种不好,代理应该宽容一些,因为代理不知道下游服务器怎么写的,有没有什么暗坑啥的。
添加图片注释,不超过 140 字(可选)

7. 怎么追踪问题,如何知道请求是不是经过了代理,经过了哪些代理?

使用Via首部可以获知请求经过了哪些代理、网关,请求或响应每经过一个中间节点就会加上这个节点的协议名、协议版本号、主机名、描述信息。这样就知道经由了哪些节点了。
有的组织出于安全考虑,不希望显示地返回主机名,所以就把真实名称隐藏,安全要求更高的话,还会把自己组织内部一串节点的信息都替换成一个,以免暴露组织内部的拓扑。
需要注意的是,代理不应该修改Server首部,因为这对应服务端的信息,它只能改改Via首部。
HTTP的TRACE请求可以探测到某个服务,需要经过哪些节点,请求到达服务端之后,会把整个请求报文(含一路过来的Via首部)包在返回里,送回请求端,请求端就知道到达服务器需要经过哪些节点了。
如果网络拓扑中有环,可能会无限循环,所以这个TRACE请求支持Max-Forwards首部,可以规定最多经过多少个节点就要回来,每个中间节点收到这样的请求都会把Max-Forwards字段减一,把自己的信息加到Via字段里,然后转发到下一个节点,如果Max-Forwards为0,就直接返回了。
添加图片注释,不超过 140 字(可选)

8. 不同厂商出的代理 实现了不同的HTTP规范,支持的特性不同,它们相互之间怎么协作?怎么解决版本不一致的问题?

某个代理收到它不支持的首部字段,就按照收到顺序直接转发,不改。
HTTP的OPTIONS请求可以探测服务器能支持的方法,服务端会用Allow首部给出支持的方法。一般来说跨域请求的时候浏览器会触发OPTIONS请求,服务端返回的时候如果有Access-Control-Max-Age字段,假设它是10,浏览器就可以缓存这个OPTIONS请求的结果10秒。如果不给缓存的话,每次跨域请求都要重新发送OPTIONS请求。