一起深入了解http和https协议吧
了解http协议
1.http是什么
首先我们需要知道http是什么
http(Hyper Transfer Protocol,超文本传输协议)是一种应用非常广泛的应用层协议,底层是tcp协议,http要用tcp来完成数据通信的能力。我们可以进行文本的传输,还有一些其他资源,如图片,视频,音频等等
http的特点:
1.http本身是无连接的(底层基于tcp协议,http要发起所谓httprequest时,不会先在http层建立连接
2.http本身是无状态的(http不会记录自己发起http请求的上下文,可以理解为不对历史有记忆)(但我们可能会产生疑问,为什么我在登陆时,我进行了密码保存,下次再登录的时候就不用输入密码了呢?这个问题我们放到https中讲解)
3.http发起请求的时候,有基于长连接,也有基于短链接
2.认识URL
2.1URL
我们平时俗称的网址,其实就是URL
我们可以先给出一串地址,比如
http://user:pass@www.example.jp:80/dir/index.html?uid=1#ch1
在上面的一串网址中我们一共可以分为7个部分
协议方案名:http://
我们所采用的协议
登录信息:user:pass
这里我们请求时无法看见,可以忽略
服务器地址:www.example.jp
域名
服务器端口号:80
端口号会被省略,因为我们已经知道了所使用的协议,所以服务器上的端口号都是已知的(即理解为,这个服务和端口号是进行了绑定的,强相关)
带层次的文件路径:/dir/index.html
这个标定一个特定的网页文件,这里的 ’ / '被称为路径分割符,可以理解为是http Web服务器的‘根目录’(和linux中的不一定一样)
查询字符串:uid=1
片段标识符:ch1
这两者都是参数
2.2urlencode和urldecode
我们在使用百度搜索时,我们输入汉字进行搜索时,对应的网页的网址上会出现一串奇怪的字符
这里的"+" 被转义成了 “%2B”
像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现.
比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.
转义的规则如下:
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY
我们可以在百度上进行搜索urlencode编码转换,便可以自行转换
3.http传输格式
3.1http请求
对于每一个协议,我们都会产生两个问题
第一,该协议是如何分离报头和有效载荷的?
第二,该协议如何寻找到需要向上传输的某一个协议?
在http的请求里,是以行为单位的,进行消息内容的陈列,除了第一行,默认每行都是name:value的样式
http请求格式
首行: [方法] + [url] + [版本]
Header: 请求的属性, 冒号分割的键值对
;每组属性之间使用\n分隔;遇到空行表示Header部分结束
Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个
Content-Length属性来标识Body的长度
上述的每个都以行为单位,都会有一个换行字符
我们把请求格式分为四部分
分为请求行(请求方法,请求URL,http版本),请求报头(到空行为止),空行,请求正文
此时,我们可以发现该协议是通过空行,把报头和有效载荷分解,来表明http请求报头的结束
3.2http响应
http响应格式
首行: [版本号] + [状态码] + [状态码解释]
Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个
Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在
body中.
http的响应也和请求类似,这里的状态码就是我们经常可以看到404这种报错
对于http协议来说,服务器获得客户端的请求,能够得知客户端的各种信息。因为每一个会使用各种版本的http请求协议,会存在新老版本共存的情况,当双方进行交互可以互相通信版本,你是什么版本,我就传给你在当前版本下能看到的特定的服务(这就是双方交换版本的意义)
4.http请求方法
4.1GET方法
这里我们可以使用第三方软件(Fiddler)对网页进行抓包,来对GET和POST请求来进行观察
特点:
登录页面,输入账户和密码时,我们可以直接再网址上发现账户和密码都被打印了出来,即直接显示在了各种参数的位置
4.2POST方法
特点:
这里和GET方法不一样的地方,我们在网址上并不能看见账户和密码信息,可能会有同学在想,那这样我是不是就安全了呢?感兴趣的同学可以直接使用Fiddler自己实验一下
我们会发现账户信息和密码出现在了正文范围内,而我们使用抓包工具时,照样可以获取正文
结论:GET和POST方法都是不安全的,因为他们都没有经过加密处理
5.http的状态码
1XX:信息性状态码,接受的请求正在处理
会返回一个对当前正在处理的请求的信息
2XX:成功状态码,请求正常处理完毕
该类表明请求正常
3XX:重定向状态码,需要进行附加操作以完成请求
重定向分为临时重定向和永久重定向
永久重定向:http的状态码是301,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,你输入www.jingdong.com的时候,会被重定向到www.jd.com,因为jingdong.com这个网址已经被废弃了,被改成jd.com,所以这种情况下应该用永久重定向。
临时重定向:http的状态码是302,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。
字面理解的话就是一个是暂时的,一个是永久的
4XX:客户端错误状态码,服务器无法处理请求
客户端有误,所以无法获取信息,最常见的就是404
5XX:服务器错误状态码,服务器处理请求出错
最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)
6.http常见的Header(报头内容)
Content-Type: 数据类型(text/html等)
Content-Length: Body的长度
Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
User-Agent: 声明用户的操作系统和浏览器版本信息;
referer: 当前页面是从哪个页面跳转过来的;
location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
7.cookie文件
这里我们就可以回答上面的http无状态的疑问了
首先我们为了让http有记忆性,程序员添加了一些其他功能,我们可以叫他http的会话能力(添加了cookie和session)
我们在登陆时,输入账号和密码后,点击了保存密码,此时用户的账号和密码都存入cookie文件中,以后的浏览器每次发起请求的时候,http请求都会自动给你携带你曾经写到临时文件中的内容(cookie),发送给服务器端
浏览器使用cookie的时候
1.每一个http request都会携带cookie的信息,发送给服务器!服务器也要有cookie技术(其中认证的环节,不一定是http自己完成的,程序员完成的),这里我们可以同样表明了http是无状态的
2.cookie“文件”:有些浏览器配置的时候,cookie有内存级,也有文件级别的(内存级:我们打开浏览器,打开网页行账号和密码输入后,再重新打开该网页,不用登录,但是关掉浏览器后,仍然需要重新输入账号和密码。文件级:不同的是,关掉浏览器后,重新打开该网页,此时我们不需要重新登录,我们把cookie写入进了一个“cookie”文件中进行保存)
但是!!!cookie里面保存的是用户的私密信息,假如我们被人盗取了所以的cookie信息,此时别人可以登录我们的账号来进行各种操作
8.session文件
所以我们产生了一个session文件
我们在网页输入了账号和用户后,此时服务器端获取到这些信息,然后对其进行认证,认证成功后,在服务端形成一个session文件,里面保存了用户所以的私密信息,该文件的文件名是具有唯一性的!!!,此时服务器会返回给浏览器一个sessionid的东西。
从此,我们在进行网络传送时,每一个http request都会携带sessionid的信息,发送给服务器,服务器会对sessionid进行认证和对比,此时我们成功的保证了信息的安全(毕竟在服务器端的信息更安全吧)
https链接: 关于https详细讲解的好文哦!.
感兴趣的小伙伴可以看一下哦,求赞赞!!