子定制协议解决tcp粘包问题
1.定长包头+数据(有效载荷)+分隔符
2.定长包头当中可以获得当前有效数据长度,分隔符可以找到下一条数据的起始位置(下条数据的包头)
3.分隔符不一定是一个字节的字符,可以是一个字符串,通常为\r\n
4.分隔符起到了一个定义数据边界的作用
结构传输
序列化:将对象转化为字节序列的过程
send(sockfd, Data, sizeof(Data));
反序列化:将字节序列转化为对象的过程
read(sockfd, buf, sizeof(Data)-1);
HTTP协议:超文本传输协议
URL:http://user:passwd@www.baidu.com:80/dir/index.thm?id=2&yk=C%2B%2B#ch1
1.http:// : 协议方案名
2.用户名和密码
3.域名(服务器的ip地址)
4.服务端侦听端口
5.带层次的文件路径:浏览器要请求的资源路径 '/'是http服务器定义逻辑上的根目录
6.查询字符串:浏览器给服务器提交的数据
6.1提交单个数据是按照key=value形式,多个数据中间用&进行分割
6.2在提交数据时如果不加以区分,可能造成分歧,在传输特殊字符时需要url编码(urlencode),编码方式采用16进制,
为了区分编码后的字符需要在前面加上%
6.3对于服务器,收到url编码之后进行字符串查找,需要进行url解码(urldecode)
7.片段标识符:表示当前页面被浏览器加载之后,定位到什么位置了。
http协议格式:
请求
请求首行
请求方法url协议版本\r\n
请求头部
每行数据key:value形式,用\r\n分隔
Content-Length:正文长度,防止粘包
Content-Type:正文编码格式
text/html:HTML格式 application.json:json数据格式
text/plain:纯文本格式 application/msword:word格式
text/png:png图片格式
referer:当前的页面从那个页面跳转过来
Cookie:向服务器提交浏览器本地保存的认证信息
Tranfer-Encoding:针对与正文,可以支持分块传输
Lacation:和重定向搭配使用
\r\n
正文
响应
相应首行
协议版本 状态码 状态解释\r\n
状态码:
1xx:结束请求正在处理
2xx:请求处理完毕
3xx:重定向状态, 表示浏览器需要进行附加操作,才能完成刚才的请求操作302:临时重定向
4xx:服务器无法处理这个请求 404:Page Not Found
5xx:服务器处理请求出错了 502 Bad Gateway
响应头部
响应头部
\r\n
正文
请求方法
GET:从服务器上面获取一个资源的方法
1.GET并不是只能向服务器获取资源,其实也可以在查询字符串提交数据到浏览器
2.GET请求数据都是在url当中
POST:向服务器提交数据的方法
1.POST提交数据是在正文当中
POST方法比GET方法更加私密
1.http协议是应用层协议,在传输层使用TCP协议,在网络层使用ip协议
2.http本身是为了处理大量请求,设计在传输层使用tcp短链接
3.目前http已经支持了长连接
4.http是没有加密版本的http协议,加密版本可以使用https