应用层和HTTP协议
基础概念
序列化:将数据持久化存储或网络数据传输格式进行排布
反序列化:对数据一指定协议进行解析
课外调研序列化的几种方式:
协议:约定
知名协议和自定制协议
HTTP协议
URL:统一资源定位符
协议名称://用户名:密码@服务器地址:服务器端口/资源路径?查询字符串#片段标识符
[外链图片转存失败(img-IpvewHmb-1564324022641)(D:\MyBlog\source\images\url格式图.png)]
URL编码/解码
像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现. 比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.
转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY 格式
课后调研实现urlencode/urldecode
HTPP协议格式
HTTP的三大部分:首行,头部,正文
请求消息格式
[外链图片转存失败(img-x1VmLx3m-1564324022643)(D:\MyBlog\source\images\http协议格式.webp)]
首行:请求首行,相应首行
请求首行:请求方法(GET/POST/HEAD/PUT/DELETE) HTTP协议版本(0.9/1.0/1.1/2)
头部:一 请求的属性, 冒号分割的键值对;每组属性之间使用\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
安全性较高;但是通过抓包工具,还是可以看到请求参数的
正文:
空行后面的内容都是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中类别:
1.1xx: 指示信息–表示请求已接收,继续处理
2.2xx: 成功–表示请求已被成功接收、理解、接受
3.3xx: 重定向–要完成请求必须进行更进一步的操作
4.4xx: 客户端错误–请求有语法错误或请求无法实现
5.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
请求的过程:
- 在浏览器中输入
URL
,并按下回车键 - 浏览器向
DNS
服务器请求解析该URL
中的域名对应的IP
地址(如果是IP
请求,则不需要该步骤) - 解析出
IP
后,根据IP
和端口号,和服务器建立TCP连接 - 浏览器向服务器发送请求,该请求报文作为
TCP
三次握手的第三个报文发送给服务器 - 服务器做出响应,把数据发送给浏览器
- 通信完成,断开
TCP
连接 - 浏览器解析收到的数据并显示
HTTP和HTTPS的区别
HTTPS
是安全的HTTP
通道,即在HTTP通信中加入了SSL
层(当前版本是TLS1.2
),通信的数据被加密了,防止被窃取,具体的通信流程如下:
[外链图片转存失败(img-sc5keJ9j-1564324022644)(D:\MyBlog\source\images\HTTPS.png)]
HTTPS使用的加密方式结合了对称加密和不对称加密的特点,在保证安全的情况下,又提高了传输效率。HTTP和HTTPS的区别如下:
1.https协议需要到ca申请证书,一般免费证书很少,需要交费。
2.http的信息是明文传输,https 则是具有安全性的ssl加密传输协议。
3.http和https用的端口不一样,前者是80,后者是443。
4.http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全
。
2.http的信息是明文传输,https 则是具有安全性的ssl加密传输协议。
3.http和https用的端口不一样,前者是80,后者是443。
4.http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全