一. Web服务器
Web服务器一般来说主要指代服务器软件(apache一类),也指一些嵌入式的计算机
Web服务器主要任务为:
1. 建立连接
通过TCP建立起链接,判断对方客户端。当然可以选择拒绝或者关闭连接。对于客户端主机名可以通过反向DNS识别,但是会花费一定时间。不过可以通过ident协议找到发起HTTP链接的用户名。
2. 接收请求
在接收请求的时候,可以单线程 / 多线程 / IO复用 / 复用的多线程 (CSAPP上讲得很详细了)
3. 处理请求
4. 访问资源
docroot —— web服务器可以访问的的“根目录”。一台主机可以有多个虚拟docroot.
5. 构建响应
MIME类型来标记传输的内容。 一般通过文件的货站明来说明,也可以通过模式表或者显示分类来标记MIME类型。
重定向时一般除了永久搬离外,使用情况有:临时维护、负载均衡、服务器关联,和最常见的规范目录(加上最后的‘/’)
6. 发送响应
7. 记录日志
二. 代理
虽然现在也将代理用作HTTP/HTTPS等服务的转换,但通常代理还是指代单纯的HTTP代理,进行服务协议转换的为网关!
代理获取流量的方式:
1. 修改客户端(显示地获取)
2. 修改网络,在客户端和服务器都不知道的情况下拦截(伪装)
3. 修改DNS
4. 修改web服务器,通过服务器将之后的流量重定向到代理上
客户端显示连接代理和连接服务器的URI是不同的,连接服务器的时候更多的请求时相对URI,但是连接代理的时候会是绝对的。
当某些时候客户端不知道自己连接代理时也会发送相对的URI,这时候代理会根据header中的host字段找到服务器。
代理不应该修改URI中的任何信息(包括显示地添加:80端口),除了补充绝对路径的'/'
追踪报文,每次经过代理,代理应该在header的via字段中添加其协议名/版本号 节点名和节点注释。
测试代理时经常使用TRACE方法来查看header
三. 缓存
缓存的处理步骤:
1. 接收
2. 解析
3. 查询
4. 新鲜度检测
HTTP/1.1 header中的Cache-Control: max-age用来指定过期日期,其使用绝对时钟(倒计时)来标识过期日期。HTTP/1.0+中使用expire指定一个绝对的日期,可能因为服务器时钟的不同步而造成问题。
期中计算使用期时,将会减去文档传输的时间。
也可以发送if-modified-since: date来进行再验证
5. 创建响应
6. 发送
7. 记录日志
命中的日志一般要发送给服务器(服务器有权利知道哪些客户端在什么时间试图访问他,并且有些广告以浏览次数收费)
服务器可以在文档的header修改cache-control的值来告诉客户端对缓存的处理:
no-store:不要存储
no-cache:可以存储,但是在进行下一次新鲜度再验证之前,缓存不可用
四. 集成电路:网关、隧道及中继
网关用于将HTTP请求解析以调用其他协议、应用程序,最后又包装秤HTTP返回。
最常见的是CGI
隧道通常是对HTTP连接进行盲传输,但是也可以将非HTTP协议的流量进行传输。
HTTPS协议即是SSL上的HTTP
中继是非管饭的HTTP代理,将对字节进行盲转发(会造成盲代理问题)
五. Web机器人(爬虫)
网络爬虫是通过根集的URL获取页面,再对页面解析获取其中的URL,以此递归获取大数量的网络数据。
网络爬虫应当对遍历过得节点进行记录,以此来避免环路出现,一般有以下方法:
1. tree和hash表记录,但是会耗费大量的内存
2. 存在位,类似于hash function之后对数组中的一位置位,以此标记被访问过,这种方法是有损的
3. 广搜!
robots.txt为存储在服务器根目录下的文件,又来标识爬虫的黑白名单、访问权限。
六. HTTP-NG
(一个已经解散的小组对HTTP发展的一些展望,主要思想为模块化)