Linux网络--------http协议

news2024/11/18 21:42:39

文章目录

    • URL---网址
    • 对http协议的宏观认识
    • http协议的请求方法
    • http响应的状态码
    • 最简单的http协议服务器
    • 关于http协议的一些概念性知识

URL—网址

首先,http协议是应用层协议, 是超文本传输协议。

在这里插入图片描述
urlencode : 转码
urldecode : 解码
在这里插入图片描述
将 ++ ---- > %2B%2B就是转码的过程
%2B%2B -----> ++ 就是解码的过程

对http协议的宏观认识

我们知道:网络通信的本质是通过网络文件(fd)来盲读的
那如何保证:每次读取到的是一个完整的request , 并且读不到下一个request呢?

首先: 空行 ------> 保证读完 hander, 然后 hander中有一个Content_Length来表明正文的字节大小
如果没有正文呢? ------ > 也就没有Content_Length
在这里插入图片描述
关于相关的报头属性:
Content-Type: 数据类型(text/html等)
Content-Length: Body的长度
Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
User-Agent: 声明用户的操作系统和浏览器版本信息;
referer: 当前页面是从哪个页面跳转过来的;
location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;

http协议的请求方法

了解主要的三个就行了。
在这里插入图片描述

关于HEAD方法: 只返回报头数据(header) 不会返回body(正文)部分。 没什么好说的

关于GET 和 POST方法
1,两者最主要的区别是 : 当需要提交参数的时候(输入账号 + 密码), GET方法是将参数信息放在了URL(网址中)
而POST方法是将其放入了body(正文)
2, 参数提交的位置不同,就会导致,POST方法比较私密, 不会显示参数信息了URL输入框中
3, 另外的话, URL是有大小限制的, body(正文)是无大小限制的。

再度分析http协议,
如何处理呢? : 本质就是文本分析。
读取 首行 -------> 获得相关属性然后解析
读取 报头 -------> 获得相关属性然后解析
读取 正文--------> 获取相关属性然后解析

http响应的状态码

在这里插入图片描述

3xx状态码的特殊含义:
1, 301 永久重定向
2, 302 or 307 临时重定向

永久重定向: 当我们访问某一个网站的时候, 可能会让我们跳转到另一个网址
临时重定向: 当访问某种资源的时候, 提示登录,输入账号 + 密码 然后又跳转回来。

最简单的http协议服务器

Sock.hpp ------> 提供各种接口 : socket() , bind(), connect(), accept(),


#include <iostream>
#include <string>
#include <sys/socket.h>
#include <unistd.h>

#include <netinet/in.h> //struct sockaddr_in
#include <arpa/inet.h>

using namespace std;

class Sock
{
public:
       //创建套接字, 本质是创建网络文件
       static int Socket()
       {
           int sock = socket(AF_INET, SOCK_STREAM, 0);
           if(sock < 0)
           {
              cout << "sock error" << endl;
              exit(1);
           }

           return sock;
       }
       
       //服务端需要绑定, 客户端不需要绑定,由OS自动绑定
       static void Bind(int sock, uint16_t port)
       {
            struct sockaddr_in local;
            local.sin_family = AF_INET; //ipv4协议
            local.sin_port = htons(port);
            local.sin_addr.s_addr = INADDR_ANY;   //链接服务器上的任意一台主机

            if(bind(sock, (struct sockaddr*)&local, sizeof(local)) < 0)
            {
                cout << "bind error" << endl;
                exit(2);
            }          
       }
       
       //服务端需要监听----监听状态
       static void Listen(int sock)
       {
          if(listen(sock, 5) < 0)
          {
               cout << "listen error" << endl;
               exit(3);
          }
       }
       
       //服务端需要接受,新的fd实际上提供服务的文件,旧的sock是用来监听的----> "饭馆的拉客少年"
       static int Accept(int sock)
       {
           struct sockaddr_in peer;
           socklen_t len = sizeof(peer);
           int fd = accept(sock, (struct sockaddr*)&peer, &len); //peer是输出型参数,返回的是客户端相关属性
           if(fd < 0)
           {
               cout << "accept error" << endl;
               exit(4);
           }           
           
           return fd;
       }
       
