Linux网络-HTTP协议_linux支持http协议吗

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

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

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

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

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

需要这份系统化的资料的朋友,可以点击这里获取!

  1. 登录认证信息包括登录用户的用户名和密码,登录认证信息可以在URL中体现出来
  2. 绝大多数URL的这个字段都是被省略的,因为登录信息可以通过其他方案交付给服务器
  1. 服务器地址
  1. 服务器地址也叫做域名,比如www.alibaba.comwww.qq.comwww.baidu.com
  2. 在计算机的世界中用IP地址标识公网内的一台主机,但IP地址是一串数字并不适合用户使用,为了方便用户从而有了具有更好的自描述性的域名
  3. 实际上域名和IP地址是等价的,在计算机当中使用的时候既可以使用域名,也可以使用IP地址
  • ping命令获取域名解析后的IP地址:

image-20220608164830686
4. 服务器端口号

  1. HTTP协议和套接字编程一样都是位于应用层的,进行网络数据传输时需要主动确定服务端的ip和port
  2. 常用的服务与端口号之间的对应关系都是明确的,所以使用时不要指明该协议对应的端口号的,而URL中也通常省略服务器的端口号
  1. 带层次的文件路径

要获取(访问)的应用资源的路径,即资源的存储位置,一般会使用“/”来分级描述

  • 注意:
  1. 比如我们打开浏览器输入百度的域名后,此时浏览器就帮我们获取到了百度的首页,我们可以将这种资源称为网页资源,此外我们还会向服务器请求视频、音频、网页、图片等资源
  2. HTTP之所以叫做超文本传输协议,而不叫做文本传输协议,就是因为有很多资源实际并不是普通的文本资源
  3. 从这里的路径分隔符,我们可以分辨服务器的平台:Linux的路径分隔符是/,Windows的路径分隔符是\
  1. 查询字符串

用于获取资源时,向服务器端传递参数,可以一个或多个,多个则以”&”连接,通常以“?”作为开始符号,例如例子“?q=java”表示传递的搜索参数java,即该应用url表示搜索java方面的内容

  1. 片段标识符

也叫做哈希值,通常以#开始,表示定位到页面某个位置(或者说定位到页面的锚点,熟悉前端的人应该知道锚点是指页面某个部分的id),这部分内容不传到服务器端,而是用于前端页面定位显示

2、urlencode和urldecode

  • 概念及介绍:
  1. 像 / ? : 等这样的字符, 已经被url当做特殊意义理解了,因此这些字符不能随意出现
  2. 如某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义
  • 示例:

image-20220608171403206

  • 转义规则:

将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式

3、HTTP协议格式

1)HTTP请求
  • 请求格式示图:

image-20220609174800744

  • 请求格式组成:
  1. 首行: [方法] + [url] + [版本]
  2. Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
  3. Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个
  4. Content-Length属性来标识Body的长度

注:前面三部分是一般是HTTP协议自带的,是由HTTP协议自行设置的,而请求正文一般是用户的相关信息或数据;如果用户在请求时没有信息要上传给服务器,此时请求正文就为空字符串

  • 示例获取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"; //空行


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

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

**因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/27714b73c60b94a7cfbb292103a2fb30.png)
![img](https://img-blog.csdnimg.cn/img_convert/428b0b6086f71ef7a21b0739eaa42e28.png)
![img](https://img-blog.csdnimg.cn/img_convert/79a5679fdb3fe0faaf365f19020ae669.png)
![img](https://img-blog.csdnimg.cn/img_convert/72ece647955d43aad7679e164ee94ade.png)
![img](https://img-blog.csdnimg.cn/img_convert/ead90ae105b293cbaf64558b0f59c868.png)

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

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

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**

动等大厂,目前在阿里**

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

**因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
[外链图片转存中...(img-PdgmZuuf-1715826965113)]
[外链图片转存中...(img-04TlnR9Q-1715826965113)]
[外链图片转存中...(img-6VkPDzBy-1715826965114)]
[外链图片转存中...(img-kJVOnB5m-1715826965114)]
[外链图片转存中...(img-VDyz3LS1-1715826965114)]

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

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

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值