【Linux】HTTP超文本传输协议

news2024/12/29 10:35:19

http主要用在浏览器和web服务器通信,是基于TCP协议的应用层无连接的传输协议。

HTTP与HTTPS

http是明文数据传输,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。协议使用端口号:80。

https更加安全:数据加密、校验(防止被篡改),建立https网站需要申请ca证书(证明合法性,防止中间人攻击)。协议使用端口号:443

        加密方法:对称+非对称加密+证书+数字签名(对比防止证书被修改)

 对称加密(对加密和解密使用相同密钥的加密算法):RC4、DES、3DES、AES、ChaCha20 等

非对称加密(公钥加密,私钥解密): DH、DSA、RSA、ECC 等。

访问http的网站:

        会被提示不安全。

https的网站:

        有一个安全的锁。

​​


HTTP请求

请求头部:

浏览器给服务器发送

每一行结束都有一个\r\n;

头部与数据部分隔一行\r\n,空行表明头部结束了

 请求方法:

GET客户端向服务端请求资源,POST客户端向客户端提交数据(如:自己换头像)

其中:GET、HEAD、TRACE、OPTIONS是安全的。

 应答头部:

服务端给浏览器发

 HTTP状态码:

1XX信息,告诉服务器自己还有数据发送;

2XX成功,200 OK;

3XX重定向;

4XX客户端错误;

5XX服务器错误;


 写一个服务端让浏览器使用ip连接 

        这里当服务端接收到浏览器的请求后向其发送:“打印ok?“,但是这是不符合它的应答格式的,此时浏览器无法解析,将其应答直接显示出来

        并且接收信息发送后就关闭了,这种为短链接。

头文件:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

 创建套接字:

int socket_init()
{
	int sockfd = socket(AF_INET,SOCK_STREAM,0);
	assert(sockfd!=-1);
	
	struct sockaddr_in saddr;
	memset(&saddr,0,sizeof(saddr));
	saddr.sin_family=AF_INET;
	saddr.sin_port = htons(80);
    saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    assert(res!=-1);

	res = listen(sockfd,5);
    assert(res!=-1);
    return sockfd;
}

主函数:

        服务器收到浏览器请求后返回一个"打印ok?"

int main()
{
    int sockfd=socket_init();
    assert(sockfd!=-1);

    while(1)
    {
        struct sockaddr_in  caddr;
        int len = sizeof(caddr);
        int c = accept(sockfd,(struct sockaddr*)&caddr,&len);
        if(c<0)continue;

        char buff[1024] = {0};
        int n=recv(c,buff,1023,0);
        if(n<=0)
        {
            close(c);
            continue;
        }

        printf("%s\n",buff);
        send(c,"打印ok?",7,0);
        close(c);
    }
}

申请1024大小的数组必须用管理员权限运行(不然不会分配这么多空间):

服务端可以收到发送请求的浏览器、系统的型号等等

这些数据都存在接收(recv)的buff中。

GET请求资源:

浏览器指定文件路径,GET后面的与浏览器上输入的东西一样,即把请求送给服务器。


让服务器回复指定数据:

        由于请求报文可以得到浏览器申请的数据文件地址,我们可以获取它,然后回一个应答报文。

头文件:

因为要打开文件,所以要加上fcntl.h

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<fcntl.h>
//当前程序的位置
#define PATH "/home/stu/day21"

创建套接字:

int socket_init()
{
	int sockfd = socket(AF_INET,SOCK_STREAM,0);
	assert(sockfd!=-1);
	
	struct sockaddr_in saddr;
	memset(&saddr,0,sizeof(saddr));
	saddr.sin_family=AF_INET;
	saddr.sin_port = htons(80);
    saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    assert(res!=-1);

	res = listen(sockfd,5);
    assert(res!=-1);
    return sockfd;
}

获取文件名:

//获取文件名(Get后面的东西)
char * get_filename(char buff[])//报头存在buff中
{
    char*s = strtok(buff," ");//分割出请求方法
    if(s==NULL)return NULL;
    printf("请求方法:%s\n",s);
    
    s = strtok(NULL," ");//分出文件名
    return s;
}

主函数:

recv,拼接应答报文

默认的主页为index html

