http协议的简单理解

1、http协议简介

   http协议又称超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议。简单来说就是一个客户端终端(用户)和服务器端(网站)请求和应答的标准,它定义了web客户端如何从web服务器请求web页面,以及服务器如何把web页面传送给客户端。

2、认识url

   url就是我们常说的网址,其中包含着协议名,登录信息,服务器地址等等,具体组成可如下图所示:

在这里插入图片描述

3、http请求及响应

   http协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、url、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

3.1 模拟实现一个简单服务器并向其发起请求

   下面我们模拟实现一个服务器,模拟服务器的实现步骤(1)创建套接字(2)生成网络描述符(3)套接字与网络描述符绑定(4)将套接字设置为监听状态(5)循环接收链接,居然代码如下:

#include <iostream>
#include <string>
#include <fstream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    //(1)创建套接字
    int listen_sock = socket(AF_INET, SOCK_STREAM, 0);
    if(listen_sock < 0){
        std::cout << "socket error" << std::endl;
        return 1;
    }

    //(2)生成网络描述
    struct sockaddr_in local;memset(&local, 0, sizeof(local));

    local.sin_family = AF_INET;
    local.sin_port = htons(8080);
    local.sin_addr.s_addr = INADDR_ANY;

    //(3)绑定
    if(bind(listen_sock, (struct sockaddr*)&local, sizeof(local)) < 0){
        std::cout << "bind error" << std::endl;
        return 2;
    }
    //(4)监听
    if(listen(listen_sock, 5) < 0){
        std::cout << "listen error" <<std::endl;
        return 3;
    }
    
   //(5)服务器接收亲求
    struct sockaddr_in peer;
    for(;;){
        socklen_t len = sizeof(peer);
        int sock = accept(listen_sock, (struct sockaddr*)&peer, &len);
        if(sock < 0){
            std::cout << "accept error" <<std::endl;
            continue;
        }
     //多进程处理请求防止阻塞
        if(fork() == 0){
            if(fork() > 0) exit(0);
            close(listen_sock);
            //read http request
            char buffer[1024];
            recv(sock, buffer, sizeof(buffer), 0);
            std::cout << "#############################http request begin#############################################"<<std::endl;
            std::cout << buffer << std::endl;
            std::cout << "#############################http request end#############################################"<<std::endl;
        close(sock);
        waitpid(-1, nullptr, 0);
    }
}

   将上述代码写入.cc文件中,编译并运行具体操作如下图:
在这里插入图片描述

   运行完编译文件,我们通过在浏览器上输入(ip : 端口号)访问我们的服务器具体操作如下图:
在这里插入图片描述
   当我们链接上服务器,服务器就会收到一个请求信息,如下图所示:

在这里插入图片描述
   收到的请求可以分为4部分:(1)请求行 (2)请求报头 (2)空行 (3)请求正文。具体结构如下图所示:

在这里插入图片描述

   第一部分请求行里面包含请求方式,请求地址,请求协议版本;第二部分就是请求报头以key:value形式的报头信息;第三部分就是空行,用于服务器区分请求报头和正文;第四部分就是请求正文。

3.2 请求方法

3.2.1 GET

   GET请求: (1) 可以向指定的资源直接求取数据 (2)GET请求可以带参,通过请求地址 + ?+ 参数的方式传参。下面我假设我们正在服务器网页登录账号,如下图所示:

在这里插入图片描述

   当我们点login,服务器收到的请求如下图:
在这里插入图片描述
   在请求的第一行GET请求会把账号密码加载到请求地址的后面,账号密码也就是GET传的参数,而此时账号密码都暴漏了就很不安全。

3.2.2 POST

   POST请求:(1) 向指定的资源提交要被处理的数据 (2)通过正文传参,并且读取正文长度为请求报头中的content_lenth。下面我假设我们正在服务器网页登录账号,如下图所示:

在这里插入图片描述

   当我们点login,服务器收到的请求如下图:
在这里插入图片描述
   我们可以看到此时的账号密码都在正文中,并且他们的长度刚好是content_length。

3.3 响应

   服务器通过发送响应的方式回复客户端的请求,客户端收到的响应包含4部分内容: (1) 响应行 (2) 响应报头 (3) 空行 (4) 响应正文具体结构如下图所示。

在这里插入图片描述
   其中http版本为服务器http版本;状态码如404等等;状态描述可以是中英文描述;响应正文可能是网页、视频、音乐。

4、Cookie

   我们在浏览器中登录账号后,打开同一个网页时,浏览器可以免密自动登录,这是因为我们在第一次登录后,服务器会把我们的账号密码生成唯一的session_id并发送给我们,本地会保存账号密码的session_id保存到cookie文件,下次登录时,cookie中的session_id会随请求一起发送到服务器,可实现免密登录,具体步骤如下图所示:

在这里插入图片描述
   虽然cookie方便了我们,但同时存在一定风险,cookie肯被盗用,盗用者也可以登录我们的账号,为了防止账号被盗用,(1) cookie文件有一定的使用期限,到期删除 (2)服务器会对session_id的使用位置信息进行定位,如果登录位置于上次登录位置不同,会出现位置异常,服务器自动退出登录并删除cookie文件。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

滋巴糯米团

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值