2011年6月4日星期六

笔记:HTTP Developer’s Handbook

Chapter 1 - 5

http 是无状态协议,一个请求不需要其他请求的信息
头部信息有3种:
  • General headers : 请求和应答都能有的
  • Request headers:只有请求时才有的
  • Entity headers:与content相关的
请求类型:
  • GET:url有限制,一般不超过1024字符;一般没有content,所以也就没有entity headers
  • POST:支持提交大量数据;有一些entity headers说明content的信息,比如post提交的content的长度Content-Length,类型Content-Type
  • TRACE:过一个代理会加一个Via头,就可以看出是经过哪些代理
  • OPTIONS:获取一些Web Server的支持信息
  • CONNECT:中转server向目标服务器发connect请求,但不解释HTTP头,只是透明转发。最常用的就是,客户端通过代理请求某个https资源
Max-Forwards的request header如果置0,则代理必须自己进行应答。要是这时请求类型是OPTIONS,代理还是得自己答
Server发出Set-Cookie的应答后,并不知道browser有没有存cookie;除非browser再发一个请求过来。
HTTP 1.1 要求每个请求都有Host头
If-Match是请求时指定一些,要求返回的内容的ETag能满足的条件。例如ETag用作缓存版本号,这个时候指定If-Match作用就跟If-Unmodified-Since很像
If-Modified-Since可以用于中间proxy给server请求内容,要是有更新,server就缓回带Last-Modified信息的新内容,否则就返回304给proxy
图5.7/5.8给出了TRACE请求指定Max-Forwards时的例子,可用于测试。Max-Forwards只有在TRACE/OPTIONS请求时不能被忽略
Range 指定请求某一部分的内容,比如只取前500字节,就可以写成0-499
TE表示传输数据采用的编码方案,当server无法确定返回内容长度时,就没有Content-Length头,而是在TE头指定chunked
gzip 与 deflate 的资料:使用 gzip 或 deflate 压缩网页内容与 deflate,说的还不错的文章

Chapter 6 - 状态码

HTTP/1.1 默认是持久连接,如果client在request加上Connection: close,那么,server可以在发完response后关掉连接
状态码:
  • 信息100-199 :HTTP/1.1才开始用
    • 100 Continue 客户端收到真正内容之前,server给个反馈
  • 成功200-299:
    • 203 Non-Authoritative Information 表示有数据,但不是之前设想的来源提供的数据
    • 204 No Content 返回内容为空,不用刷新document view
    • 205 Reset Content 需要刷新document view
    • 206 Partial Content 返回请求的部分内容,与request的Range头对应
  • 重定向300-399:经常要带上Location指定资源的新位置
    • 300 Multiple Choise 没法提供请求的资源,但可以在response content或Location头中给出建议的资源
    • 301 Moved Permanently 永久转向
    • 302 Found 临时转向;事实上客户端看到302咋会操作之前没有规定,由客户端自定;一般来说,不论之前资源请求方式是不是GET,在转向之后Location指定的新资源默认用GET取
    • 303 See Other 跟302一样是临时转向,只是显式指定Location指定的新资源要用GET方式取
    • 304 Not Modified 资源从某个时间点开始就没被改过,返回的content为空;与request的If-Modified-Since对应;一般还会带上个Date头,有 时还有ETag和Content-Location头;而且由于这个经常是给proxy回的,还会出现Expires、Cache-Control、 Vary头等等
    • 305 Use Proxy 要求用代理取,Location中给出指定代理的地址;注意,只有当前请求的这个资源是指定要用这个代理取
    • 307 Temporary Redirect 跟302一样是临时转向,只是取Location指定的新资源时采用跟原始请求相同的method
  • client错误400-499:
    • 400 Bad Request 请求格式错误,比如少提交了Host之类
    • 401 Unauthorized 请求一个保护资源时,会先给个401,同时带上WWW-Authenticate的头,用户输入正确的认证的信息之后,浏览器一般会自动接下去请求内容
    • 402 Payment Required 要求付费?实际上基本没出现过
    • 403 Forbidden 没有权限请求该内容;不想被黑客盯上也可以直接返回404
    • 404 Not Found 资源不存在
    • 405 Method Not Allowed 不支持该请求指定的method
    • 406 Not Acceptable 没法满足request中指定的Accept条件
    • 407 Proxy Authentication Required 代理跟client说要求认证,带上个Proxy-Authenticate头
    • 408 Request Timeout 请求超时。例如server需要接到第2个request才给内容,但是client之前指定了Connection: close直接断连接了,然后就超时
    • 409 Conflict 冲突,比如client刚请求了某个版本的资源,资源版本又更新了。
    • 410 Gone 不再存在了
    • 411 Length Required
    • 412 Precondition Failed 不满足If-Match之类指定的条件
    • 413 Request Entity Too Large
    • 414 Request-URI Too Long
    • 415 Unsupported Media Type
    • 416 Requested Range Not Satisfiable
    • 417 Expectation Failed 不满足请求指定的Expect条件
  • server错误500-599:
    • 500 Internal Server Error 不知道cgi出啥错了
    • 501 Not Implemented 服务器不支持该请求指定的method
    • 502 Bad Gateway 代理收到invalid reponse的时候,会返回502给client
    • 503 Service Unavailable 服务器暂时没法处理请求,一般会给个Retry-After跟client说啥时候再来请求
    • 504 Gateway Timeout 代理等server的应答等超时了,会返回504给客户端
    • 505 HTTP Version Not Supported
