一.自定制协议
二.HTTP协议(超文本传输协议)
三.HTTP协议格式
四.简单的HTTP服务器
五.HTTP和HTTPS的区别以及HTTPS的优缺点
应用层:负责应用程序之间的数据沟通(指定数据格式)
一.自定制协议:使用boost库当中的切割函数split
#include <boost/algorithm/string.hpp>boost::split(type,select_list,boost::is_any_of(""),boost::token_compress_on/off)type:类型是vector<std::string>类型,保存切割完成之后的字符串select_list:待切割的字符串,可以直接传入string对象boost::is_any_of:告诉spilt函数按照什么样地字符进行切割,单个字符支持,支持字符串boost::token_compress_on/off:当是“on":对于多个连续的分割字符当成1个处理当是”off":有多少个分割字符就按照多少个分割符来处理 5 int Sum(std::string Data) 6 { 15 std::vector<std::string> output; 16 std::string split_char ="+"; 17 boost::split(output,Data,boost::is_any_of(split_char),boost::token_compress_off); 18 //int sum=atoi(output[0].c_str())+atoi(output[1].c_str());//将字符串转整型 19 int sum_number=0; 20 for(size_t i=0;i<output.size();i++) 21 { 22 sum_number+=atoi(output[i].c_str()); 23 24 } 25 return sum_number; 26 27 }存在粘包问题
解决方法:
定长包头+数据(有效载荷)+分隔符
1.双方约定数据格式(struct),单数存在多个结构体结构,服务端不知道客户端先发那哪个结构体的大小—>可以在最前面添加这个数据结构数据长度
程序从接收缓冲区当中接收数据时,需要先探测接收,对头部信息进行解析,解析到数据长度,进而真正接收的时候,就知道数据多长了–效率问题:高并发的情况
2.定义包头当中可以获取当前数据的长度,而分隔符可以找到下一条数据的起始位置(下一条数据的包头)
3.分割符的原理:定义数据边界。
分隔符不一定是一个字节的字符,可以是一个字符串,通常情况下工业都是使用rn(0D 0A)来分割
结构化传输(发送数据时将这个结构体按照一个规则转换成字符串,接收到数据的时候再按照相同的规则把字符串转化结构体)
序列化:将对象转化成字节序列的过程。
在传输数据的时候,按照数据结构对象当中变量的组织格式进行传输
send(sockfd,Data,sizeof(Data),0);
反序列化:将字节序列转化为对象的过程。
在接收数据的时候,按照数据结构对象当中变量的组织格式进行接收
struct Data d;
recv(sockfd,&d,sizeof(struct Data),0);
带层次的文件路径:资源路径,"/"并不是服务端机器的实际根目录,而是一个逻辑根目录。
查询字符串:querystr:给服务端提交的数据,提交的单个数据是key=value的形式,多个提交的数据使用&向连接在value当中会对提交的数据进行urlencode(url编码),
由于可能在value当中存在特殊字符,这些特殊字符本身就具有普遍的含义(eg:+加号的符号);编码过程就是将字符转化成为16进制的字符串来进行传输,为了告诉服务器,当前的字符串是通过转义的,在转义后的字符串前面加上%用来区分
转义的规则如下:
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
片段标识符:表示当前页面(资源)被浏览器加载之后,定位在什么位置
urldecode就是urlencode的逆过程
三.HTTP协议格式** HTTP请求请求首行rn
请求方法+url+协议版本rn
请求方法:
Get:从服务端获取数据(提交的数据在url当中,数据是由长度限制的,长度和浏览器是强相关的
Post:向服务端提交数据(提交的数据在dpdmj当中,长度是没有限制的)
「Post方法比Get方法更私密。」
协议版本 HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/1.2 版本之间的特性不一样
请求头部
具有多行数据,每行数据都是一个key:value的形式,每行数据的后面都存在rn
Content-Length:dpdmj长度,防止粘包
Content-Type:dpdmj的编码格式
text/html:HTML格式
text/plain:纯文本格式
text/png:图片格式
application/json:JSON数据格式
application/msword:word文档格式
application/pdf:pdf格式
referer:当前的页面是从哪一个页面跳转过来的
Host:客户端告知服务器,所请求的资源在哪个主机的哪个端口上
Cookie:向服务器提交浏览器本地保存的认证信息,认证信息是之前登陆服务器的时候,服务器返回回来的
Set-Cookie:告诉浏览器保存哪一些会话认证信息
Transfer-Encoding:针对dpdmj而言,支持分块传输;
Loctaion:与重定向搭配使用,服务器告诉浏览器,刚才请求的资源应该从哪一个地址上重新申请
User-Agent:声明用户的操作系统和浏览器的版本信息
Connection:keep-alive 保持长连接「http协议应用协议,传输层使用的是tcp协议,早期http是无状态的协议,使用的短连接
空行
dpdmj 数据信息(允许为空字符串)
响应首行
协议版本 状态码 状态码解释rn
状态码:
1xxx:接收到的请求正在处理
2xxx:请求处理正常完毕(200 OK)
3xxx:重定向的状态,表示浏览器还是需要进行附加操作,才能完成刚才的请求(302 临时重定向)
4xxx:服务器当前无法处理这个请求(404 Page Not Found)
5xxx:服务器出路出错了(505 Bad Getway 坏的网关)
响应头部
请求的属性,冒号分割的键值对;每组属性之间使用n分隔(遇到空行Header部分结束)
空行
dpdmj
空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中.
总结:
1.http协议是一个应用层协议,在传输层使用的是tcp协议,在网络层使用的是ip协议。
2.http本身为了处理大量的请求,设计是短连接的(发送一个数据之后接收到响应之后就将连接断开了)。
3.目前http服务已经支持长连接。
4.http是没有加密版本的http协议,加密版本可以使用https,s代表ssl:非对称加密
5.http协议是无状态协议,只负责接收到请求,返回相应的处理结果,并不会记录上一层请求的数据。
HTTP协议中哪些部分可以带有用户自定制数据?
1.URL后面的参数(键值对的方式)
2.header部分
3.body
1.HTTP协议是以明文的方式在网络中传输数据,而HTTPS协议传输的数据是经过TSL加密后的,HTTPS具有更高的安全性;
2.HTTPS在TCP三次握手阶段之后,还需要进行SSL的handshake,协商加密使用的对称加密密钥;
3.HTTPS协议需要服务端申请证书,浏览器端安装对应的根证书;
4.HTTP协议端口是80,HTTPS的协议端口是443;
HTTPS传输数据过程中使用密钥进行加密,所以安全性更高;
HTTPS协议可以认证用户和服务器,确保数据发送到正确的用户和服务器;
HTTPS握手阶段延时教高:由于进行HTTP会话之前还要进行SSL握手,因此HTTPS协议握手阶段延时增加;
HTTPS部署成本高:一方面HTTPS协议需要使用证书来验证自身的安全性,所以需要爱购买CA证书;另一方面由于采用HTTPS协议进行加解密的计算,占用CPU资源较多,需要的服务器配置或数目高