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请求格式

每层协议都要解决两个问题:

  1. 将报头和有效载荷分离
  2. 将自己的有效载荷交付给上层协议


空行作为一个特殊符号,来表明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)

类别原因短语
1XXInformational (信息性状态码)接收的请求正在处理
2XXSuccess (成功状态码)请求正常处理完毕
3XXRedirection (重定向状态码)需要进行附加操作以完成请求
4XXClient Error (客户端错误状态码)服务器无法处理请求
5XXServer 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性质:

  1. http本身是无连接的(底层基于TCP协议,http要发起http request时,不会在http层建立连接)
  2. http本身时无状态的(不会记录自己发起http请求的上下文,不会对历史请求有任何记忆能力)
  3. http发起连接有基于长连接也有基于短连接

为了让http具有保存状态的能力和会话能力,有了cookie和session
cookie可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话

将你保存的账号密码等私密信息保存在浏览器的默认文件中(cookie),浏览器每次发送请求时 http都会自动为你携带曾经写到临时文件中的内容发送给服务器
当浏览器使用cookie时:

  1. 每个http request都会携带cookie的信息,发送给服务器(需要服务器支持cookie技术,cookie技术不是http完成的,而是程序员完成)
  2. cookie文件在浏览器配置的时候有内存级cookie(重启后丢失),和文件级cookie(重启后仍然在)

cookie风险:

  1. cookie可以泄漏个人私密信息(明文密码…)
  2. 使用你的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

  1. POST提交更具有私密性
  2. GET和POST方法 都不安全,因为默认都没有加密
  3. .提交的数据可以很大
  4. Get通常 用来进行获取网页等资源,不过也可以提交参数:百度搜索
  5. . POST通常 用来提交数据

以上是关于Linux----网络应用层的主要内容,如果未能解决你的问题,请参考以下文章

20155232《网络对抗》Exp5 MSF基础应用

技研MF-SWIFT和FTire轮胎模型在耐久载荷分析中的应用

2018-2019-2 20165332《网络攻防技术》Exp5 MSF基础应用

PwnAuth——一个可以揭露OAuth滥用的利器

Linux网络编程 -ip

Linux网络编程 -ip