       //客户端需要链接的是服务端 需要 ip + port
       static void Connect(int sock,  string ip, uint16_t port)
       {
           struct sockaddr_in local;
           local.sin_family = AF_INET;
           local.sin_port = htons(port);
           local.sin_addr.s_addr = inet_addr(ip.c_str());
           
           if(connect(sock, (struct sockaddr*)&local, sizeof(local)) < 0)
           {
                cout << "connect error" << endl;
                exit(5);
           }

           cout << "connect success" << endl;
       }
};

http.cpp -----> 接受请求 后 并且返回 一个响应

#include "Sock.hpp"
#include <pthread.h>
#include <stdlib.h>
#include <string.h>

void* handlerHttp(void* argc)
{
    int sock = *(int*)argc;
    delete (int*)argc;
    pthread_detach(pthread_self());

    char buff[10240];
    memset(buff, 0, sizeof(buff));
    ssize_t s = recv(sock, buff, sizeof(buff) - 1, 0);
    if(s > 0)
    {
        buff[s] = 0;
        cout << buff << endl;

        string response = "http/1.0  200 ok \n";
        response += "Content-Type: text/plain\n";  //text/plain 就是普通文本
        response += '\n';  // 报头和正文的分界线

        response += "Do you eat breakfast  good morning good ningt";
        send(sock, response.c_str(), response.size(), 0);
    }

    close(sock);
    return nullptr;
}

void Usage(const char* proc)
{
     cout << "Usage:" << endl;
     cout << "./http" << "  proc" << endl;
}

// ./http port
int main(int argc, char* argv[])
{
     if(argc != 2)
     {
        Usage(argv[0]);
         return 1;
     }
     
     //创建套接字, 本质是创建文件
     int sock = Sock::Socket();
     
     //绑定
     Sock::Bind(sock, atoi(argv[1]));

     //监听状态
    Sock::Listen(sock);

    //接受状态
    while(1)
    {
        int fd= Sock::Accept(sock);
        if(fd > 0)
        {
             int* pram = new int(fd);
             pthread_t td;
             pthread_create(&td, nullptr, handlerHttp, pram);
        }
    }

     return 0;
}

在这里插入图片描述

关于http协议的一些概念性知识

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD (但是http1.1也是支持的)
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT

下面三个都是应用层协议
SMTP:简单邮件协议
FTP:文件传输协议
TELNET:Internet远程登录服务的标准协议

UDP:用户数据报协议 (这是传输层协议)

http状态码中,(2xx )表示访问成功,( 4xx)表示坏请求,(5xx )表示服务不可用。
坏请求 : 客户端的错
服务不可用: 服务端的错

HTTP协议,是TCP/IP协议栈中应用层的协议
Cookie数据是在HTTP协议头部字段中传输
HTTP协议在目前1.1版本中支持了长连接管理,也就是支持在一定时间内保持TCP连接建立,用于发送/接收多次请求**(keep-alive)**
HTTP协议是无状态的协议,在最初设计的时候HTTP协议是一种简单的请求-响应协议,即一次建立连接中,完成一次请求一次响应后,通信结束关闭连接,所以是无状态的

GET请求提交参数是放在URL中的, 有长度限制,
POST请求提交参数是放在body(正文中), 无长度限制。

POST请求不会被缓存 ----> 对数据长度无限制(body) -------> 无法从浏览器中找到
GET请求可以缓存,可以从浏览记录中找到 ------->数据长度有限制(URL)

对与PUT方法而言:-------一定会有资源
PUT方法请求服务器去把请求里的实体存储在请求URI(Request-URI)标识下。
如果请求URI(Request-URI)指定的的资源已经在源服务器上存在,那么此请求里的实体应该被当作是源服务器关于此URI所指定资源实体的最新修改版本。
如果请求URI(Request-URI)指定的资源不存在,并且此URI被用户代理定义为一个新资源,那么源服务器就应该根据请求里的实体创建一个此URI所标识下的资源。如果一个新的资源被创建了。

HEAD请求是没有响应体的,仅传输状态行和标题部分 (首行 + header)
DELETE方法用来删除指定的资源,它会删除URI给出的目标资源的所有当前内容
PUT方法用于将数据发送到服务器以创建或更新资源,它可以用上传的内容替换目标资源中的所有当前内容

