TCP/IP通信案例:访问Internet上的Web服务器
4.1 实例总图
在客户端运行wget客户端程序,在服务器运行squid代理服务器程序。客户端通过代理服务器的中专,获得Internet上主机www.baidu.com的首页文档。
4.2 部署代理服务器
4.2.1 HTTP代理服务器的工作原理
- 在HTTP通信链上,客户端和目标服务器之间通常是存在某些中专代理服务器,其提供对目标资源的中专访问。
- 一个HTTP请求可能被多个地阿里服务器转发,后面的服务器称为前面服务器的上游服务器。
- 代理服务器分为正向代理服务器、反向代理服务器和透明代理服务器。
- 正向代理服务器要求客户端自己设置代理服务器的地址,客户的每次请求都将直接发送到该代理服务器。
- 反向代理被设置在服务器端,指使用代理服务器来接收Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从内部服务器上得到的结果返回给客户端。
- 透明代理只能设置在网关上,可以看作正向代理的一种特殊情况。
- 代理服务通常还提供缓存目标资源的功能,以便于用户下次访问同一资源时速度增快。
4.2.2 部署squid代理服务器
修改squid服务器的配置文件 /etc/squid3/squid.conf:
acl localnet src 192.168.1.0/24
http_access allow localnet
4.3 使用tcpdump抓取传输数据包
将数据包按照逻辑划分:
- 代理服务器访问DNS服务器以查询域名对应的IP地址;
- 代理服务器查询路由去MAC地址的ARP请求和应答;
- wget客户都安和代理服务器之间的HTTP通信;
- 代理服务器和Web服务器之间的HTTP通信。
4.4 访问DNS服务器
- squid程序通过读取 /etc/resolv.conf 文件获得DNS服务器的IP地址,然后将控制权转交给内核UDP模块;
- UDP模块将DNS查询报文分装成UDP数据报,将源端口号和目标端口号加入UDP数据报头部,调用IP服务。
- IP模块将UDP数据报封装成IP数据报,将源端IP地址和DNS服务器的IP地址加入到IP数据报头部;
- IP模块查询路由表以确定如何发送IP数据报,通过路由器转发;
- 以太网驱动程序将IP数据报封装成以太网帧发送给路由器。
4.5 本地名称查询
Linux将目标主机名及其对应的IP地址存储在 /etc/hosts 配置文件中。
4.6 HTTP通信
4.6.1 HTTP请求
GET http://www.baidu.com/index.html HTTP/1.0
User-Agent: Wget/1.12 (linux-gnu)
Host: www.baidu.com
Connection: close
HTTP请求方法
请求方法 | 含 义 |
---|---|
GET | 申请获取资源,且不对服务器产生任何其他影响 |
HEAD | 类似GET方法,不过进要求服务器返回头部信息,不需要传输任何实际内容 |
POST | 客户端向服务器提交数据的方法,此方法可能会影响服务器;服务器可能会根据收到的数据动态创建新的资源,可能会更新原有的资源 |
PUT | 上传某个资源 |
DELETE | 删除某个资源 |
TRACE | 要求目标服务器返回原始HTTP请求内容,可用来查看中间服务器对HTTP请求的影响 |
OPTIONS | 查看服务器对某个特定URL都支持那些请求方法 |
CONNECT | 用于某些代理服务器,将请求的连接转化为一个安全隧道 |
PATCH | 对某个资源做部分修改 |
- 在上述方法中,HEAD、GET、OPTIONS和TARCE为安全方法,其不对服务器产生影响。POST、PUT、DELETE和PATCH对服务器产生影响;
- GET、HEAD、OPTIONS、TRACE、PUT和DELETE等请求方法被认为是等幂的,即多次连续、重复的请求和只发送一次该请求具有完全相同的效果。但POST方法多次发送同样的请求会影响服务器上的资源;
- Linux上的命令HEAD、GET和POST和HTTP协议中同名请求方法相同,适合用来快速测试Web服务器;
4.6.1 HTTP应答
HTTP/1.0 200 OK
Server: BES/1.0
Content-Length: 8024
Content-Type: text/html;charset =gbk
Set-Cookie: BAIDUID=A5B6C72D68CF639CE8896FD79A03FBDB; expires=Wed,04 -Jul-42 00:10:47 GMT; path=/; domain=.baidu.com
Via: 1.0 localhost (squid/3.0 STABLE18)
- 第一行是状态行,包括HTTP协议的版本号、状态码和状态信息;
状态类型 | 状态码和状态信息 | 含 义 |
---|---|---|
1xx信息 | 100 Continue | 服务器接收到客户端的请求行和头部信息,告诉客户端继续发送数据部分。客户端需要先发送100-continue头部字段告诉服务器自己还有数据要发送 |
2xx成功 | 200 OK | 请求成功 |
3xx重定向 | 301 Moved Permanently | 资源被转移,请求将被重定向 |
3xx重定向 | 302 Found | 通知客户端资源能在其他地方找到,需要使用GET方法获得 |
3xx重定向 | 304 Not Modified | 被申请的资源没有更新,和之前获得的相同 |
3xx重定向 | 307 Temporary Redirect | 通知客户端资源可以在其他地方找到,可以使用原始请求相同的请求方法来访问目标资源 |
4xx客户端错误 | 400 Bad Request | 通知客户请求错误 |
4xx客户端错误 | 401 Unauthorized | 请求需要认证信息 |
4xx客户端错误 | 403 Forbidden | 访问本服务器禁止 |
4xx客户端错误 | 404 Not Found | 资源没找到 |
4xx客户端错误 | 407 Proxy Authentication Required | 客户端需要先获得代理服务器的认证 |
5xx服务器错误 | 500 Internal Server Error | 通用服务器错误 |
5xx服务器错误 | 503 Server Unavailable | 暂时无法访问服务器 |
- 2~7行是HTTP应答头部字段;