【计算机网络】应用层协议Http

文章目录

  • 前言
  • URL(网址)
  • urlencode 和 urldecode
  • Http格式
  • 方法
  • Http状态码
  • 重定向
  • Http常见报头
  • 会话保持
  • 结语

前言

通过前面的学习,我们已经知道了协议其实就是一种约定,要求双方都能理解对方的消息。应用层上的协议不属于操作系统,是我们自己定制的,只要双方都能看懂即可,今天来学习一下Http协议。

URL(网址)

何为url:
【计算机网络】应用层协议Http_第1张图片

urlencode 和 urldecode

url不只是为了http设计的,url希望能被所有网络协议使用,而协议中规定不能出现非ASCII的字符,因此要对非字符转义。比如图中,/?:等已经被当作特殊字符处理,若想单独表示这些字符,就要对特殊字符先进行转义。

规则:
将需要转码的字符转为16进制。
每两位做一位,前面加上%,编码为%XY

例如:
你的16进制是 0xE4BDA0(utf-8)
%E4%BD%A0

Http格式

  • 请求
    【计算机网络】应用层协议Http_第2张图片

  • 首行:方法 + url + 版本

  • Header:请求的属性,冒号分隔的键值对;每组用\n来分割;遇到空行表示结束

    • Connection:长短连接,长连接允许接收多次请求;短连接即响应完就断开连接。
  • Body:空行后面是body的内容,Body允许设置为空字符串;如果body存在,在Header里会有一个Content-Length标识body的长度

  • 响应

【计算机网络】应用层协议Http_第3张图片

  • 首行:版本号 + 状态码 + 状态码解释
  • 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方法的区别:
【计算机网络】应用层协议Http_第4张图片


【计算机网络】应用层协议Http_第5张图片
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。

你可能感兴趣的:(计算机网络,计算机网络,http,网络协议)