Accept-Ranges 是否支持分段请求
Age 现在返回的内容已经从原始server拿过来多久了;代理算的时候会加上传输时间
Content-Disposition 经常用做指定建议网页另存为的文件名
Etag 资源版本
Location 必须是绝对路径
Vary 中间代理不能修改的头信息;例如Accept-Language,同一网址,有不同语言版本

Chapter 7 General Headers

Cache-Control
  • no-cache 不是不让缓存,只是在给用户缓存内容前先检查下;如果指定no-cache=”Set-Cookie”这种,则是指定缓存中不保留的部分
  • no-store 不做缓存 (IE直接无视此信息)
  • max-stale  缓存系统不经检查直接返回内容给用户的最大时间
  • min-fresh 缓存系统只能返回过期时间比min-fresh长的资源给用户
  • no-transform 不修改内容
  • only-if-cached 缓存系统不能去找原始服务器,但还是要给用户返回缓存;一般是缓存系统与原始服务器通信有问题
Connection : 指定是否持久连接Keep-Alive/Close,HTTP/1.1默认是持久连接,HTTP/1.0默认是非持久连接;也可以设成Upgrade
Pragma 是HTTP/1.0用于控制cache的,现在就一个用法,Pragma: no-cache跟人家说不要缓存
Trailer 在content之后还可以带HTTP headers,只在Transfer-Encoding: chunked的时候可用
Transfer-Encoding 持久连接的时候,不知道啥时候内容传完,所以要指定chunked传输
Warning 经常用于跟client说缓存出了什么问题

Chapter 9 - 14

url用iso-8859-1编码
ascii字符表:http://www.asciitable.com
Content-Disposition 如果想下载,指定attachment;如果想嵌入,例如流媒体,指定inline
session 除了保持用户的认证状态之外,还保持一些与应用相关的数据
server给的Set-Cookie一些属性不会再由client从Cookie提交回去(只提交name<->value对),这些属性只是用于browser决定何时该提交cookie
用户数据放在server比在网络中传来传去安全多了
cookie之类的状态管理机制的唯一用途在于标识客户端,不用于用户认证,或传用户数据
默认提交的表单参数写成hidden型的表单参数提交,不要放在表单url里
还有一种方案是在url里带上unique identifier
尽量不要把关键数据放在用户侧
缓存需注意避免三个问题:1) 用户获取过期的数据;2) 把别的用户数据发给当前用户;3) 敏感信息被缓存
Cache-Control 的取值:
  • public 可以任意缓存
  • private 可以缓存,但不是公共缓存
  • no-transform 可以缓存,但不能改内容
  • must-revalidate 过期后缓存总是要重新验证
  • proxy-revalidate 除了代理之外,过期都要重新验证
  • max-age 可以把当前缓存send给用户的时间区间
  • s-maxage 与max-age相同,但private-cache会忽略这个
  • cache-extension 非明确指定通用的;proxy可以忽略这个
GET发请求时,加上If-Modified-Since,如果没更新,Server返回304 Not Modified,可以省流量
返回的Content-Range: 600-900/1234 表示总共有1024字节,当前按请求仅返回600-900字节的内容,Content-Type为multi-part/byteranges
部分请求成功返回码为206 Partial Content,失败为416 Requested Range Not Satisfiable 
 

Chapter 15 - 16

缓存协议:
  • Internet Cache Protocol (ICP):最流行的,squid也用它;轻量级的,HIT/MISS两状态,用UDP通信
  • Cache Digest Protocol :通过内容的摘要比对确定是否要更新缓存;用TCP通信,摘要可通过http链接获取
  • Cache Array Resolution Protocol:多个代理逻辑上并做一个代理;通过url和缓存id标识;有负载不均衡的问题;新添一个proxy,整个hash表要重算
  • Web Cache Coordination Protocol:解析http request头,重定向到cache proxy;适合做透明代理;直接从底层看端口转流量
负载均衡,是否总是由同一个server服务同一个特殊的client?
《Server Load Balancing》  by  Tony Bourke 
 

Chapter 17 - 25

SSL 缓存,可复用之前协商过的对称密钥
TLS是IETF搞的,SSL是Netscape搞的
Secure HTTP request 包裹着正常的HTTP request
磁盘阵列介绍:RAID,最常用的是RAID5
XSS 尝试插入恶意代码,获取用户cookie;针对特定站点的信任
CSRF 伪造HTTP请求,利用已认证的用户身份绕过安全检查;针对特定用户的信任
CSRF比XSS更难防,一些考虑做法:
  • 重点表单禁用GET请求
  • POST请求的结果会更容易看到,因为POST返回的内容是for parent resource,而非an embedded one
  • 表单加上随机数,在server端校验
SOAP服务,指定SOAPAction,通过POST方式发出请求,远程执行完毕后返回格式化的xml内容
WebDAV服务,例如svn/cvs
P3P 用户设置哪些隐私可以被收集,相关参考资料:《P3P Web隐私》
 
 

没有评论:

发表评论