403:禁止访问,服务器拒绝接收到请求但拒绝提供服务,原因较多,比如权限不足,IP被拉入黑名单…
4xx:客户端的错

503: 表示服务器端暂时无法处理请求 -----> 服务端的错误 ----->5xx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python自学入门(打卡十)2022-11-22

Pytest与Unittest区别 参考资料&#xff1a;https://blog.csdn.net/qq_33385691/article/details/112004487 pytest用例规则 文件名以test_.py文件和test.py 以test_开头的函数 以Test开头的类&#xff0c;test_开头的方法&#xff0c;并且不能带有__init_ 方法 所有的包pake…

极智AI | 昇腾开发环境搭建 CANN MindStudio (无坑版)

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多笔记分享 大家好&#xff0c;我是极智视界&#xff0c;本文介绍一下 昇腾开发环境搭建 CANN & MindStudio&#xff0c;没有坑。 本文介绍的方法适用于&#xff1a; 系统&#xff1a;ubuntu18.04 (注&#xff1a;[ce…

5个常见的JavaScript内存错误

JavaScript 不提供任何内存管理操作。相反&#xff0c;内存由 JavaScript VM 通过内存回收过程管理&#xff0c;该过程称为垃圾收集。 既然我们不能强制的垃圾回收&#xff0c;那我们怎么知道它能正常工作&#xff1f;我们对它又了解多少呢&#xff1f; 脚本执行在此过程中暂停…

计算机毕业设计之java+ssm某地区精准扶贫网站

项目介绍 本精准扶贫网站管理系统主要包括系统用户管理模块、捐赠信息管理模块、投诉信息管理、扶贫资讯管理、登录模块、和退出模块等多个模块,系统采用了jsp的mvc框架,SSM(springMvcspringMybatis)框架进行开发,本系统使用mysql&#xff0c;独立运行,不依附于其他系统&#…

Redis数据类型之set

文章目录setⅠ. 基础操作Ⅱ. 随机数据Ⅲ. 交、并、差Ⅳ. 应用场景Ⅴ. 注意事项提示&#xff1a;以下是本篇文章正文内容&#xff0c;Redis系列学习将会持续更新 set ● 数据存储需求&#xff1a;存储大量的数据&#xff0c;在查询方面提供更高的效率。 ● 需要的存储结构&#…

家乡主题网页设计代码 旅游主题网页设计 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

详细解读Spring Boot中@Import三种使用方式

需要注意的是&#xff1a;ImportSelector、ImportBeanDefinitionRegistrar这两个接口都必须依赖于Import一起使用&#xff0c;而Import可以单独使用。Import是一个非常有用的注解&#xff0c;它的长处在于你可以通过配置来控制是否注入该Bean&#xff0c;也可以通过条件来控制注…

CNN卷积神经网络

&#xff08;声明&#xff1a;本文章是在学习他人视频的学习笔记&#xff0c;图片出处均来自该up主&#xff0c;侵权删 up主链接&#xff1a;同济子豪兄的个人空间_哔哩哔哩_bilibili&#xff09; 卷积神经网络就像一个黑箱&#xff0c;有输入和输出&#xff0c;输入是一个图像…

Spring 中更加简单的 “存储“ 和 “读取“ 对象

目录 1. 更加简单的存储对象 1.1 配置扫描路径 1.2 使用五大类注解存储 bean 对象 1.2.1 五大类注解之间的关系 1.2.2 关于 bean 的命名规则 1.3 使用方法注解存储 bean 对象 1.3.1 bean 的重命名 2. 更加简单的获取对象 (DI) 2.1 属性注入 2.1.1 属性注入优缺点分析 …

三、图片的几何变换

目录一、图片缩放1 - 等比缩放2 - 最近领域插值3 - 双线性插值4 - 矩阵缩放二、图片剪切与位移1 - 图片剪切2 - 图片位移三、图片镜像四、图片仿射变换五、图片旋转一、图片缩放 1 - 等比缩放 # 1 load 2 info 3 resize 4 check import cv2img cv2.imread(image0.jpg, 1) im…

软件工程详细知识点复习(上)

