Linux----网络应用层
Posted 4nc414g0n
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux----网络应用层相关的知识,希望对你有一定的参考价值。
网络应用层
引入
协议是一种 “约定”. socket api的接口, 在读写数据时, 都是按 “字符串” 的方式来发送接收的. 那么如何传输一些"结构化的数据" 呢?
例如
:结构化的数据转为string可以用jsoncpp,XML等等(方便传输不出错
)
自定义协议
:双方约定好一种结构化的数据
应用层协议
:只要保证, 一端发送时构造的数据, 在另一端能够正确的进行解析, 就是可以的. 这种约定, 就是 应用层协议
1)HTTP协议
早期程序员定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一
对于http协议
:大部分应用层协议(高频的)都不用自己写,少数需要自己写
http协议
:是一个应用层协议,底层是tcp协议! http要 用tcp来完成数据通信的能力(socket编程)
URL
结构
urlencode urldecode
/
?
:
等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现,某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.
转义的规则
: 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
HTTP协议格式
简易的http服务器:
部分代码如下:static void* Handler(void* args)//类中创建线程要static pthread_detach(pthread_self()); int sock = *(int*)args;//先强转为int*再解引用 delete (int*)args;//??为什么要强转 char buffer[4096]; ssize_t s=recv(sock, buffer, sizeof(buffer), MSG_WAITALL); if(s>0) cout<<buffer<<endl; close(sock); return nullptr;
可以注意到
:都是以行为单位,进行消息内容的陈列其中除了 第一行,默认每行都是name: value 的样式,并且结尾有空行
http请求格式
每层协议都要解决两个问题:
- 将报头和有效载荷分离
- 将自己的有效载荷交付给上层协议
空行
作为一个特殊符号,来表明http请求报头的结束
请求方法:
请求方法 说明 HTTP协议版本 GET 获取资源 1.0、1.1 POST 传输实体主体 1.0、1.1 PUT 传输文件 1.0、1.1 HEAD 获得报文首部 1.0、1.1 DELETE 删除文件 1.0、1.1 OPTIONS 询问支持的方法 1.1 TRACE 追踪路径 1.1 CONNECT 要求用隧道协议连接代理 1.1 LINK 建立和资源之间的联系 1.0 UNLINE 断开连接关系 1.0
常见报头:
- Content-Type: 数据类型(text/html等)
- Content-Length: Body的长度
- Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
- User-Agent: 声明用户的操作系统和浏览器版本信息;
- referer: 当前页面是从哪个页面跳转过来的;
- location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
- Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
http响应格式
格式和请求相似
常见状态码
:200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)
类别 原因短语 1XX Informational (信息性状态码) 接收的请求正在处理 2XX Success (成功状态码) 请求正常处理完毕 3XX Redirection (重定向状态码) 需要进行附加操作以完成请求 4XX Client Error (客户端错误状态码) 服务器无法处理请求 5XX Server Error (服务器错误状态码) 服务器处理请求出错
可以将请求和响应均看作一个包含诸多\\n的长字符串
返回响应内容:std::ifstream in("./index.html", std::ios::in | std::ios::binary); if(!in.is_open()) else//成功 std::string line; while(std::getline(in, line)) body+=line; response = "HTTP/1.0"; response += " 200 OK\\n"; response += "Content-Type: text/html\\n"; response += ("Content-Length: " + std::to_string(body.size()) + "\\n"); response += "\\n"; //空行,用来区分我们的报头和有效载荷 response += body; in.close();
cookie/session
cookie
http性质:
- http本身是无连接的(底层基于TCP协议,http要发起http request时,不会在http层建立连接)
- http本身时无状态的(不会记录自己发起http请求的上下文,不会对历史请求有任何记忆能力)
- http发起连接有基于长连接也有基于短连接
为了让http具有保存状态的能力和会话能力,有了cookie和session
cookie可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话
将你保存的账号密码等私密信息保存在浏览器的默认文件中(cookie),浏览器每次发送请求时 http都会自动为你携带曾经写到临时文件中的内容发送给服务器
当浏览器使用cookie时:
- 每个http request都会携带cookie的信息,发送给服务器(需要服务器支持cookie技术,cookie技术不是http完成的,而是程序员完成)
- cookie文件在浏览器配置的时候有
内存级cookie
(重启后丢失),和文件级cookie
(重启后仍然在)
cookie风险:
- cookie可以泄漏个人私密信息(明文密码…)
- 使用你的cookie可以直接用你的身份向server发起请求
cookie+session
使用cookie+session来维持会话:
session存储在serer端,文件名具有唯一性,
session与cookie的:
(摘自:https://blog.csdn.net/DUANJIAWEIDUANJIAWEI/article/details/118608668)
1、cookie和session都是服务端生成的,只是cookie存放在客户端,session存放在服务端
2、cookie是不安全的,黑客可以通过抓包获取用户信息,session是安全的因为存放在服务器
3、session因为存放在服务端,当session数量比较多时会占用一定的内存空间造成服务器性能低
4、单个cookie的大小是4k, 很多浏览器限制一个站点最多保存20个cookie,而session保存在服务端没有大小限制
5、cookie和session都会有时间限制,即都会过期
6、session的使用依赖cookie,会把JSESSIONID保存在cookie里面
http与https
http的GET和POST请求均不安全:
POST方法通常用来提交参数,参数会以http请求的正文方式进行提交
GET 比较 POST
- POST提交更具有私密性
- GET和POST方法 都不安全,因为默认都没有加密
- .提交的数据可以很大
- Get通常 用来进行获取网页等资源,不过也可以提交参数:百度搜索
- . POST通常 用来提交数据
以上是关于Linux----网络应用层的主要内容,如果未能解决你的问题,请参考以下文章
技研MF-SWIFT和FTire轮胎模型在耐久载荷分析中的应用