百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

c/c++ Linux HTTP协议 九大要素

bigegpt 2024-11-27 11:45 37 浏览

目录:

一、什么是HTTP

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

HTTP是一个属于应用层的面向对象的协议,基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

二、HTTP之URL

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息

URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。其实也就是我们平时上网所看到的网址

先来看一个标准的URL格式:

再来从网页上找出一个网址来分析URL内容:

https://www.so.com/s?q=C%2B%2B&src=srp&fr=none&psid=a9aeee8bb3fd74a7c3497e1c34903b84

协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在”HTTP”后面的“//”为分隔符

域名部分:该URL的域名部分为“www.so.com/s”。一个URL中,也可以使用IP地址作为域名使用,例如”192.168.0.178“

端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口;

https的默认端口号是443,http的默认端口号是80

目录部分:域名后面跟的“/s”,这里表示的是你所查找资源的根目录,其中s是一个可执行程序,去服务器上查找关键字,在进行检索任务

参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“q=C%2B%2B&src=srp&fr=none&psid=a9aeee8bb3fd74a7c3497e1c34903b84”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

四、HTTP之urlencode和urldecode

urlencode

上面的网址是自己搜索的关键词是C++,但是里面没有出现,而出现了”c=%2B%2B“等,这些字符都被当做特殊意义处理过了,这些被转义字符的转移规则为:将需要转码的字符转为16进制,然后从右向左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%xy的格式

urldecode

decode就是encode的逆过程,将编码格式为%xy转义成正常的字符

五、HTTP之请求消息Request

当客户端向服务器端发送一个请求应该包含以下信息:

一个例子:

通过抓包工具fiddler抓取到http的请求报文,可以看到以下信息:

请求行:请求方法为GET;URL(请求的资源)是http://192.168.0.198:8080/ ;版本号是HTTP/1.1

请求报头: 第二行至第七行,分别为:

HOST:目标服务器,这里显示的是ip和端口号

Connection:常连接(底层使用TCP协议,表示进行一次TCP连接,发送完数据不会关闭连接)

User-Agent:浏览器的版本

Accept:表示请求的资源,也是客户端可以接受的资源

Accept-Encoding:接受的编码格式

Accept-Language:接受的语言

六、HTTP之响应Response

当服务器向客户端响应时,响应报文应该包含以下格式

下面通过抓包工具来查看响应报文:

状态行:http的版本,状态码200 状态描述为OK

响应报头:这里只显示了资源的大小

空行:注意到长度下面是一个空行,不是响应的正文

响应的正文:这里是一个网页显示的一个字符串,hello world

七、HTTP的状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

1xx:指示信息–表示请求已接收,继续处理

2xx:成功–表示请求已被成功接收、理解、接受

3xx:重定向–要完成请求必须进行更进一步的操作

4xx:客户端错误–请求有语法错误或请求无法实现

5xx:服务器端错误–服务器未能实现合法的请求

常见状态码:

200 OK //客户端请求成功

400 Bad Request //客户端请求有语法错误,不能被服务器所理解

401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用

403 Forbidden //服务器收到请求,但是拒绝提供服务

404 Not Found //请求资源不存在,eg:输入了错误的URL

500 Internal Server Error //服务器发生不可预期的错误

503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

更多状态码:https://blog.csdn.net/zhangye3017/article/details/78429605

八、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

CONNECT要求用隧道协议连接代理 1.1

在这里重点说一下GET和POST的区别:

GET请求

GET /books/?sex=man&name=Professional HTTP/1.1

Host: www.wrox.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

Gecko/20050225 Firefox/1.0.1

Connection: Keep-Alive

注意最后一行是空行

POST请求

POST / HTTP/1.1

Host: www.wrox.com

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

Gecko/20050225 Firefox/1.0.1

Content-Type: application/x-www-form-urlencoded

Content-Length: 40

Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley

T提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.

GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.

GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

九、实现一个简单的HTTP服务器

#include <stdio.h>

#include <unistd.h>

#include <sys/socket.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <string.h>

// ./server ip地址 端口号

int main(int argc,char* argv[])

{

//进程 ip地址 端口号

if(argc != 3){

perror("Usage ./server [ip] [port]\n");

return 1;

}

//ipv4 面向字节流 创建socket

int new_sock = socket(AF_INET, SOCK_STREAM,0);

if(new_sock < 0){

perror("socket");

return 2;

}

struct sockaddr_in server;//绑定的是服务器的ip和端口号

server.sin_family = AF_INET;//协议族

server.sin_addr.s_addr = inet_addr(argv[1]);//将ip专程4字节ip地址,在转成大端字节序

server.sin_port = htons(atoi(argv[2]));

//绑定端口号

int ret = bind(new_sock, (struct sockaddr*)&server,sizeof(server));

if(ret < 0){//绑定失败

perror("bind");

return 3;

}

//设置成监听状态,socket文件描述符,第二个参数为连接客户端的最大个数

int lis = listen(new_sock, 5);

if(lis < 0){

perror("listen");

return 4;

}

printf("listen success...\n");

struct sockaddr_in client;

while(1){

//获取与客户端的连接,这里的结构体获取的是客户端的ip和端口号,还没传过来

socklen_t len = sizeof(client);

int client_sock = accept(new_sock,(struct sockaddr*)&client, &len);

if(client_sock < 0){//获取失败,接着获取

perror("accept");

continue;

}

printf("Get connet[%s]:[%d]\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));

char buf[1024*10];

read(client_sock,buf,sizeof(buf)-1);

printf("%s\n", buf);

char msg[1024*10] = {0};

const char* hello = "hello world";

sprintf(msg, "HTTP/1.1 200 OK\nContent-Length:%lu\n\n%s",strlen(hello),hello);

//将数据写回客户端

ssize_t w = write(client_sock, msg, strlen(msg));

}

close(new_sock);

return 0;

}

效果:

抓包 得到的结果:

更多c/c++ Linux免费视频资料获取 后台私信【架构】

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...