文章目录一、软件工程概述1、软件与软件危机2、软件工程二、可行性研究三、需求分析四、概要设计五、详细设计一、软件工程概述 1、软件与软件危机 软件程序数据文档 1、软件危机的主要表现 软件不能满足用户需求软件开发成本严重超标&#xff0c;开发周期大大超过规定日期…

网络设备安装上线,你要知道的10个步骤

大家好&#xff0c;我是技福的小咖老师。在网络工程中设备的安装工作必不可少&#xff0c;你平时都是按哪些步骤完成的&#xff1f;今天给大家总结一下最常见的10个步骤。 安装流程 网络设备安装流程图 安装环境要求 1► 安装场景 为确保设备的正常运行&#xff0c;延长设备…

C. Infected Tree(思维+DFS)

Problem - 1689C - Codeforces Byteland是一片美丽的土地&#xff0c;因其美丽的树木而闻名。 米沙发现了一棵有n个顶点的二叉树&#xff0c;编号从1到n。二叉树是一个无环连接的双向图&#xff0c;包含n个顶点和n-1条边。每个顶点的度数最多为3&#xff0c;而根是数字为1的顶…

基于STM32G431嵌入式学习笔记——五、NVIC中断(以串口UART中断为例)

一、基础知识 1.专业术语 2.NVIC简介 ①在这里要注意&#xff0c;中断控制是分级处理的 ②是否请求中断是中断源控制的。 ③是否响应中断是响应方控制的。 ④以外部中断为例&#xff0c;外部中断请求顺序就是首先从请求的外部设备中选出优先级最高的一个设备待中断&#xff0c…

唐山盐碱滩成渤海明珠 国稻种芯·中国水稻节:河北曹妃甸大米

唐山盐碱滩成渤海明珠 国稻种芯中国水稻节&#xff1a;河北曹妃甸大米 新华社音视频部制作 记者 杨世尧 河北新闻网讯 王士波 赵诤国 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农业大健康…

电脑怎么迁移游戏资源,数据迁移能把游戏数据迁移吗

概述&#xff1a;玩家们在打游戏的过程中&#xff0c;会产生很多数据&#xff0c;尤其是那些大型游戏的玩家&#xff0c;都会珍惜游戏数据。电脑怎么迁移游戏资源&#xff1f;如果您刚刚购买了一台新电脑&#xff0c;并且正在寻找将游戏迁移到新电脑的方法&#xff0c;相信本文…

8 张图 | 剖析 Eureka 的首次同步注册表

注册表对于注册中心尤为重要&#xff0c;所有的功能都是围绕这个注册表展开。比如服务 A 要想访问服务 B&#xff0c;就得知道服务 B 的 IP 地址和端口号吧。如下图所示&#xff0c;传统的方式就是服务 A 知道了服务 B 的地址后&#xff0c;发送 HTTP 请求到对应的 API 地址上。…

MySQL事务管理 MVCC,隔离性详解

目录事务管理事务背景什么是事务&#xff1f;事务的四个属性为什么会出现事务?MySQL支持事务的版本事务提交方式事务常见操作方式演示(体现原子性和持久性)操作注意事项结论事务隔离性查看与设置隔离性各种隔离性演示读未提交【Read Uncommitted】脏读读提交【Read Committed】…

【SNUT集训1】排序 二分 前缀和 差分(6 / 16)

目录 P1094 [NOIP2007 普及组] 纪念品分组 - 排序贪心双指针 P1571 眼红的Medusa - 哈希表 P1678 烦恼的高考志愿 P1024 [NOIP2001 提高组] 一元三次方程求解 1、二分法 2、暴力 P7585 [COCI2012-2013#1] LJUBOMORA - 二分 P4552 [Poetize6] IncDec Sequence- 差分思维…

【Vue学习之从入门到神经】

14天学习训练营导师课程&#xff1a; 郑为中《Vue和SpringBoot打造假日旅社管理系统》 目录 1. VUE介绍 2. Vue导入 3. VUE相关指令 4. 显示隐藏相关 5. Vue周边库 1. VUE介绍 VUE是目前最流行的前端框架, 基于MVVM设计模式VUE框架两种用法: 多页面应用, 在html页面中引入…