Linux网络-HTTP协议_linux支持http协议吗,2024最新Linux运维框架体系架构面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
img

正文

  • 示例获取HTTP请求:
  1. 用套接字编写一个TCP服务器,使用浏览器访问服务器的ip和port,也就是使用浏览器发起http请求
  2. 服务端不对这个HTTP请求进行过任何解析,直接将http请求进行打印输出
  • http服务器代码:
http_server.hpp:
#pragma once
#include<iostream>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>
#include<strings.h>
namespace ns_Http
{
    class HttpServer
    {
    private:
        uint16\_t port;
        int listen_sock;
    public:
        HttpServer(uint16\_t _port):port(_port),listen\_sock(-1){}
        ~HttpServer()
        {
            if(listen_sock>=0) close(listen_sock);
        }
        void InitHttpServer()
        {
            listen_sock=socket(AF_INET,SOCK_STREAM,0);
            if(listen_sock<0)
                exit(2);
            struct sockaddr\_in local;
            socklen_t len=sizeof(local);
            bzero(&local,len);
            local.sin_family=AF_INET;
            local.sin_port=htons(port);
            local.sin_addr.s_addr=INADDR_ANY;
            if(bind(listen_sock,(struct sockaddr\*)&local,len)<0)
                exit(3);
            if(listen(listen_sock,5)<0)
                exit(4);
        }
        static void\* Routine(void\* args)
        {
            int sock=\*((int\*)args);
            delete (int\*)args;
            pthread\_detach(pthread\_self());
            
            //逻辑处理
            std::cout<<">-------------------------------begin-------------------------------<sock:"<<sock<<std::endl;
            char buffer[1024]={0};
            ssize_t s=recv(sock,buffer,sizeof(buffer)-1,0);
            if(s>0)
            {
                std::cout<<buffer<<std::endl;
            }
            std::cout<<">--------------------------------end--------------------------------<sock:"<<sock<<std::endl;
            close(sock);
            return nullptr;
        } 
        void Loop()
        {
            while(true)
            {
                struct sockaddr\_in peer;
                socklen_t len=sizeof(peer);
                bzero(&peer,len);
                int sock=accept(listen_sock,(struct sockaddr\*)&peer,&len);
                if(sock<0)
                    continue;
                pthread_t tid;
                int\* p=new int(sock);
                pthread\_create(&tid,nullptr,Routine,p);
            }
        }
    };
}
http_server.cc:
#include "http\_server.hpp"

int main(int argc,char\* argv[])
{
    if(argc!=2)
    {
        std::cout<<"Usage:\n\t./http\_server port"<<std::endl;
        exit(1);
    }
    ns_Http::HttpServer hs(atoi(argv[1]));
    hs.InitHttpServer();
    hs.Loop();
    return 0;
}

  • 效果:

image-20220610103853865

  • 示图:

image-20220610111112543

  • 请求行格式:
[请求方法]  [url]  [版本] (空格分开)

  • 请求报头格式:
Name:[空格]内容(一行就是一个属性,这里的“行”是以换行符作为标准)

  • 请求报头内容组成:
  1. Host :请求的资源在哪个主机的端口上
  2. Connection:该请求支持长连接(heep_alive)
  3. Content-Length:正文内容长度
  4. Content-Type:数据类型
  5. User-Agent:声明用户的操作系统和浏览器版本信息
  6. Accent:发起了请求
  7. Referer:当前页面是从哪个页面跳转过来的
  8. Accept-Encoding:接受的编码
  9. Accept-Language:接受的语言类型
  10. Cookie:用于在客户端存储少量信息,通常用于实现会话(session)功能
  • HTTP如何进行解包:
  1. 请求行和请求报头是HTTP的报头信息,而这里的请求正文实际就是HTTP的有效载荷,而请求当中的空行起到分离报头和有效载荷的作用
  2. 读取一个请求时,通过报头中的Content-Length(正文的长度)来精准控制读取该请求正文的长度,从而将连续的几个请求进行分开
  • HTTP如何进行分用:

