实例总图
为了将ernest-laptop设置为Kongming20的HTTP代理服务器,我们需要在Kongming20上设置环境变量http_proxy:
export http_proxy="cwr-virtual-machine:3128"
其中,3128是 squid服务器默认使用的端口号(可以通过lsof命令查看服务器程序监听的端口号,见第17章)。设置好环境变量之后,Kongming20访问任何Internet 上的Web服务器时,其HTTP请求都将首先发送至ernest-laptop 的 3128端口。
部署代理服务器
部署代理服务器的原理
在HTTP通信链上,客户端和目标服务器之间通常存在某些中转代理服务器,它们提供对目标资源的中转访问。一个HTTP请求可能被多个代理服务器转发,后面的服务器称为前面服务器的上游服务器。代理服务器按照其使用方式和作用,分为正向代理服务器、反向代理服务器和透明代理服务器。
正向代理要求客户端自己设置代理服务器的地址。客户的每次请求都将直接发送到该代理服务器,并由代理服务器来请求目标资源。比如处于防火墙内的局域网机器耍访问Internet,或者要访问一些被屏蔽掉的国外网站,就需要使用正向代理服务器。
反向代理则被设置在服务器端,因而客户端无须进行任何设置。反向代理是指用代理服务器来接收Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从内部服务器上得到的结果返回给客户端。这种情况下,代理服务器对外就表现为一个真实的服务器。各大网站通常分区域设置了多个代理服务器,所以在不同的地方ping同-一个域名可能得到不同的IP地址,因为这些IP地址实际上是代理服务器的IP地址。
现在我们在ernest-laptop 上部署squid 代理服务器。这个过程很简单,只需修改squid 服务器的配置文/etc/squid3/squid.conf
acl localnet src 192.168.179.190
http_access allow localnet
sudo service squid restart
localnet 是一个 变量
service是-一个脚本程序(/usr/sbin/service),它为/etc/init.d/日录下的众
多服务器程序(比如httpd、vsftpd、sshd和mysqld 等)的启动(start)、
停止(stop)和重启(restart〉等动作提供了一个统一的管理。现在,Linux程序员已经越来越偏向于使用service脚本来管理服务器程序了。
tcpdump抓取数据包
在执行wget命令前,我们首先应删除ernest-laptop的ARP高速缓存中路由器对应的项,以便观察TCP/IP通信过程中ARP协议何时起作用。然后,使用tcpdump命令抓取整个通信过程中传输的数据包
sudo arp -d 192.168.1.1
sudo tcpdump -s 2000 -i etho -ntX '(src 192.168.1.108) or
(dst 192.168.1.108) or (arp)'
wget --header-- "Connection: close" http://www.baidu.com//index.html
结果:79
结果是wget命令的输出显示,HTTP请求确实是先被送至代理服务器的3128端口,并且代理服务器正确地返回了文件index.html的内容。
访问DNS服务器
squid程序通过读取**/etc/resolv.conf文件获得 DNS服务器的IP地址,然后将控制权传递给内核中的UDP模块**。UDP模块将DNS查询报文封装成UDP数据报,同时把源端口号和目标端口号加入UDP数据报头部,然后UDP模块调用IP服务。IP模块则将UDP数据报封装成IP数据报,并把源端IP地址(192.168.1.108)和 DNS服务器的IP地址加人IP数据报头部。接下来,IP模块查询路由表以决定如何发送该IP数据报。根据路由策略,目标IP地址(219.239.26.42〉仅能匹配路由表中的默认路由项,因此该IP数据报先被发送至路由器(IP地址为192.168.1.1),然后通过路由器来转发。因为ernest-laptop 的ARP缓存中没有与路由器对应的缓存项(我们手动将其删除了),所以ernest-laptop需要发起一个ARP广播以查询路由器的IP地址,而这正是数据包6描述的内容。路由器则通过ARP应答告诉ernest-laptop自己的MAC地址是14:c6:e4:93:5b:78,如数据包7所示。最终,以太网驱动程序将IP数据报封装成以太网帧发送给路由器。此后,代理服务器再次发送数据到Internet时将不再需要ARP查询,因为ernest-laptop的ARP高速缓存中已经记录了路由器的IP地址和MAC地址的映射关系。
本地名查询
wget命令输出“Resolving ernest-laptop.…. 192.168.1.108″,即它成功地解析了主机名ernest-laptop对应的IP地址,原因如下:当wget访问某个Web服务器时,它先读取环境变量http_proxy。如果该环境变量被设置,并且我们没有阻止 wget使用代理服务,则 wget将通过http_proxy指定的代理服务器来访问Web服务。但http_proxy环境变量中包含主机名ernest-laptop,因此wget将首先读取/etc/hosts配置文件,试图通过它来解析主机名ernest-laptop对应的IP地址。其结果正如wget的输出所示,解析成功。
用户可以通过修改letc/host.conf文件来自定义系统解析主机名的方法和顺序(一般是先访问本地文件letc/hosts,再访问DNS服务),Kongming20 上的该文件内容如下:
order hosts,bind
multi on
其中第一行表示优先使用letc/hosts文件来解析主机名(hosts),
失败后再使用DNS服务(bind)。第二行表示如果/etc/hosts 文件中一个主机名对应多个IP地址,那么解析的结果就应该包括多个IP地址
HTTP通信
首先应该注意的是,TCP连接从建立到关闭的过程中,客户端仅给服务器发送了一个HTTP请求(即TCP报文段4),该请求的长度为136字节(见代码清单4-2中TCP报文段4的 length值)。代理服务器则用6个TCP报文段(23、24、25、33、35和36)给客户端返回了总长度为8522字节(这可以从对方的最后一个确认报文段42的确认值计算得到,考虑同步报文段和结束报文段各占用一个序号)的HTTP应答。客户端使用了7个TCP报文段(32、34、37、38、39、40和42)来确认这8522字节的HTTP应答数据。
HTTP请求
GET http://www.baidu.com/index.html HTTP/1.0
User-Agent: Wget/1.12(linyx-gnu)
Host:www.baidu.com
Connection:close
这些方法中,HEAD、GET、OPTIONS 和TRACE被视为安全的方法,因为它们只是从服务器获得资源或信息,而不对服务器进行任何修改。而POST、PUT、DELETE 和 PATCH则影响服务器上的资源。
另一方面,GET、HEAD、OPTIONS、TRACE、PUT和DELETE等请求方法被认为是等幂的(idempotent),即多次连续的、重复的请求和只发送一次该请求具有完全相同的效果
。而 POST方法不同,连续发送同样的命令可能会影响服务器上的资源
“http://www.baidu.com/index.html”是目标资源的URL。其中“http”是所谓的 scheme,表示获取目标资源需要使用的应用层协议。其他常见的scheme还有ftp、rtsp和 file等。“www.baidu.com”指定资源所在的目标主机。“index.html”指定资源文件的名称,这里指的是服务器根目录(站点的根目录,而不是服务器的文件系统根目录“””)中的索引文件。
“HTTP/1.0”表示客户端(wget程序)使用的HTTP的版本号是1.0。目前的主流HTTP版本是1.1。
“Uscr-Agent: Wget/1.12 (linux-gnu)”表示客户端使用的程序是wget.
“Host: www.baidu.com”表示目标主机名是www.baidu.com。HTTP协议规定HTTP请求中必须包含的头部字段就是目标主机名。
“Connection: close”是我们执行wget命令时传入的,用以告诉服务器处理完这个HTTP请求之后就关闭连接。在旧的HTTP协议中,
**Web客户端和Web服务器之间的一个TCP连接只能为一个HTTP请求服务**。当处理完客户的一个HTTP请求之后,Web服务器就主动将TCP连接关闭了。
此后,同一客户如果要再发送一个HTTP请求的话,必须与服务器建立一个新的TCP连接。也就是说,**同一个客户的多个连续的HTTP请求不能共用同一个TCP连接,这称
为短连接。长连接与之相是指多个请求可以使用同一个TCP连接。长连接在编程上稍微复杂一些,但性能上却有很大提高﹔它极大地减少了网络上为建立TCP连接导致的负荷
,同时对每次请求而言缩减了处理时间。HTTP请求和应答中的“Connection”头部字段就是专门用于告诉对方一个请求完成之后该如何处理连接的,比如立即关闭连接
(该头部字段的值为“close"”)或者保持一段时间以等待后续请求(该头部字段的值为“keep-alive”)。当用浏览器访问一个网页时,读者不妨使用netstat命令来查看浏览器和Web 服务器之间的连接是否是长连接,以及该连接维持了多长时间。
HTTP应答
HTTP/1.0 200 ok
Server: BWS/1.0
Content-lengtf:8024
Content-Type:text/html;charset=gbk
set-Cookie: BAIDUID=A5B6C72D68CF639CE8896FD79A03FBD8:FG=1; expires=Wed,04 -Jul-42 00:10:47 GMT; path= / ; domain-.baidu.com
via: l.0 localhost (squid/3.0 STABLE18)
HTTP的状态码
**“Server: BwS/1.0”**表示目标Web服务器程序的名字是BWS(Baidu Web Server)。
**”Content-Length: 8024”**表示目标文档的长度为8024字节。这个值和wget输出的文档长度一致。
“Content-Type: text/html;charset =gbk”表示目标文档的MIME类型。其中“text”是主文档类型,“html”是子文档类型。“text/html”表示目标文档index.html是 text类型中的html文档。“charset”是text文档类型的一个参数,用于指定文档的字符编码。
“SetCookie:BAIDUID=A5B6C72D68CF639CE8896FD79A03FBD8:FG=1; expires=Wed,04-Jul-42 00:10:47 GMT; path=/; domain=.baidu.com”表示服务器传送一个Cookie 给客户端。其中,“BAIDUID”指定Cookie的名字,“expires”指定Cookie的生存时间,“domain”和“path”指定该Cookie生效的域名和路径。
下面我们简单分析一下Cookie的作用。在交互式Web应用程序兴起之后,HTTP协议的这种无状态特性就显得不适应了,因为交互程序通常要承上启下。因此,我们要使用额外的手段来保持HTTP连接状态,常见的解决方法就是Cookie。Cookie是服务器发送给客户端的特殊信息(通过HTTP应答的头部字段“Set-Cookie”),客户端每次向服务器发送请求的时候都需要带上这些信息(通过HTTP请求的头部字段“Cookie”)。这样服务器就可以区分不同的客户了。基于浏览器的自动登录就是Cookie
“Via: 1.0 localhost (squid/3.0 STABLE18)”表示HTTP应答在返回过程中经历过的所有代理服务器的地址和名称。这里的 localhost实际上指的是“192.168.1.108”。这个头部字段的功能有点类似于IP协议的记录路由功能。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/129715.html