【Linux】HTTP 协议

1. URL

URL 表示着是统一资源定位符(Uniform Resource Locator), 就是 web 地址,俗称“网址”;
每个有效的 URL 可以通过互联网访问唯一的资源, 是互联网上标准资源的地址;

URL 的主要由四个部分组成:

scheme :// host[:port] / path
  • scheme(协议): 所使用的传输协议, 通常为 HTTP 协议或 HTTPS 协议;
  • host(主机): 是资源所在的网站或服务器的名字, 又称为域名; 主机名也可以使用点分十进制的 IP地址 代替; 使用 :// 与协议分隔;
  • port(端口): 端口号, 通常会被省略, 表示使用协议默认的端口号; 使用 :与主机分隔;
  • path(路径): 所访问资源的相对路径; 同时第一个 / 可以分隔端口号和资源路径;

2. HTTP 协议

HTTP(超文本传输协议,HyperText Transfer Protocol) 是一种用于分布式、协作式、超媒体信息系统的应用层协议, 是基于 TCP/IP 通信协议来传输数据的;

HTTP 协议由 HTTP请求 和 HTTP响应 两部分组成

2.1. HTTP 请求

HTTP 请求由 请求行(request line), 请求头部(header), 空行和请求数据 四个部分组成;

在这里插入图片描述

  • 请求行:
    请求方法: 指定要执行的操作; 如 GET, POST, PUT, DELETE 等;
    URL : 请求的资源路径;
    协议版本: 协议的版本, 如 HTTP/1.0, HTTP/1.1, HTTP/2.0 等;

  • 请求报头:
    包含了请求的具体信息, 由多组 K : V 结构组成;

  • 空行:
    请求报头和有效载荷之间的分隔;

  • 有效载荷:
    包含要发送给服务器的数据, 可以为空;

方法 含义
GET 从服务器获取资源
HEAD 类似于 GET,但服务器只返回响应的头部,不返回实际数据
POST 向服务器发送数据以创建新资源
PUT 向服务器发送数据以更新现有资源。如果资源不存在,则创建新的资源
DELETE 从服务器删除指定的资源
OPTION 返回服务器支持的 HTTP 方法
TRACE 回显服务器收到的请求
CONNECT 建立一个到服务器的隧道,通常用于 HTTPS 连接

那么就可以将浏览器视为客户端, 编写服务器, 通过 URL 的方式, 接收浏览器的 HTTP 请求;
可以不做任何处理, 看一看 HTTP 请求;

具体代码实现: [HTTP 网页简易验证];

Server.cc

#include "Server.hpp"
#include "Http.hpp"

using call_back = function<Response(Request)>;
class Serve
{
public:
    Serve(call_back cb) : _cb(cb) {}

    void CallBack(shared_ptr<Socket> sockfd)
    {

        Request req;
        string buf;
        while (1)
        {
            // 接收
            int n = sockfd->Recv(buf);
            if (n <= 0)
            {
                LOG(FATAl, "Recv fail");
                break;
            }
			
			// 直接打印 Http 请求
            cout << buf << endl;
            
            // // 反序列化
            // req.DeSerialize(buf);

            // // 回调
            // Response resp = _cb(req);

            // // 序列化
            // string package;
            // resp.Serialize(package);

            // // 发送
            // sockfd->Send(package);
        }
    }
    call_back _cb;
};

int main(int argc, char *argv[])
{
    HttpServe hs;
    Serve serve(bind(&HttpServe::HandlerServe, &hs, placeholders::_1));
    TpcServer tpc(bind(&Serve::CallBack, &serve, placeholders::_1));
    tpc.Start();

    return 0;
}

在这里插入图片描述

2.2. HTTP 响应

HTTP 响应由 状态行, 响应报头, 空行和响应正文 四部分组成;

在这里插入图片描述

  • 状态行:
    协议版本: 协议的版本, 如 HTTP/1.0, HTTP/1.1, HTTP/2.0 等;
    状态码: 三位数, 表示请求的处理结果;
    状态码描述: 状态码的简短描述;

  • 响应报头:
    包含了响应的具体信息, 由多组 K : V 结构组成;

  • 空行:
    请求报头和有效载荷之间的分隔;

  • 有效载荷:
    包含服务器返回的数据, 如请求的网页内容, 图片, JSON数据等;

状态码 含义
1xx 表示通知信息,服务器收到请求,需要请求者继续执行操作
2xx 表示成功,操作被成功接收并处理
3xx 表示重定向,需要进一步的操作以完成请求
4xx 表示客户端错误,请求包含语法错误或无法完成请求
5xx 表示服务器错误,服务器在处理请求的过程中发生了错误

可以通过 telnet 命令获取服务器的响应;

telnet baidu.com 80

在这里插入图片描述

输入 ^] (ctrl + ]) 连接服务器;

在这里插入图片描述

发出简易的请求;

// 换行
GET / HTTP/1.0
// 换行

在这里插入图片描述

相关推荐

  1. LLMNR协议、MDNS协议、NBNS协议

    2024-07-23 07:04:02       30 阅读
  2. UDP<span style='color:red;'>协议</span>

    UDP协议

    2024-07-23 07:04:02      62 阅读
  3. TCP<span style='color:red;'>协议</span>

    TCP协议

    2024-07-23 07:04:02      44 阅读
  4. IP<span style='color:red;'>协议</span>

    IP协议

    2024-07-23 07:04:02      60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-23 07:04:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-23 07:04:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-23 07:04:02       45 阅读
  4. Python语言-面向对象

    2024-07-23 07:04:02       55 阅读

热门阅读

  1. [网络基础]——IP、MAC、子网掩码

    2024-07-23 07:04:02       16 阅读
  2. 背包问题模板

    2024-07-23 07:04:02       18 阅读
  3. 如何看待云原生下的多活容灾

    2024-07-23 07:04:02       14 阅读
  4. PyTorch 中的一个函数:torch.pow

    2024-07-23 07:04:02       13 阅读
  5. 图像处理 -- ISP调优(tuning)的步骤整理

    2024-07-23 07:04:02       14 阅读