Linux:HTTP协议

1. HTTP 协议介绍

基本介绍:

HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

HTTP 是一种应用层协议,是基于 TCP/IP 通信协议来传递数据的,其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现,HTTP3.0 基于 UDP 实现。现主流使用 HTTP1.0 和 HTTP3.0

协议: 为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议,它最终体现为在网络上传输的数据包的格式。

注意: 当我们访问一些网页时,是显示通过 HTTPS 来进行通信的,并且当下大多数的网页都是通过 HTTPS 来进行通信的,因为 HTTPS 在 HTTP 的基础上做了一个加密的工作。

2. HTTP 协议的工作过程

当我们在浏览器输入一个网址,此时浏览器就会给对应的服务器发送一个 HTTP 请求,对应的服务器收到这个请求之后,经过计算处理,就会返回一个 HTTP 响应。并且当我们访问一个网站时,可能涉及不止一次的 HTTP 请求和响应的交互过程。

3.URL

URL(Uniform Resource Locator)翻译为统一资源定位符

表示:某个网站资源的某个资源,全球唯一

URL 基本格式

  • URL 的标准格式如下:

cs 复制代码
协议类型:[//服务器地址[:端口号]][/资源层级 UNIX 文件路径]文件名[?查询字符串][#片段标识符]

使用HTTP的URL:

  • http://<主机>:<端口>/<路径>;

HTTP的默认端口号:80

https:加密,默认端口号443;

4、HTTP有两类报文

抓包得到的请求报文:

响应成功得到的:

HTTP/1.1 200 OK:这表示HTTP请求已成功被服务器接收、理解,并且返回了一个成功的状态码200。

Server: nginx:这表示处理请求的服务器是Nginx。Nginx是一个高性能的HTTP和反向代理web服务器,也常作为IMAP/POP3/SMTP代理服务器。

Date: Fri, 30 Aug 2024 01:32:26 GMT:这是服务器发送响应的日期和时间,使用GMT(格林尼治标准时间)表示。

Content-Type: application/json; charset=utf-8;:这指定了返回的内容类型是JSON格式,并且字符编码是UTF-8。

Transfer-Encoding: chunked:这表示传输编码是块编码(chunked encoding),意味着响应体会被分割成多个块进行发送,每个块都有自己的大小指示,直到一个大小为0的块表示响应体结束。

Connection: keep-alive:这表示连接将保持活动状态,以便在同一个连接上发送和接收更多的HTTP请求和响应,从而提高性能。

**Access-Control-Allow-Origin: ***:这是一个CORS(跨源资源共享)头部,表示该资源允许来自任何源的请求。这对于Web应用从前端向后端请求数据非常有用,尤其是当它们部署在不同的域上时。

接下来的部分是实际的响应体,它以20b开始,这表示接下来的数据块大小是32字节(十六进制20b转换为十进制是32),然后是JSON格式的天气预报数据,最后是一个大小为0的块,表示数据结束。

JSON数据包含了以下信息:

success:"1" 表示请求成功。

result对象包含了详细的天气信息,如城市编号(weaid)、日期(days)、星期(week)、城市名称(citynm)、温度(temperature、temperature_curr)、湿度(humidity)、空气质量指数(aqi)、天气状况(weather、weather_curr)、天气图标(weather_icon)、风向(wind)、风力(winp)、最高和最低温度(temp_high、temp_low)、当前温度(temp_curr)、最高和最低湿度(humi_high、humi_low,这里为0可能表示未提供)、天气ID(weatid)、风力ID(windid)和风向ID(winpid)等。

5. HTTP 响应(Response)

5.1 认识"状态码"(status code)

状态码表示访问一个页面的结果(如访问成功、失败,还是其它一些情况等等),它是一个3位的整数,从 1xx、2xx、3xx、4xx、5xx,分为五个大类,每个大类的含义都不同。以下介绍一些常见的状态码及它的状态码解释

cs 复制代码
200 OK
表示访问成功
cs 复制代码
404 Not Found
表示没有找到资源

当你发送请求的 URL 在服务器中找不到该资源,就会出现 404

cs 复制代码
403 Forbidden
表示访问被拒绝

有的页面通常需要用户有一定的权限才能访问,如未登录

cs 复制代码
405 Method Not Allowed

表示访问的服务器不能支持请求中的方法或者不能使用该请求中的方法

cs 复制代码
500 Internal Server Error
表示服务器出现内部错误

一般是服务器的代码执行过程中遇到了一些特殊的情况,造成服务器崩溃可能会产生这个状态码

cs 复制代码
504 Gateway Timeout
表示当前服务器负载比较大,服务器处理单条请求的时耗很长,就会出现超时情况
cs 复制代码
302 Move temporarily
表示临时重定向

重定向相当于手机呼号的呼叫转移功能,如果我们换了一个手机号,就可以去办理该呼叫转移业务,使朋友拨打你的旧号码时,自动跳转到新号码

cs 复制代码
301 Moved Permanently
表示永久重定向,当浏览器收到这种响应时,后续的请求都会被自动改成新的地址
5.2 认识响应"报头"(header)

响应报头的基本格式和请求报头的格式基本一致,下面介绍下响应报头的 Content-Type 参数

Content-Type

Content-Type 表示 body 的数据格式,以下介绍三种响应中的数据格式

cs 复制代码
text/html

表示数据格式是 HTML
cs 复制代码
text/css

表示数据格式是 CSS
cs 复制代码
application/javascript

表示数据各式是 JavaScript
cs 复制代码
application/json

表示数据格式是 JSON

练习:获取网站的天气数据

cs 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
    int fd = open("./data",O_RDONLY);     //data文件是请求报文
    if(-1 == fd)
    {
        perror("open");
        exit(1);
    }
    char buf[1024]={0};
    read(fd,buf,sizeof(buf));
    close(fd);

    char* end = NULL;
    char *days=strstr(buf,"days");
    char *week =strstr(buf,"week");
    char *city =strstr(buf,"citynm");
    char *temp =strstr(buf,"temperature");
    char *wea =strstr(buf,"weather");

    days+=7;
    end = strchr(days,'"');
    *end = '\0';

    week+=7;
    end = strchr(week,'"');
    *end = '\0';

    city+=9;
    end = strchr(city,'"');
    *end = '\0';

    temp+=14;
    end = strchr(temp,'"');
    *end = '\0';

    wea+=10;
    end = strchr(wea,'"');
    *end = '\0';
    printf("%s %s %s %s %s\n",days,week,city,temp,wea);
    return 0;
}
相关推荐
阿甘知识库1 分钟前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
滴水之功30 分钟前
VMware OpenWrt怎么桥接模式联网
linux·openwrt
saynaihe34 分钟前
安全地使用 Docker 和 Systemctl 部署 Kafka 的综合指南
运维·安全·docker·容器·kafka
ldinvicible1 小时前
How to run Flutter on an Embedded Device
linux
YRr YRr2 小时前
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误
linux·opencv·ubuntu
认真学习的小雅兰.2 小时前
如何在Ubuntu上利用Docker和Cpolar实现Excalidraw公网访问高效绘图——“cpolar内网穿透”
linux·ubuntu·docker
zhou周大哥2 小时前
linux 安装 ffmpeg 视频转换
linux·运维·服务器
不想起昵称9292 小时前
Linux SHELL脚本中的变量与运算
linux
the丶only3 小时前
单点登录平台Casdoor搭建与使用,集成gitlab同步创建删除账号
linux·运维·服务器·docker·gitlab