熟悉HTTP/HTTPS 等网络基本知识
一 什么是协议
1.什么是协议?通信双方预先定义好的通信规范或规则
2.HTTP协议(超文本传输协议)的历史版本
HTTP / 0.9:
GET index.html
HTTP / 1.0
增加 POST
POST /index.html HTTP/1.0
If-Modified-Since 缓存相关
Authorization 身份认证
Connection 默认值close
HTTP/1.1
GET /index.html HTTP/1.1
Host 指定请求域名
Range 指定请求范围
Connection : 默认值 是 keep-alive
请求结束后,保持一段时间。默认keep-alive以便网页中嵌入的样式等继续使用连接。
Transfer-Encoding: chunked 分块传输
二 HTTP 通信交互流程
1.URL 规范
http://
username:passwd 一般不要
@www.un.org
/subdir/file.html
?var=value&var2=value2
#hash
2.HTTP工作流程 简要
1.输入域名,回车
2.解析域名,获取IP, 通过DNS
3.建立TCP连接
4.向服务器发送GET请求
5.返回内容
根据conection配置看是否断开连接。
一般是
客户端 —— 代理服务器 —— 应用服务器
三 常见的HTTP header 的含义及作用
1.fiddler 小工具 是一个http协议调试代理工具
浏览器抓包和调试工具
2.HTTP请求
①请求行
GET /dir/1.html HTTP/1.1
②请求头
通用header
请求header
实体header
③请求体
3.HTTP/1.1 规范中的8个请求方法
GET URL 规范最长是255个字符,实际支持1024字符
POST 提交大块数据 成功返回200
HEAD 检测服务器
PUT 类似post请求,目的是向服务器发送允许保存的数据 成功返回201 只能通过程序或工具发送
DELETE 删除服务器资源
TRACE 用于诊断网络
OPTIONS 查询指定资源有哪些请求方法可以使用
CONNECT 用于代理服务器和应用服务器之间
用于建立一个仅用于数据传输的隧道
4.请求头
Accept:
text/html,application/xhtml+xml,application/xml; q=0.9; /;q=0.8
浏览器接受的内容类型
参数为 Content Type
q 指定优先级[0-1] 0为不接受, 默认为1
如果不指定 / , 则其他类型优先级为0;
Accept-Charset: 浏览器接受的字符集
utf-8;q=0.66,*;0.6
Accept-Encoding:
gzip,deflate,sdch 浏览器接受的压缩格式
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
浏览器接受的语言
Authorization:发送身份验证信息的
Basic
QW….Q== 用户名和密码的basic64编码
如果响应指定的话
401 Unauthorized
浏览器就可以继续发送请求
Cookie :
version=1;skin=new
Cache-Control: 控制缓存策略
public,max-age=86400
Host:
www.xxx.com:8080
If-Match:
“aetaghash”
类似随机字符串,hash 仅在指定的值匹配
服务器已有内容的hash码,浏览器提交md5值,服务器检查该值,则进行操作。
如果匹配,则执行
If-Modified-Since:
Sun , 11 may
指定时间后,内容又被修改了,则请求git, 否则返回304
If-None-Match
“aetaghash”
如果不匹配,则执行
If-Range
“aetaghash”
Sun , 11 may
如果没有变化,则返回指定的
检查分段内容有没有变化,断点续传。如果没有变化,就发送请求的,如果变了就给全部内容
If-Unmoidified-Since:
没有变化,则给到
Range: 可以发送片段请求
bytes=0-499,1000-
Referer :
http:// xxx.com
点击页面的url,来源
Upgrade:
HTTP/2.0
客户端向服务器请求切换协议
2.0 规范已经出了,但是应用不广泛
Via:
192.168.11.22,ex.com
发送trace 请求时,追踪
X-Requested-With: XML
Ajax 请求时会用到,判断AJAX请求
X-Forwarded-For:
client1,proxy1,192.168.2.125
经常用于代理服务器转发客户端ip地址
四 常见HTTP相应状态码的含义
响应行
HTTP/1.1 200 OK
响应头
通用header, 响应header,实体header
响应体
html代码等
响应状态码:
100-199 :参考信息
200-299:成功 成功获取或成功创建
300-399: 重定向
400-499:客户端错误
500-599:服务器错误
常见码
200 ok
201 已创建 通常put请求
206 片段内容 请求range
301 已永久移动到其他位置,通常配合Location使用
SEO适用,无结尾/请求目录时也会自动产生此响应,尽量戴上斜线
302 Found 找到了
按HTTP规范,
304 Not Modified
未修改,无变动(用缓存中的吧)
400 Bad Request 请求错误
401 Unauthorized 未被授权
浏览器收到此响应会弹出一个输入用户名、密码的对话框
403 禁止访问 验证失败或重试次数过多也会导致此响应
404 Not Found
405 Method Not Allowed
访问方法不对
服务器禁止以所请求的方法访问,同时一般会通过Allow 告知允许的方法:
Allow: GET ,POST,HEAD
406 Not Acceptable
无法接受
当请求中的Accept系列header 中列出的条件无法满足时,会产生此响应
408 Request timeout
请求超时
服务器一直没遇到 connection:close 会产生此响应并关闭连接
416 Request range not satisfiable
Range请求片段无法满足
418 i m a teapot
用茶壶煮咖啡的时候
愚人节的玩笑
500 服务器错误
502 bad gateway
网管错误。代理服务器从上游服务器收到一个无效响应时,会给客户端返回此响应
503 service unavailable 服务暂不可用
如上游服务器超载或暂时停机维护等,代理服务器则返回此响应。可附带retry-after头
通常网站访问压力大时
504 gateway timeout
网关超时 代理服务器无法在限定时间内从上游服务器收到一个有效响应
通常网站访问压力大时
响应header
ETag:”ab….sertag“
跟客户端配合,检查客户端缓存是否超时
Location: 指定新的位置
Refresh: 指定重新刷新的时间和地址
Set-Cookie:服务器让客户端设置cookie
Vary 客户端浏览器保存缓存时,根据这些header 存储缓存。
五 Cookie、Session 的原理
cookie 是什么?
cookie使用来跟踪用户会话的技术.cookie本身是一小段文本信息,它存在与http协议header头域里,通过http协议来传递.
cookie 用来干什么?
http协议是一种无状态协议,客户端和服务端完成一次会话后,服务器端不知道下次连接到服务端的是不是同一个客户端,需要有个标识能告诉服务端,是哪个客户端连接上了服务端.例如登录用户,需要有个东西标识,那就在客户端保存一个cookie,下次访问的时候随http header一起发到服务端,服务端根据cookie的内容知道了这是某个用户的请求,服务端根据cookie取到该用户的信息,返回给客户端
session是什么
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。
session能干什么
cookie能做的他能做,cookie不能做的他也能做!
session是怎么工作的
用户请求login.php填写数据后提交
服务器收到提交的数据取得用户信息,将用户信息存入session,并将session_id通过cookie的形式发给客户端
客户端将session_id存入浏览器cookie文件
用户再次访问其他页面时,将有session_id的cookie通过header头发给服务端
服务端拿到session_id从session中取到用户信息并返回
问题1:session的有效期?
由php.ini 中的session配置决定(session.cookie_lifetime=0 session.gc_maxlifetime ==600 )
问题2:关闭客户端可以删除session或者使session失效吗?
不能删除session,但是有可能使session失效。使其失效的原因是如果配置的session有效期是cookie随浏览器失效。
问题3:
如果浏览器不支持cookie,session能正常使用吗?
可以,将session通过url传递
问题4:
如果服务器有多台服务器,session如何共享?
nfs 将多台服务器所在的session存储目录设为mount挂载的目录
memcache session.save_handle=memcache并设置路径session_path = ‘tcp://192.168.1.101:11211’
mysql session.save_handler=user ,然后建立session表,建立php文件用于对数据库表操作session数据,最后用session的都引入上一步中的php文件
六 HTTP缓存策略
性能优化
缓存 Cache-control、 If-Modified-Since、ETag
Cache-Control: max-age=600, no-cache="Set-Cookie"
no-cache="xxx":缓存,但在发回客户端前先作检查,传值则表示不缓存指定的header
no-store:不缓存任何内容,在IE中=no-cache。
max-age=120: 缓存最大有效期,秒(Age response header)
max-stale=600:在缓存过期后还可以继续保存600秒,不赋值则表示可一直有效
no-transform:禁止缓存代理修改内容
only-if-cached: 禁止缓存代理访问应用服务器,仅在有缓存时返回内容。
public: 任何客户端(代理服务器或浏览器)均可缓存
private: 仅限私有客户端(一般是浏览器)可缓存内容
must-revalidate: 必须重新验证缓存有效性(默认行为),此指令目的在于显式指明
proxy-revalidate:代理服务器需要重新验证缓存有效性,浏览器不需要
s-maxage:指定public客户端上的maxage,private 上忽略。
第一次请求,服务器响应:
Last-Modified: 时间A
第二次请求,附加 header,检查是否从上次修改时间点后又有过新的修改:
If-Modified-Since: 时间A
ETag:
If-None-Match:
Vary: Accept-Encoding
告知缓存代理服务器,客户端请求中发送了不同的 Accept-Encoding 就要缓存不同的版本
Vary: User-Agent 合理吗? back
连接
Connection: keep-alive
Keep-Alive: 10
压缩
Accept-Encoding、Content-Encoding
ob_start("ob_gzhandler");
片段请求
Range: bytes=0-1023
分块传输
Transfer-Encoding: chunked
七 HTTP安全、常见攻击方式及防范策略
XSS 跨站脚本共计
被攻击的网站上注入了可执行的js,通过js盗取cookie,发送到第三方网站
CRSF 跨站请求伪造
在用户不知情的情况下,通过第三方网站插入图片或JS提交POST请求的方式执行有害操作
POST 请求带hash值来防止
Sniffer 嗅探
各种监听、假冒
HTTP和HTTPS
HTTP原先 直接建立在tcp协议上
HTTPS 建立在ssl协议上,当然ssl协议也是建立在tcp协议上
SSL协议的工作流程
客户端向服务器请求获取证书+公钥
客户端通过CA验证收到证书的合法性
客户端通过收到的公钥加密一个字符串,作为后续通信密钥,发送给服务器
服务器通过私钥解密,得到通信密钥
后续HTTP协议通过通信密钥加密进行
八 PHP中HTTP相关应用实战
使用 fsockopen 函数来模拟实现HTTP协议
或curl扩展