标题
在这里建议初学者先学习传输层、网络层和数据链路层的协议后,再回头看应用层的http协议,否则一些知识点无法理解
概述
协议是数据格式约定
应用层:负责程序之间的数据沟通
应用层协议是面向程序员的协议,所以应用程序之间的沟通是由程序员自己定义的
自定制协议:程序员自己定义的程序沟通的数据格式的约定
序列化:在网络传输或者数据的持久化存储时,将多个数据对象按照指定格式组织成为一个二进制数据串输或者持久化过程(持久化:对数据组织起来并存储)
反序列化:对二进制数据串,按照指定格式进行解析操作,得到各个数据对象的过程
程序员设计自定制协议要考虑的因素
- 传输性能,传输数据尽可能快和短小
- 解析性能
- 调试便捷性
json序列化,protobuf序列化
HTTP的优点
- 基于明文传输,直接就能看得懂
- 是简单的请求-相应协议
不过多维护连接
客户端请求什么,服务端就发送,一次连接结束
协议特性:
1.无连接 :http协议在发送http数据时,本身不需要和服务端建立连接;
- http采用tcp作为传输层协议,保证了数据的可靠传输,http不必考虑数据在传输过程中丢失后又怎样重传;
- 但是http本身是无连接的,也就是说:虽然http使用了tcp连接,但通信双方在交换http报文前不需要先建立http连接
2.无状态:同一客户第二次访问同一个服务器的页面时,服务器的响应与第一次访问时相同,服务器不记得谁访问过它,访问了多少次
- http协议本身对请求和响应不做保存,现在双方的状态是服务端实现的机制(该机制就是会话机制)
- http协议本身在设计之初,只负责http客户端向服务端发送一个请求,服务端只负责处理请求,然后将响应反馈给客户端;
- 现在不满足只处理客户端请求,还会保存客户端信息
- 该特性简化了服务器设计,使服务器更容易支持大量并发的http请求
http协议格式
了解协议中每一个字段的功能
请求格式,分为四部分
- 请求行:请求中的第一行,主要对请求进行关键性描述,请求哪个网页或者功能
- 请求头部:以(:和空格)间隔,是对请求和正文的描述(比如正文有多长)
- 空行:间隔头部与正文
- 正文:提交给服务器的数据
请求行(请求方法,URL,协议版本)
对请求的具体描述
内容分为三部分,以\r\n作为结尾(请求行刚好是一行数据)
GET结合了POST和HEAD
第一部分:请求方法有多种,描述不同的请求目的
- GET:向服务器请求一个网页实体资源(获取数据,不需要正文)
GET没有正文,提交数据(数据在URL中),提交的数据实际长度会有限制,并且不安全- POST:向服务器提交数据(数据在正文中),实现某个功能
- HEAD:与GET类似,响应时不需要实体资源,只要头部
- PUT:更新服务器资源
- DELETE:删除服务器上的资源
第二部分:URL–统一资源定位符(定位网络上某一台主机上的某个资源,以及如何请求资源)
格式:
http:协议名称
//:间隔符
www.baidu.com:域名
IP地址也可以访问,但是很难记忆,因此大佬设计了域名系统,使用字符串作为域名,上网时候进行域名解析获得IP地址80:浏览网页并没有看到端口,这是因为HTTP服务默认使用80端口,浏览器自己加上了
/s:资源路径,以/开始,明确描述要请求的资源路径名(哪一台服务器的哪一资源)
/表示请求根目录,实际只是服务器上的相对子目录,让客户端只能访问当前目录下的文件
比如/index.html就是访问一个前端页面wd=C%2B%2B&ecode=utf-8:
查询字符串,get请求提交给服务器的数据,学名叫查询字符串每一个特殊字符有特殊的含义,但是提交数据的时候也有这些特殊字符,所以标准文档规定,查询字符串中的特殊字符需要进行编码(URL编码),转码后用%标识
?:用来间隔查询路径和查询字符串
@:间隔域名和密码片段标识符,标识了网页中一个标签id,让网页直接跳转到对应位置
第三部分:协议版本
灰色部分是给服务器的数据
灰色下面是请求头部
wd后面是搜索的数据
请求头部(只在请求中出现的头部字段)
是附加描述和正文描述
由键值对组成,key:val\r\nkey:val\r\n
- Host:描述请求的服务器地址或者域名
- Connection:属于通用头部字段
keep-alive(长连接)/close(短连接)
用于描述当前连接使用的是长连接还是短连接- Content len:正文长度(只要有正文就得有,描述,不然解析有问题 ),确定有多少正文
- Content-Type:描述正文的数据类型(是浏览器界面,还是二进制流下载文件),决定对端如何解析处理正文
- Sec-CH-UA:提供用户代理的头部
代理服务器- Referer:来源页面信息
- Accept:告诉服务器,客户端可以处理什么样类型的资源
GET/index.html,需要一个实体资源,这个资源是实际存在的文件
POST/login,登录请求
空行
间隔头部和正文
正文
要传输的数据,长度就是上面的content len
响应格式
分为四部分:响应行,响应头部,空行,正文
响应行
协议版本 状态码 状态码描述\r\n
HTTP/1.1 200 OK\r\n
状态码:用于明确直接向客户端标识本次请求的处理结果
- 继续请求或者协议切换
101协议切换 - - -http无法长时间通信,设计了一种websocket(长连接,服务器可主动发消息),协议变量,响应的数据格式也会变- 请求已经处理成功
200成功处理
206部分处理成功 - - - 客户端请求一个部分内容,服务器处理成功- 请求进行了重定向
请求的资源移动到别的位置(服务端资源的路径改变了,但是依然想报错原链接有效)
301永久重定向 - - - 请求资源时,url重定向到新的位置,后续请求就得去新连接那块请求
302临时重定向 - - - 资源只是临时请求,后续请求还得去原连接
303登录成功,返回给客户端一个链接,让客户端访问这个新链接
304刚下载的文件,过一会重新下载,两个文件一样就没有必要下载,不一样就重新下次,客户端就会发送请求(附带上传请求的数据),服务器发现文件没有修改会返回304告诉客户端文件没有被修改- 客户端请求有错误
400请求格式有问题
404请求的资源不存在- 服务器错误
500服务器内部出错(有正向代理和反向代理)
502bad gatway代理服务器请求服务器没有连接上
504gatway连接上等待超时了
状态码描述:没有实际意义,给程序员看的状态码描述信息
响应头部
connection
Location与重定向搭配,返回给客户端的新地址
空行
正文
提供给客户端的数据
头部字段中的Cookie(请求头)&Set-Cookie(响应头)
- cookie(信息缓存机制)是服务器让客户端保存一些数据,
- 希望客户端下一次请求服务器时,携带这些特定数据
- 通过setcookie字段将数据交给客户端,客户端将数据保存在本地,下次请求服务器时发送给服务器
- 用于http通信状态维护功能
http是一个请求响应协议,因为连接不是持续的,导致每次买东西都要重新建立连接进行登录
因此需要不管连接是不是原来的,但是都要能区分出用户,提出了cookie方案
- 例子:第一次登录时,将用户名和密码发送,服务端响应内容有set-cookie(哪些信息需要保存起来,下次请请求带上)将用户名和密码登录成功状态发送给客户端
- 客户端将这些信息保存,在有新连接时会获取这些信息(每次通信客户端都会发送cookie)
session机制
将本次通信建立会话,将会话重要内容保存在服务器上,通过cookie传递session_id就行
优点:这个id不是敏感信息,不怕被劫持泄露密码等
缺陷,每个客户端都得保存信息,数据量庞大
token机制
防止修改cookie中的内容
通过密钥和setcookie中的数据计算出一个签名,将签名和数据放入客户端的cookie中,下次客户端在发送请求时,服务端计算出此时的签名和原本的签名进行对比是否相等
http的请求方法
GET与POST方法对比:
- POST方法比GET方法更私密;
- 不能说POST方法更加安全;
- 不论GET方法在url中提交数据,还是POST方法在请求正文中提交数据,都是明文传输
请求/响应的常见字段
- Content-Type: 数据类型(text/html等)
- Content-Length: Body的长度
- Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
- User-Agent: 声明用户的操作系统和浏览器版本信息;
- referer: 当前页面是从哪个页面跳转过来的;
- location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
- Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
HTTPS
使用443端口
HTTPS是经过ssl加密的协议
为什么加密
加密流程:
- 身份验证,通信前双方将权威机构的身份验证证书交给对方
- 数据加密
通信双方进行传输加密,需要进行密钥协商
- 对称加密:数据的加密和解密使用的是相同的密钥
密钥协商的时候容易被劫持
加解密效率高,但是不安全- 非对称加密:加解密的密钥不一样
通过指定算法生成一堆密钥
公钥对数据加密,私钥解密- 混合加密,客户端对
生成一对密钥,通信前将公钥发送给对方