Http应用层协议

HTTP协议

URL:统一资源定位符

协议名称://用户名:密码@服务器地址:服务器端口/资源路径?查询字符串#片段标识符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MbM0jWoX-1581666793804)(D:\MyBlog\source\images\url格式图.png)]

URL编码/解码

查询字符串:urlencode/urldecode,因为HTTP中参数出以<key,val>组成键值对,以&连接像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现. 比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.
转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY 格式

课后调研实现urlencode/urldecode

HTPP协议格式

HTTP的三大部分:首行,头部,正文
请求消息格式

在这里插入图片描述

首行:请求首行,响应首行
请求首行:请求方法(GET/POST/HEAD/PUT/DELETE) HTTP协议版本(0.9/1.0/1.1/2.0)
头部:一 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束

key: val\r\n key: val\r\n

**常见的请求方法 **

  • GET方法:请求指定的页面信息,并返回实体主体

  • POST方法:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。

  • PUT:从客户端向服务器传送的数据取代指定的文档的内容 哦

GET/POST区别:get无正文 post有正文

1.请求参数的区别

GET请求会把请求的参数拼接在URL后面,以?分隔,多个参数之间用&连接;如果是英文或数字,原样发送,如果是空格或中文,则用Base64编码

POST请求会把提交的数据放在请求体中,不会在URL中显示出来

2.传输数据的大小

GET`: 浏览器和服务器会限制`URL`的长度,所以传输的数据有限,一般是2K

POST: 由于数据不是通过URL传递,所以一般可以传输较大量的数据

3.数据解析

GET: 通过Request.QueryString获取变量的值

POST: 通过Request.form获取变量的值

4.安全性

GET: 请求参数在URL后面,可以直接看到,尤其是登录时,如果登录界面被浏览器缓存,其他人就可以通过查看历史记录,拿到账户和密码

POST: 请求参数在请求体里面传输,无法直接拿到,相对GET安全性较高;但是通过抓包工具,还是可以看到请求参数的

HTTP 0.9/1.0/1.1/2.0区别

HTTP 0.9 :

  • 只接受GET一种请求方法,没有在通信中指定版本号,且不支持请求头;
  • 此外该版本也不支持POST方法,因此客户端无法向服务器传递太多信息;
  • 短连接

HTTP 1.0:

  • 支持POST、GET、HEAD三种方法;
  • 规定浏览器与服务器之间只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求;

HTTP 1.1:

  • 新增了五种请求方法:PUT、DELETE、CONNECT、TRACE、OPTIONS;

  • HTTP 1.1 在Request消息头里头多了一个Host域,便于一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点;

  • 在HTTP/1.1中新增了24个状态响应码:
    100-199 用于指定客户端应相应的某些动作。
    200-299 用于表示请求成功。
    300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
    400-499 用于指出客户端的错误。
    500-599 用于支持服务器错误。

HTTP2.0:

  • HTTP2.0使用多路复用技术(Multiplexing),多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。“HTTP1.1在同一时间对于同一个域名的请求数量有限制,超过限制就会阻塞请求”。多路复用底层采用"增加二进制分帧层"的方法,使得不改变原来的语义、首部字段的情况下提高传输性能,降低延迟。二进制分帧将所有传输信息分割为更小的帧,用二进制进行编码,多个请求都在同一个TCP连接上完成,可以承载任意数量的双向数据流。HTTP/2更有效的使用TCP连接,得到性能上的提升

    详解:

    http和https的区别

正文:

空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个

Content-Length属性来标识Body的长度;

响应消息格式

响应首行: [版本号] + [状态码] + [状态码解释]

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

Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个

Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在 body中。

常见响应头

Content-Type: 数据类型(text/html等)

Content-Length: Body的长度

Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;

User-Agent: 声明用户的操作系统和浏览器版本信息;

referer: 当前页面是从哪个页面跳转过来的;

location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;

Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;

状态码

HTTP协议的状态码由3位数字组成,第一个数字定义了响应的类别,共有5中类别:

  • 1xx: 指示信息–表示请求已接收,继续处理
  • 2xx: 成功–表示请求已被成功接收、理解、接受
  • 3xx: 重定向–要完成请求必须进行更进一步的操作
  • 4xx: 客户端错误–请求有语法错误或请求无法实现
  • 5xx: 服务器端错误–服务器未能实现合法的请求

常见状态码:

200 OK                        //客户端请求成功
400 Bad Request               //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden                 //服务器收到请求,但是拒绝提供服务
404 Not Found                 //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error     //服务器发生不可预期的错误
503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

工作原理

HTTP协议采用请求/响应模式,客户端向服务器发送一个请求报文,然后服务器响应请求。下面介绍一下一次HTTP请求的过程:

  1. 在浏览器中输入URL,并按下回车键
  2. 浏览器向DNS服务器请求解析该URL中的域名对应的IP地址(如果是IP请求,则不需要该步骤)
  3. 解析出IP后,根据IP和端口号,和服务器建立TCP连接
  4. 浏览器向服务器发送请求,该请求报文作为TCP三次握手的第三个报文发送给服务器
  5. 服务器做出响应,把数据发送给浏览器
  6. 通信完成,断开TCP连接
  7. 浏览器解析收到的数据并显示

HTTP和HTTPS的区别

HTTPS是安全的HTTP通道,即在HTTP通信中加入了SSL层(当前版本是TLS1.2),通信的数据被加密了,防止被窃取,具体的通信流程如下:

在这里插入图片描述

HTTPS使用的加密方式结合了对称加密和不对称加密的特点,在保证安全的情况下,又提高了传输效率。HTTP和HTTPS的区别如下:

1.https协议需要到ca申请证书,一般免费证书很少,需要交费。

2.http的信息是明文传输,https 则是具有安全性的ssl加密传输协议。

3.http和https用的端口不一样,前者是80,后者是443。

4.http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全

https通信流程

HTTPS在传输的过程中会涉及到三个密钥:

服务器端的公钥和私钥,用来进行非对称加密

客户端生成的随机密钥,用来进行对称加密

一个HTTPS请求实际上包含了两次HTTP传输,可以细分为8步。
1.客户端向服务器发起HTTPS请求,连接到服务器的443端口

2.服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人。

3.服务器将自己的公钥发送给客户端。

4.客户端收到服务器端的公钥之后,会对公钥进行检查,验证其合法性,如果发现发现公钥有问题,那么HTTPS传输就无法继续。严格的说,这里应该是验证服务器发送的数字证书的合法性,关于客户端如何验证数字证书的合法性,下文会进行说明。如果公钥合格,那么客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,我们将该密钥称之为client key,即客户端密钥,这样在概念上和服务器端的密钥容易进行区分。然后用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了,至此,HTTPS中的第一次HTTP请求结束。

5.客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。

6.服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。

7.然后服务器将加密后的密文发送给客户端。

8.客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值