int main()
{
    int sockfd=socket_init();
    assert(sockfd!=-1);

    while(1)
    {
//接收数据
        struct sockaddr_in  caddr;
        int len = sizeof(caddr);
        int c = accept(sockfd,(struct sockaddr*)&caddr,&len);
        if(c<0)continue;
//存请求
        char buff[1024] = {0};
        int n=recv(c,buff,1023,0);
        if(n<=0)
        {
            close(c);
            continue;
        }
//打印请求
        printf("%s\n",buff);
//获取浏览器指定的文件名
        char* filename = get_filename(buff);
        if(filename==NULL)
        {
            close(c);//解析不了,直接关闭
            continue;
        }
//拼接http应答报文
        //PATH是自己定义的宏表示当前文件位置,下面要将文件名加到当前路径后
        char path[236] = {PATH};
        if(strcmp(filename,"/")==0)//filename只有一个/表示没有指定文件
        {
            strcat(path,"/index.html");// "/home/stu/day21/index.html"
        }
        else
        {
            strcat(path,filename);
        }
        //获取文件大小
        int fd = open(path,O_RDONLY);
        if(fd==-1)//文件没打开
        {
            close(c);
            continue;
        }
        int size = lseek(fd,0,SRRK_END);   //大小等于文件头到文件末尾的位置     
        lseek(fd,0,SEEK_SET);//再把偏移量移到文件头

        char head[128] = {"HTTP/1.1 200 0K\r\n"};
        strcat(head,"Server: myhttp\r\n");
//将内容格式化输出到一个buff中
        sprintf(head+strlen(head),"Content-Length: %d\r\n",size);
        strcat(head,"\r\n");//空行


//输出头部 
        printf("\n%s",head);
//给客户端发送头部
        send(c,head,strlen(head),0);
//给客户端发送数据
        char data[1024]={0};
        int num = 0;
        while((num=read(fd,data,1024))>0)//读数据
        {
            send(c,data,num,0);//发送
        }
        close(fd);
        close(c);
    }
}

html文件   

        把这个文件放在浏览器申请的文件夹中,服务器可以把它发给浏览器。

<html>
    <head>
        <meta charset="utf8">
        <title>c2202的主页</title>
    </head>

        <body>
            欢迎
        </body>
</html>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431231.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AIGC:数字内容创新的新引擎,还有藏着更多你知道的细节

随着技术的不断发展进步&#xff0c;在前两年对我们还是天方夜谭&#xff0c;可望而不可即的科技&#xff0c;现在不仅在逐步实现&#xff0c;甚至在广泛地普及应用中。人工智能技术应用在越来越多的行业中&#xff0c;在一定程度上对各行业的发展起了不小的推动作用&#xff0…

教你如何将PDF文件转换成PPT演示文稿

在工作和学习中&#xff0c;我们可能需要将一些PDF文件转换成PPT演示文稿&#xff0c;以便于更好地展示和分享。虽然PPT和PDF是两种不同的文档格式&#xff0c;但是我们可以使用一些专业的软件或在线工具来实现这种转换。下面就让我们来教你如何将PDF文件转换成PPT演示文稿。 …

Java 简介

Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发&#xff0c;并在 1995 年正式推出。 后来 Sun 公司被 Oracle &#xff08;甲骨文&#xff09;公司收购&#xff0c;Java 也随之成为 O…

RabbitMQ 发布确认 交换机 死信队列 延迟队列

RabbitMQ 发布确认开启发布确认的方法单个确认发布批量消息确认发布异步确认发布如何处理异步未确认消息 交换机绑定Fanout交换机Fannout交换机&#xff08;消费者&#xff09;Fannout交换机&#xff08;生产者&#xff09; Direct exchage(直接交换机)生产者消费者 Topic交换机…

遥感影像变化检测新方法:MLDANets

来源&#xff1a;投稿 作者&#xff1a;xin 编辑&#xff1a;学姐 论文标题&#xff1a; Multilevel Deformable Attention-Aggregated Networks for Change Detection in Bitemporal Remote Sensing Imagery Motivation 本文指出: &#xff08;1&#xff09;当前基于自注意…

Spring AOP通知类型

我们之前的文章介绍了AOP通知描述了抽取的共性功能&#xff0c;根据共性功能抽取的位置不同&#xff0c;最终运行代码时要将其加入到合理的位置。 先来认识一下五种通知的具体类型&#xff1a; 前置通知后置通知环绕通知(重点)返回后通知(了解)抛出异常后通知(了解) &#x1f…

(4)(4.6) 强制性硬件配置

文章目录 前言 1 ArduPilot操作的简单概述 2 框架类和类型配置 3 电机编号和方向 4 无线电控制校准 5 加速度计校准 6 罗盘校准 7 遥控发射器飞行模式配置 8 电子调速器(ESC)校准 9 配置电机范围(可选) 10 失控保护机制 11 飞行模式 前言 作为首次安装的一部分&am…

深度卷积神经网络DCNN简介

1. 背景 卷积神经网络CNN&#xff08;Convolutional Neural Network&#xff0c;又称ConvNet&#xff09;保留了空间信息&#xff0c;因此可以更好地用于图像分类。 卷积操作基于仔细甄选的局部感受野&#xff0c;在多个特征平面共享权值&#xff1b;之后全连接层基于传统的多层…

C++之 多态(Polymorphism)