理论上 HTTP 不需要向上交付,HTTP已经是最上一层的协议,但是上一层还有用户,需要将正文、请求方法和属性等交给用户

2)HTTP响应
  • 响应格式示图:

image-20220609175347303

  • 响应格式组成:
  1. 首行:[版本号] + [状态码] + [状态码解释]
  2. Header:请求的属性,冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
  3. Body:空行后面的内容都是Body,Body允许为空字符串,如果Body存在,则在Header中会有一个
    Content-Length属性来标识Body的长度;如果服务器返回了一个html页面,那么html页面内容就是在body中
  • 获取响应示例:http服务器代码构建响应
    std::string response;
    std::ifstream in(HOME_PAGE,std::ios::in|std::ios::binary);
    std::string body;
    std::string line;
    if(!in.is\_open())//打开失败则发送404页面
    {  
        std::ifstream \_in(PAGE_404,std::ios::in|std::ios::binary);
        while(getline(_in,line))
            body+=line;
        response += "HTTP/1.0 404 Not Found\n";
        response += "Content-Type: text/html\n";
        response += ("Content-Length: " + std::to\_string(body.size()) + "\n");
        response += "\n";
        response += body;
        send(sock, response.c\_str(), response.size(), 0);
    }
    else//打开成功则发送首页页面
    {
        while(getline(in,line))
            body+=line;
        response += "HTTP/1.0 200 OK\n";
        response += "Content-Type: text/html\n";
        response += ("Content-Length: " + std::to\_string(body.size()) + "\n");
        response += "\n";
        response += body;
        send(sock, response.c\_str(), response.size(), 0);
    }

  • 适用网页获取响应:

image-20220612174436241

  • 使用postman进行GET方法获取响应:

image-20220612174250272

  • 使用telnet命令获取响应:

image-20220612174901144

注:客户端在发起HTTP请求是会告诉服务器自己所使用的http版本,此时服务器就可以根据客户端使用的http版本,为客户端提供对应的服务,而不至于因为双方使用的http版本不同而导致无法正常通信

4、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
UNLINK断开连接关系1.0

注:其中最常用的就是GET方法和POST方法

  • GET方法和POST方法对比:
  1. GET方法一般用于获取某种资源信息,而POST方法一般用于将数据上传给服务器,上传数据时也有可能使用GET方法,比如搜索提交数据时
  2. GET方法和POST方法都可以带参:GET方法是通过url传参的;POST方法是通过正文传参的
  3. POST方法通过正文传参能传递更多的参数,而url的长度是有限,所以GET方式传参有限
  4. POST方法传参更加私密,因为GET方法会将参数回显到url当中,POST方法在正文中不会被别人轻易看到。但是实际两种方法都不安全,POST方法传参可以被截取,要做到安全只能通过加密来完成
  • 参数提交GET和post方式演示:

image-20220612182205078

注:表单当中的method属性指定参数提交的方法,action属性表示将表单中的参数提交给服务器上的哪个资源位置

  • GET方式示图:

image-20220612182529019

  • post方式示图:

image-20220612182725767

5、HTTP的状态码

在开发好了网站后,用户通过URL对资源进行操作,服务器端要告诉用户交互的结果,比如新增资源是成功还是失败了。一个较好的办法就是遵循HTTP协议,使用请求响应的HTTP状态码(Status Code)来进行判断

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

