4. http协议及报文头部结构
请求报文:
图片.png- 开始行: 方法, URL, 版本
- 首部字段: 字段名:值;比如: Server:nginx. 不同的浏览器也会自行添加不同的首部字段,比如浏览器版本
- 实体: 存放具体信息, 如果只是访问网站页面, 一般没有实体, 因为URL放在了开始行; 如果是上传文件, 图片, 提交用户名密码等, 那么就会放在实体中.
- 首部字段和实体之间有一个空行. 分离首部字段和实体.
生产案例:
可以利用httpd或者nginx的访问日志中的URL字段, 来统计网站哪个页面, 哪个连接访问的次数最多.
响应报文:
图片.png- 开始行: 版本, 状态码(返回信息的数字, 存放程序执行退出后的状态信息), 短语(解释状态码)
- 首部字段: 字段:值
- 实体行: 实体, 实体最多的就是请求的网页文件
http响应码:
http协议状态码分类
1xx: 100-101 信息提示
2xx: 200-206 成功
3xx: 300-307 重定向
4xx: 400-415 错误类信息, 客户端错误
5xx: 500-505 错误类信息, 服务器端错误
http协议常用的状态码
200: 成功, 请求数据通过响应报文的entity-body部分发送; OK
301: 请求的URL指向的资源已经被删除; 但在响应报文中通过首部**Location**指明了资源现在所处的新位置, 301 Moved Permanently
302: 响应报文Location指明资源临时新位置, 302 Moved Temporarily
304: 客户端发出了条件式请求, 但是服务器上的资源未曾发生改变, 则通过此响应状态码通知客户端; 304 Not Modified. 通过浏览器缓存得到的资源, 比如, 用户访问一个页面时, 发现本地已经有了该资源了, 就没有必须去访问服务器上的资源了
307: 浏览器内部重定向
401: 需要输入账号和密码认证才能访问资源; 401 Unauthorized
403: 请求被禁止; Forbidden
404: 服务器无法找到客户端请求的资源; 404 Not Found
500: 服务器内部错误; Internal Server Error
502: 代理服务器从后端服务器收到了一条伪相应, 如无法连接到网关, 也就是后端服务器出现了问题; 502 Bad Gateway
503: 服务不可用, 临时服务器维护或者过载, 服务器无法处理请求
504: 网关超时; 后端服务器在一定时间内无法相应; 504 Gateway Time-out
5. Cookie和Session
http是无状态的协议, 无法记录用户访问的信息, 需要用cookie和session解决
cookie和session的使用是为了记录用户的信息, 为用户提供专门的服务.
cookie:
cookie在服务端生成, 在服务器本地缓存一份, 同时发送一份给客户端, 客户端请求时会携带cookie信息, 服务器用于认证
cookie就是一段小数据, 在用户访问服务器时, 服务器端会自动生成一个cookie信息, 通过响应报文首部字段(Set-Cookie), 发回给客户端. 用户下次再访问相同的网站时, 即使中间隔离一段时间, 客户端会把从服务器端收到的cookie信息, 通过请求报文, 首部字段中的Cookie字段(Cookie)发回给服务器端. 服务器端会比对自己原先给用户生成的cookie和用户这次访问时携带的cookie来确认用户身份. 这样就实现了http协议的有状态化, 否则http协议是无状态不记录用户信息的.
cookie的问题: 如果把用户相关的信息, 都存放在cookie里, 那么每次用户访问网站都要携带cookie信息, 会造成网络带宽消耗; 另外cookie是有有效期的. 可以在服务器端设定
cookie分类:
- 会话级cookie: 浏览器不关闭时cookie有效, 浏览器关闭了, cookie就失效了.
- 长期性cookie: 即使关了浏览器, cookie也可以在定义的时间内持续保存.
网站想要实现cookie, 需要在网站开发层面实现
session:
为了解决cookie携带数据造成网络带宽消耗的问题, 引入了session技术, 当用户访问网站时, 服务器会在内存中给用户生成session信息, 比如session id 和 用户信息. 通过session id就可以定位到一个用户. 这个session会以Set-Cookie的方式再返还给用户. 用户再次访问时, 会把这个session信息添加到首部字段, 一起发送给服务器. 浏览器通过每次访问时携带session信息, 就可以表明自己的身份. 但是, session id只包含了很少的信息,比如包含session id, 那么服务器就可以根据session id来判断用户身份. 不会存放过多数据, 解决了带宽. 基于session是瘦cookie, 而基于cookie形式是胖cookie.
问题: 如果黑客盗取了用户的session id那么就可以冒充用户来登录网站了. 但是session id是一个巨大的数据, 很难计算出来.
session要配合cookie一起使用, session是由服务器端生成, 发送时只把session id添加到cookie里发送给客户端. 而完全基于cookie的方式, cookie里带了大量的信息. 相当于表的一行, 而session id就相当于表的主键.
session是服务器在内存中生成的, 每次访问session有可能发生变化. 是会话级的. 客户端的session是临时的, 不会保存, 会话关闭了, 客户端的session信息就丢失了, 下次在访问就不会携带session信息. 但是服务器端保存旧session还是会保留. 用户再次访问时, 由于没有session信息, 那么服务器端会生成一个新的session信息给用户. 服务器端的session信息是有期限的. 超过有效期也会删除无效的session信息.
6. Web工具和命令
wget命令:
-P: 将URL中的文件, 下载到指定的目录下, 不能改名, -P后面接的需要跟一个目录,目录用不用/补全效果都一样, 如果目录不存在, 那么会自动创建, 并把文件下载到该目录里
wget -qP 目标目录 URL
-O: 将URL中的文件, 下载到某个目录中, -O后, 接的需要是一个文件名, 可以改名. 如果不指定文件名而使用-O -
, 则会把输出打印到屏幕上
配合-q, 不显示下载过程
wget -qO 路径/保存为的目标文件 URL
wget -qO - URL 直接输出在屏幕
wget -P 下载目录 URL
ab压力测试命令:
常见选项:
-n: 模拟总的请求数
-c: 模拟并发数
需要重点关注Requests per Second数值, 表示服务器每秒能处理的请求数
网友评论