第4章 TCP/IP通信案例:访问Internet上的Web服务器

时间:2023-03-09 00:12:43
第4章 TCP/IP通信案例:访问Internet上的Web服务器

第4章 TCP/IP通信案例:访问Internet上的Web服务器


4.2 部署代理服务器

书中为了演示访问Internet上的Web服务器的全过程,使用了squid代理服务器程序模拟了一个代理服务器.

这里了解了一下HTTP代理服务器的工作原理,有三种代理服务器:

  1. 正向代理服务器.客户的每次请求都将会直接发送到该代理服务器,并由代理服务器来请求目标资源,服务端并不知道真正客户端的身份,只是把数据交给了代理服务器.案例是搭在国外的VPN.

  2. 反向代理服务器.用代理服务器来接收Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从内部服务器上得到的结果返回给客户端.客户端并不知道最终为他服务端身份,只关注了是否获得了请求的数据.案例是拨打10086.

  3. 透明代理服务器.通常设置在网关上,该代理对用户来说是透明的.透明代理可以看作正向代理的一种特殊情况.


4.3 使用tcpdump抓取数据包

当使用wget www.sina.com 发起请求时,系统会做出如下的反映:

  1. 使用DNS解析www.sina.com的IP地址(DNS所使用的协议是UDP,所以不用预先建立连接).

    pi@happyPi:~ $ cat /etc/resolv.conf

    Generated by resolvconf

    nameserver 172.16.8.8

    nameserver 202.106.0.20

    ---------------------分割线---------------------

    IP 192.168.1.108.40309 > 172.16.8.8.53: 21658+ A? www.sina.com. (30)

    IP 192.168.1.108.40309 > 172.16.8.8.53: 5675+ AAAA? www.sina.com. (30)

    IP 172.16.8.8.53 > 192.168.1.108.40309: 21658 3/7/7 CNAME us.sina.com.cn., CNAME wwwus.sina.com., A 66.102.251.33 (332)

    IP 172.16.8.8.53 > 192.168.1.108.40309: 5675 2/0/0 CNAME us.sina.com.cn., CNAME wwwus.sina.com. (78)

  2. 根据获取的IP地址查找路由表中的匹配路径,显然,没找到直接匹配的,所以只能去默认的路径了,也就是网关(192.168.1.1).

    Kernel IP routing table

    Destination Gateway Genmask Flags Metric Ref Use Iface

    default 192.168.1.1 0.0.0.0 UG 202 0 0 eth0

    192.168.1.0 * 255.255.255.0 U 202 0 0 eth0

  3. 由于我删掉了arp中192.168.1.1的MAC缓存地址,所以它会使用广播请求其MAC地址,之后若再次请求将不再需要ARP查询了.

    ARP, Request who-has 192.168.1.1 tell 192.168.1.108, length 28

    ARP, Reply 192.168.1.1 is-at f4:ee:14:31:8e:2a, length 46

  4. 建立连接

    IP 192.168.1.108.36659 > 66.102.251.33.80: Flags [S], seq 3111597488, win 29200, options [mss 1460,sackOK,TS val 1386538 ecr 0,nop,wscale 7], length 0

    IP 66.102.251.33.80 > 192.168.1.108.36659: Flags [S.], seq 1020164898, ack 3111597489, win 4260, options [mss 1440,nop,nop,TS val 2208363296 ecr 1386538,sackOK,eol], length 0

    IP 192.168.1.108.36659 > 66.102.251.33.80: Flags [.], ack 1, win 29200, options [nop,nop,TS val 1386560 ecr 2208363296], length 0

关于第1步,当需要查询某个主机名对应的IP地址时,一般会先检查本地文件 "/etc/hosts" , 若文件中未找到目标主机器名对应的IP地址,将会求助于DNS服务.

若我修改了"/etc/hosts"中的内容,使www.sina.com指向192.168.1.106

pi@happyPi:~ $ cat /etc/hosts
127.0.0.1 localhost
192.168.1.106 www.sina.com
---------------------分割线---------------------
IP 192.168.1.108.42445 > 192.168.1.106.80: Flags [S], seq 1217863331, win 29200, options [mss 1460,sackOK,TS val 1744778 ecr 0,nop,wscale 7], length 0
IP 192.168.1.108.42445 > 192.168.1.106.80: Flags [S], seq 1217863331, win 29200, options [mss 1460,sackOK,TS val 1744878 ecr 0,nop,wscale 7], length 0
IP 192.168.1.108.42445 > 192.168.1.106.80: Flags [S], seq 1217863331, win 29200, options [mss 1460,sackOK,TS val 1745078 ecr 0,nop,wscale 7], length 0

则连接的请求会直接发给指定好IP地址.


4.6 HTTP通信

由于HTTP协议的这种无状态特性与当前交互式应用所需的承上启下不太适应,所以需要使用额外的手段来保持HTTP的连接状态,解决方法就是Cookie,在头部字段"Set-Cookie"中.它是服务器发送给客户端的特殊信息.如此服务器可以区分不同的客户,自动登录就是用Cookie实现的.


关于第4章的总结

了解到当一个请求发起的时候,大致所经过的路径是这样的

  1. DNS获取请求目标IP地址. (应用层)

  2. 路由表选择下一跳的最优线路.

  3. ARP在当前局域网内部指定转发目标. (数据链路层)


From

Linux 高性能服务器编程 游双著 机械工业出版社

MarkdownPad2

2017/1/21 17:56:39