注:最常见的状态码如200(OK),404(Not Found),403(Forbidden请求权限不够),302(Redirect),504(Bad Gateway)

  • 常见的状态码有:
  1. 200 OK:客户端请求成功
  2. 301 Permanent Redirect:永久重定向,表示资源已经永久移动到另一个位置
  3. 307/302 Temporary Redirect:临时重定向,表示资源临时移动到了另一个位置
  4. 403 Forbidden:指的是服务器端有能力处理该请求,但是拒绝授权访问
  5. 404 Not Found:请求资源不存在,比如资源被删除了,或用户输入了错误的URL
  6. 500 Internal Server Error:服务器发生不可预期的错误,一般是代码的BUG所导致的
  7. 502 Bad Gateway:表示作为网关或代理角色的服务器,从上游服务器(如tomcat、php-fpm)中接收到的响应是无效的
  • 重定向状态码:
  1. 重定向就是通过各种方法将各种网络请求重新定个方向转到其它位置,此时这个服务器相当于提供了一个引路的服务
  2. 重定向又可分为临时重定向和永久重定向,其中状态码301表示的就是永久重定向,而状态码302和307表示的是临时重定向
  3. 永久重定向第一次访问浏览器进行重定向,并且更新客户端的标签,后续再访问直接就是重定向后的网站;临时重定向,每次访问该网站时都需要浏览器来帮我们完成重定向跳转到目标网站
  • 临时重定向演示:

进行临时重定向时需要用到Location字段,Location字段是HTTP报头当中的一个属性信息,该字段表明了你所要重定向到的目标网站

  • 构建临时重定向http响应代码:
	//构建HTTP响应
    std::string response = "HTTP/1.0 307 Temporary Redirect\n"; //状态行
    response += "Location: https://coca1cole.blog.csdn.net/\n"; //跳转页面
    response += "\n"; //空行

    send(sock, response.c\_str(), response.size(), 0);
    close(sock);

  • 效果:

临时重定向
image-20220612194252372

6、HTTP常见的Header

  • HTTP常见的Header:
  1. Content-Type:数据类型(text/html等)
  2. Content-Length:正文的长度
  3. Host:客户端告知服务器,所请求的资源是在哪个主机的哪个端口上

注:Host字段表明了客户端要访问的服务的IP和端口,有些服务器实际提供的是一种代理服务,也就是代替客户端向其他服务器发起请求,然后将请求得到的结果再返回给客户端,在这种情况下客户端就必须告诉代理服务器它要访问的服务对应的IP和端口
4. User-Agent:声明用户的操作系统和浏览器的版本信息

注:User-Agent代表的是客户端对应的操作系统和浏览器的版本信息,访问一些网站是就会根据主机的版本和系统推送相匹配的服务
5. Referer:当前页面是哪个页面跳转过来的

注:Referer记录上一个页面的好处一方面是方便回退,另一方面可以知道我们当前页面与上一个页面之间的相关性
6. Location:搭配3XX状态码使用,告诉客户端接下来要去哪里访问
7. Cookie:用于在客户端存储少量信息,通常用于实现会话(session)的功能
8. Keep-Alive(长连接):

  • HTTP/1.0是通过request&response的方式来进行请求和响应的,HTTP/1.0常见的工作方式就是客户端和服务器先建立链接,然后客户端发起请求给服务器,服务器再对该请求进行响应,然后立马端口连接
  • 现在主流的HTTP/1.1是支持长连接的,所谓的长连接就是建立连接后,客户端可以不断的向服务器一次写入多个HTTP请求,而服务器在上层依次读取这些请求就行了,此时一条连接就可以传送大量的请求和响应

7、Cookie和Session

  • 概念及介绍:
  1. HTTP实际上是一种无状态协议,HTTP的每次请求/响应之间是没有任何关系的,但你在使用浏览器的时候发现并不是这样的
  2. 当你登录一次能某网站账号后,再将网站关了甚至是重启电脑,再次网站时并没有要求你再次输入账号和密码(账号还是登录好的状态),这实际上是通过cookie技术实现的
  • cookie技术原理:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

7、Cookie和Session

  • 概念及介绍:
  1. HTTP实际上是一种无状态协议,HTTP的每次请求/响应之间是没有任何关系的,但你在使用浏览器的时候发现并不是这样的
  2. 当你登录一次能某网站账号后,再将网站关了甚至是重启电脑,再次网站时并没有要求你再次输入账号和密码(账号还是登录好的状态),这实际上是通过cookie技术实现的
  • cookie技术原理:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
[外链图片转存中…(img-jc2w25Ee-1713373377559)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值