第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

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

  1. linux高性能服务器编程 (四) --TCP/IP通信案例

    第四章 TCP/IP通信案例 HTTP代理服务器的大致工作原理        在HTTP通信链上,客户端和服务器之间通常存在某些中转代理服务器.它们提供对目标资源的中转访问.一个HTTP请求可能被多个 ...

  2. 外网主机访问虚拟机下的Web服务器_服务器应用_Linux公社-Linux系统门户网站

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  3. 第二章 TCP/IP 基础知识

    第二章 TCP/IP 基础知识   TCP/IP  transmission control protocol and ip internet protocol 是互联网众多通信协议中最为著名的.   ...

  4. TCP/IP 通信

    TCP/IP 通信又叫socket 通信,是基于TCP/IP协调面向连接的一个数据传输技术.是属于OSI国际标准的传输层,三次握手 提供数据,有序,安全,端到端的传输和接收.它有三个主要协议:传输控制 ...

  5. 第6章 TCP/IP路由协议故障处理

    第6章 TCP/IP路由协议故障处理 一.缺省网关 当包的目的地址不在路由器的路由表中,如路由器配置了缺省网关,则转发到缺省网关,否则就丢弃. Show ip route :查看Cisco路由器的缺省 ...

  6. TCP/IP通信网络基础

    TCP/IP是互联网相关的各类协议族的总称. TCP/IP的分层管理 分层的优点:如果只有一个协议在互联网上统筹,某个地方修改就要把所有的部分整体换掉,采用分层则只需要改变相应的层.把各个接口部分规划 ...

  7. 使用Boost asio实现同步的TCP/IP通信

    可以先了解一下Boost asio基本概念,以下是Boost asio实现的同步TCP/IP通信: 服务器程序部分,如果想保留套接字之后继续通信,可以动态申请socket_type,保存指针,因为so ...

  8. 使用Boost asio实现异步的TCP/IP通信

    可以先了解一下Boost asio基本概念,以下是Boost asio实现的异步TCP/IP通信: 服务器: #include "stdafx.h" #include <io ...

  9. tcp/ip通信第5期之服务器端程序

    /* 此程序是tcp/ip通信服务器端程序,测试运行在redhat5上 重构readline函数,解决粘包问题——利用“\n”识别一个消息边界 */ #include<stdio.h> # ...

随机推荐

  1. 十七、IntelliJ IDEA 中的 Maven 项目初体验及搭建 Spring MVC 框架

    我们已经将 IntelliJ IDEA 中的 Maven 项目的框架搭建完成.接着上文,在本文中,我们更近一步,利用 Tomcat 运行我们的 Web 项目. 如上图所示,我们进一步扩展了项目的结构, ...

  2. CSU-ACM2018暑期训练7-贪心

    A:合并果子(贪心+优先队列) B:HDU 1789 Doing Homework again(非常经典的贪心) C:11572 - Unique Snowflakes(贪心,两指针滑动保存子段最大长 ...

  3. HDU 1018Big Number(大数的阶乘的位数,利用公式)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1018 Big Number Time Limit: 2000/1000 MS (Java/Others) ...

  4. STM32之系统时钟

    转载:http://www.openedv.com/posts/list/302.htm 时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是必要的,有助于深入理解STM32. ...

  5. Lua库-table

    1 获取以及设置大小 a={} print(table.getn(a)) --> table.setn(a,) print(table.getn(a)) --> 2 插入删除 a={} f ...

  6. 小程序内嵌H5——判断小程序环境的坑

    现在各种小程序风靡,这边H5的需求还没有搞定,产品又要求做小程序版本,做可以,关键是618前上线,我-- whatever,618要做推广,日期订了,剩下的就只能是排期,定方案,尽可能完成. 最后和产 ...

  7. Linux中将端口(80)重定向

    在Linux中直接指定命令: iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 其中80为要访问的端 ...

  8. Kaggle比赛总结

    做完 Kaggle 比赛已经快五个月了,今天来总结一下,为秋招做个准备. 题目要求:根据主办方提供的超过 4 天约 2 亿次的点击数据,建立预测模型预测用户是否会在点击移动应用广告后下载应用程序. 数 ...

  9. React组件的使用

     一.index.js 文件[基本配置] //react语法塘 import React from 'react'; //reactDom用来操作虚拟DOM import ReactDom from ...

  10. C# 设计模式之 单例模式

    单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题,不过俺从没看过出错的现象,表鄙视我…… public class Singleton{    private static ...