HTTP协议详解

HTTP协议详解

1、HTTP协议

HTTP:超文本传输协议,用以在网络上传输包括文本、图片等超文本数据的协议和规范。是我们最常使用的最常接触的协议之一,在我们浏览网站,学习Web开发的时候,总会使用到这个协议。

2、HTTP和HTTPS

HTTP使用的协议是明文传输,很容易被黑客或者恶意窃取数据,HTTPS则比HTTP多出了SSL,用以进行传输加密和身份认证,保证了传输数据的安全性,我们可以这么理解,HTTPS=HTTP+SSL。

HTTP使用的默认端口是80,HTTPS默认端口是443

3、HTTP协议的调用过程

这里假设请求,http://www.mybaby.cn/pigpig/baby.index

HTTP协议详解_第1张图片

4、HTTP报文解析

在上面第三点我们解析了HTTP协议的请求过程,接下来我们对其中出现的报文的一些数据进行解析

HTTP协议报文主要由三大部分组成:主要是

  1. 起始行(start line):描述请求或响应的基本信息
  2. 头部信息(header):使用key-value形式更详细的说明报文
  3. 消息正文(entity):实际传输的数据

在我们通常的开发中,start line 和header统称为header,我们常见的token用户认证就是在这里实现的。

4.1、HTTP请求方法

HTTP请求方法总共有八种,分别是:

方法 说明
GET 获取资源
POST 传输实体主题
DELETE 删除文件
PUT 传输文件
HEAD 获得报文头部
OPTIONS 询问支持的方法
TRACE 追踪路径
CONNECT 要求用隧道协议连接代理
LINK 建立和资源之间的联系
UNLINK 断开连接关系

这里我们最常使用到的是GET和POST方法,一般来说,GET和POST都可以请求到资源,但是它们之间是有区别的,如下表:

GET poST
url可见性 参数可见 参数不可见
数据传输 通过拼接url进行传递参数 通过body体传输参数
缓存性 可以进行缓存 不可以进行缓存
后退页面反应 后退页面时不产生影响 后退页面重新请求资源
传输数据 大小在2K-4K 根据php.ini文件设定,可以无限大
安全性 安全性略低 安全性略高
数据包 产生一个数据包,HTTP会把header和data一起发送,服务器响应200 产生2个数据包,HTTP先发送header响应100continue,浏览器在发送data,服务器响应200(这里有一个特例,火狐只发送一次)
4.2、响应状态码解析

2xx开头:响应成功

3xx开头:表示需要进行附加操作用以完成请求

4xx开头:客户端错误

5xx开头:服务端错误

状态码 描述
200 请求成功
204 请求成功,但是没有资源可以返回
206 对资源莫一部分进行响应,由Content-Range指定范围的实习内容
301 永久性重定向,表示请求的资源已经重新分配URI,以后应该使用资源现有的URI
302 临时性重定向,表示请求的资源已重新分配URI,希望本次使用新的URI
303 表示由于请求对应的资源存在另一个URI,应使用GET方法定向获取请求的资源
304 表示客户端发送附带条件的请求时,服务端允许请求访问资源,但未满足条件的情况
307 临时重定向,与302相同
400 表示请求报文中存在语法错误
401 表示发送的请求需要HTTP认证的认证信息
403 表示请求访问资源被服务器拒绝了
404 表示服务器上无法找到请求的资源
500 表示服务器端在执行请求时发生错误
503 表示服务器暂时处于超负载或者正在停机维护,无法处理请求

5、Cookie、Session、Token的区别

这里简单给出定义,后续文章会给出更多的详细实现

Session是什么:在互联网Web初步兴起的时候,浏览器的作用仅仅只是文档浏览等,但随着各类购物,系统的出现,用户越来越多。但是计算机网络的http协议是无状态的,无法记录用户信息,此时就出现了SessionID。服务器给每一个用户发送一个特定的SessionID,用户在请求时将SessionID带上,这样就可以用来区分用户了。

Cookie是什么:Cookie是浏览器实现的用于保存用户数据的功能,我的理解是如同谷歌等浏览器保存我们进入某个网站的密码等,同时浏览器提供了功能为我们的Cookie数据进行了加密,保证不会泄露。

在之前的开发中,使用的都是Cookie+Session的认证方式,即用户初次登录时,在服务器端生成SessionID,并且将其返回给客户端,客户端的浏览器将其保存到Cookie中,在之后的访问中将Cookie中的数据加入到Http请求头中发送给服务器端验证,服务器端将发送来的认证信息和自身保存的SessionID进行比对,从而判断是否时合法的请求。

这样就造成了一些问题:

1、Cookie很容易被截获,容易遭受到跨站伪造请求攻击(CSRF)。具体可以看一下

2、服务器端需要保存每个用户的SessionID,当用户量很多时,例如几个亿或者几十个亿的用户ID,就造成了很大的内存开销。同时由于Session可能保存在不同服务器之间,在比对时就出现查找不到的问题。这是不能让用户接受的。这也造成了开发分布式服务器端的困难性,难以拓展。

随后的发展中,就诞生了Token,Token让客户端来保存数据。Token由服务器端生成并发送,但数据保存在客户端中。Token需要解码,需要使用CPU资源,即使用CPU资源换取内存资源,同时,这样子就解决了上述的跨域、难拓展的问题。

en,Token让客户端来保存数据。Token由服务器端生成并发送,但数据保存在客户端中。Token需要解码,需要使用CPU资源,即使用CPU资源换取内存资源,同时,这样子就解决了上述的跨域、难拓展的问题。

Token具体实现:客户端首次登录,服务端进行验证,并且生成Token,返回给客户端,客户端保存Token,并且每次请求中都会带上Token,服务端验证Token后则返回数据给客户端。

你可能感兴趣的:(计算机网络,Java复习日常,http,网络,https)