http 第五章
个人感觉这章说了很多废话
服务器都做了啥
大多数服务器都做了啥
- 建立连接
- 接受请求
- 处理请求
- 访问资源
- 构建响应
- 发送响应
- 记录日志
处理新连接
服务端当接受到TCP新建连接请求的时候,会通过IP地址去判断时候为为其不想接受的地址,如果是就不接受。但是接受服务器就会把连接添加到WEB服务器连接列表中。
客户端主机名识别
占坑
ident 协议
占坑
接受报文
- 解析请求行
请求行的分隔符是空格,解析结束符号 CRLF。 - 读取以CRLF为分隔的报文首部,两个CRLF标志全部请求首部的结束
- 以 Content-Length 为长度标志的请求体
注 :有时一个TCP包不够存放一个HTTP请求,这是会现将不完整的TCP包放在内存中等待下一个报文,解析完后把个个信息放在内存中。
处理请求的模式
- 单线程服务器
- 多线程服务器
- 复用 I/O 服务器
- 复用 I/O 加多线程
注: 下面这条全属胡扯
单线程与复用I/O的区别是 单线程服务器一次只会开一个线程去处理请求,我们知道只有一个请求一次只能做一件事情,那么当服务器在处理请求的任何时候,对其他请求就像是不可见的都是没有的。复用式 I/O 服务器就开能够去同时监听多个已连接的请求,看其是否有变化,有的处理并关闭监听,处理完回到监听状态。
docroot
web 服务器支持各种不同类型的资源映射。最简单的就是 base + uri 的方式。意思就是:服务器设置 base 目录,在加上http请求中的的URI 。
例如:base 设置为 /usr/local/http/ , 客户端发来的 url 为 http://www.ahole.cn/I-love-u 那么计算完就是 /usr/local/http/I-love-u;
有一点需要注意的事,web服务器为了安全除设置的 base 目录以外的文件对外是不可见的,也就是客户端不能访问 /usr/local/http 外的文件。比如 发 ../xxx 不会访问 /usr/local/xxx 的文件。
目录列表
当服务器以上面的方式拼接起来是一个目录的时候,web 服务器会有多种解决方式,1.返回错误、2.扫描目录,返回像 index.html index.htm home.html 这样的页面、3. 返回一个索引页面,供用户选择(比较危险)
动态内容资源映射
我们知道我们的 web 存在动态内容。那么什么时候执行动态内容,什么时候作为静态内容直接返回呢。这些在每个服务器上都有不同,Apache 的机制是在配置文件中设置,URI 为某些特殊字符开头的就去跑动态内容。当然还有些就是都写特殊后缀去跑动态机制,比如 .php
构建响应
服务器构建响应有两个通用的过程。1、书写content-type 2、Content-Length 首部。 书中写的很初略
重定向
重定向的可能情况:
- 永久删除资源
- 临时删除资源
- URL 增强
- 负载均衡
- 服务器关联
- 规范目录名称
负载均衡: 当其中一个服务器超载时,重定向到另一个服务器,就位负载均衡。
服务器关联: 重定向到一个资源更相近的服务器上