文章目录
- 前言
- URL(网址)
- urlencode 和 urldecode
- Http格式
- 方法
- Http状态码
- 重定向
- Http常见报头
- 会话保持
- 结语
前言
通过前面的学习,我们已经知道了协议其实就是一种约定,要求双方都能理解对方的消息。应用层上的协议不属于操作系统,是我们自己定制的,只要双方都能看懂即可,今天来学习一下Http协议。
URL(网址)
何为url:
urlencode 和 urldecode
url不只是为了http设计的,url希望能被所有网络协议使用,而协议中规定不能出现非ASCII的字符,因此要对非字符转义。比如图中,/?:等已经被当作特殊字符处理,若想单独表示这些字符,就要对特殊字符先进行转义。
规则:
将需要转码的字符转为16进制。
每两位做一位,前面加上%,编码为%XY
例如:
你的16进制是 0xE4BDA0(utf-8)
%E4%BD%A0
Http格式
-
请求
-
首行:方法 + url + 版本
-
Header:请求的属性,冒号分隔的键值对;每组用\n来分割;遇到空行表示结束
- Connection:长短连接,长连接允许接收多次请求;短连接即响应完就断开连接。
-
Body:空行后面是body的内容,Body允许设置为空字符串;如果body存在,在Header里会有一个Content-Length标识body的长度
-
响应
- 首行:版本号 + 状态码 + 状态码解释
- Header:响应的属性,也是键值对,规则同上
- Body:空行下面就是body,如果服务器返回了一个界面,那么html页面就是在body里的。
方法
GET和POST最为常见,其中GET获取资源,POST传输资源实体。
<form action = "a/c.exe",method="GET">
姓名:<input type="text" name="myname" value="输入姓名"><br/>
密码:<input type="text" name="mypass" value=""><br/>
<input type="submit" value="submit"><br/>
</form>
GET和POST方法的区别:
GET和POST区别:
- 数据:GET将数据放在了url里,POST则直接放在了正文里
- 大小:GET受限于url大小,不能太长、POST可以更长一些
- 安全:GET直接暴露在url里不适合传输敏感数据,而POST相对更安全一点
Http状态码
- 1XX:信息状态码,接收的请求正在处理
- 2XX:成功状态码,请求正常处理完毕
- 3XX:重定向状态码:需要进行附加操作来完成请求
- 4XX:客户端错误码:服务器无法处理请求
- 5XX:服务器错误码:服务器处理请求出错
重定向
临时重定向:不会更改浏览器的任何地址信息。
永久重定向:永久重定向,会改变浏览器的本地书签。
重定向到qq的主页:
std::string response;
response += "HTTP/1.0 302 Found" + SEP;
response += "Location: https://www.qq.com/" + SEP;
response += SEP;
临时重定向的使用场景主要有:旧网站维护、活动广告跳转等
而永久重定向在我们使用中不常见,搜索引擎要周期性的全网爬取数据,如果爬到了永久重定向的网站,他就会把对应的跳转直接修改。
Http常见报头
- Content-Type:请求的类型
- Content-Length:Body长度。
- Host:客户端告诉服务器所求资源在哪个主机的哪个端口
- User-Agent:声明用户的操作系统和浏览器版本(反爬虫-伪造信息)
- referer:当前页面是从哪个页面跳转来的
- location:搭配3写了重定向状态码使用
- Cookie:在客户端存储少量信息,用于实现会话功能
会话保持
Http本身是无状态的——访问无法被记住。http不直接参与,但用户需要会话保持,所以用户是否在线必须要记录下来。
Cookie就是来缓存我们用户信息的技术,浏览器会自动将我们保存的cookie信息带上,自动发给对应的网站,但这样做是有较大风险的:我们把用户信息直接暴露在了外面,如果被中间人拿到这个cookie信息,不仅会让该网站的号被盗号,个人信息也极其有可能被盗
而现在的普遍做法是,由服务器统一来维护你的信息,我们登录验证后,服务器会形成一个session对象,并把sessionid(唯一)返回给我们客户端,客户端的cookie文件就只存放这个sessionid,这样即使被中路截胡,也不用担心用户信息泄露。
同时,服务端也会做一些识别的工作,比如检测你的ip是否异常,数据是否异常等等…根据这些异常会让你的session失效。
结语
尽管如此,Http协议依然不安全,post请求虽然避开了浏览器缓存、无法直接分享和书签;cookie和session也尽量做到了用户信息安全,但依然有很多安全问题:post请求被网络抓包、登陆时在刚开始登录时就被中间人截获,为了解决这些安全问题,我们要引入一个新的协议:Https。