目录 一、基本概念 多态的使用&#xff1a; 案例一——计算机类 多态的优点&#xff1a; 二、纯虚函数与抽象类 特点&#xff1a; ①无法实例化对象 ②子类必须重写父类中的纯虚函数&#xff0c;否则也属于抽象类 案例二——制作饮品 三、虚析构与纯虚析构 因为父类指…

【C++】结构体嵌套结构体

目录 1、缘起 2、结构体嵌套结构体 3、总结 1、缘起 结构体嵌套结构体 是一种数据组织方式&#xff0c;就像 俄罗斯套娃 一样&#xff0c;一个数据结构可以包含另一个数据结构。这种嵌套结构使得程序可以更加灵活地处理数据&#xff0c;从而更好地满足复杂的需求。类比生活中…

Java之~ Aop自定义注解日志

大纲步骤&#xff1a; 一&#xff0c;创建需要记录的日志表&#xff0c;创建基础方法。&#xff08;省略&#xff09; 二&#xff0c;在需要加记录日志的方法上加Aop注解1&#xff0c;创建一个注解类&#xff0c;Aop中定义一个注解import java.lang.annotation.*; /*** http 请…

银行数字化转型导师坚鹏:商业银行零售业务数字化风控

商业银行零售业务数字化风控课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚商业银行数字化风控发展现状&#xff1f; 不清楚对公业务数字化风控工作如何开展&#xff1f; 不知道零售业务数字化风控工作如何开展&#xff1f; 课程特…

十三、RNN循环神经网络实战

因为我本人主要课题方向是处理图像的&#xff0c;RNN是基本的序列处理模型&#xff0c;主要应用于自然语言处理&#xff0c;故这里就简单的学习一下&#xff0c;了解为主 一、问题引入 已知以前的天气数据信息&#xff0c;进行预测当天(4-9)是否下雨 日期温度气压是否下雨4-…

拦截器 JWT SpringBoot 多环境开发 本地文件上传 阿里云OSS存储 异常处理

Springboot&#xff1a; 是&#xff1a;由pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化spring应用的初始搭建以及开发过程 作用&#xff1a;简化Spring的环境搭建和代码开发 使用原理&#xff1a;就是boot提前写好了一些maven的工程和jar包&#xff0c;程序员在…

Android屏幕适配dp、px两套解决办法

最新最全文章(2018-08-25)&#xff1a;Android dp方式的屏幕适配-原理(后期补充完整讲解)_手机dp输出是横屏还是竖屏_android阿杜的博客-CSDN博客 “又是屏幕适配&#xff0c;这类文章网上不是很多了吗&#xff1f;” 我也很遗憾&#xff0c;确实又是老问题。但本文重点对网上…

ChatGPT来势凶猛,公有云格局会不会大变?

【引言】&#xff1a; AI风暴来袭&#xff0c;全球无人幸免。 但公有云与ChatGPT到底啥关系&#xff1f; 1) 公有云与ChatGPT&#xff0c;到底谁会“吃”掉谁&#xff1f; 【科技明说 &#xff5c; 热点关注】在看到公有云厂商纷纷开始大模型发布&#xff0c;开始GPT的融入之…

虹科教您 | 基于Linux系统的虹科RELY-TSN-KIT套件操作指南(2)——操作演示

RELY-TSN-KIT是首款针对TSN的开箱即用的解决方案&#xff0c;它可以无缝实施确定性以太网网络&#xff0c;并从这些技术复杂性中抽象出用户设备和应用。该套件可评估基于IEEE 802.1AS同步的时间常识的重要性&#xff0c;并借助时间感知整形器来确定性地交付实时流量&#xff0c…

EJBCA搭建

EJBCA搭建 前言&#xff1a; 本次EJBCA搭建使用操作系统为centos 7&#xff0c;shell用户为root。 1.下载jdk环境&#xff1a; // 下载jdk yum install -y java-1.8.0-openjdk-devel // 查看java版本 java -version 本人jdk环境&#xff1a; openjdk version "1.8.…

计算机自动化有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是计算机自动化领域的一些知名SCI期刊&#xff1a; IEEE Transactions on Automation Science and Engineering&#xff1a; 该期刊由IEEE&#xff08;电气和电子工程师协会&#xff09;出版&#xff0c;涵盖了自动化科学和工程领域的研究&#xff0c;包括自动控制、人工…

算法记录 | Day35 贪心算法

860.柠檬水找零 思路&#xff1a; 只需要维护三种金额的数量&#xff0c;5&#xff0c;10和20。 有如下三种情况&#xff1a; 情况一&#xff1a;账单是5&#xff0c;直接收下。情况二&#xff1a;账单是10&#xff0c;消耗一个5&#xff0c;增加一个10情况三&#xff1a;账…