网络之HTTP协议

news/2024/10/18 16:35:20/

http协议

  • URL
  • urlencode编码 与 urldecode解码
  • HTTP协议格式
    • HTTP请求
      • 请求首行
      • 请求头部(Header)
      • 空行
      • 正文(Body)
    • HTTP响应
      • 响应首行
  • HTTP请求方法
  • HTTP状态码
  • HTTP常见Header


HTTP是典型的应用层协议,是目前最流行的通信协议,没有之一。
其衍生出了封装SSL协议的“安全版”:HTTPS协议,相对于传统的HTTP协议更为安全,但也是“相对的安全”。

只要保证通信传输一端发送时构造的数据, 在另一端能够正确的进行解析, 就是可以的,这种约定就是 应用层协议。是应用程序之间的沟通,这其中也涉及序列化与反序列化

序列化:将数据按照持久化存储或网络数据传输的格式进行排布。
反序列化:对数据以指定的协议进行解析。

虽然应用层协议是程序猿自定制的的。但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一。


URL

平时我们俗称的 “网址” 其实就是 URL(统一资源定位符号(Uniform Resource Locator),其格式为:
在这里插入图片描述


urlencode编码 与 urldecode解码

/?: 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现。

比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.

转义的规则如下:
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做位,前面加上%,编码成%XY格式。

例如在百度上搜索C++,其URL为:
https://www.baidu.com/s?wd=C%2B%2B&rsv_spt=1…
其中的%2B%2B就是转义字符,"%2B"就是"+"字符的转义字符。

网上编码解码的工具很多,这里简单介绍一个以便读者使用:【 http://tool.chinaz.com/Tools/urlencode.aspx 】


HTTP协议格式

通过分析数据包数据就可以明晰网络通信原理,这里我们使用fiddler工具进行抓包,其界面如下,从中就可以获得HTTP请求数据、响应数据等。
在这里插入图片描述

HTTP请求

请求格式为:请求首行请求头部空行正文

	//利用随意抓取的一个数据包举例:
GET http://neirong.funshion.com/airport/lua/fire.php?name=Fireman&cid=1001799 HTTP/1.1
Cache-Control: max-age=43200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko Funshion/1.0.0.1
Host: neirong.funshion.com
Connection: Keep-Alive
Pragma: no-cacheA SSLv3-compatible ClientHello handshake was found. Fiddler extracted the parameters below.
Version: 3.3 (TLS/1.2)
Random: 18 75 2D C6 A0

请求首行

格式为:[方法] + [url] + [版本]

[GET] 
[http://neirong.funshion.com/airport/lua/fire.php?name=Fireman&cid=1001799] 
[HTTP/1.1]

请求头部(Header)

请求的属性, 冒号:分割的键值对。每组属性之间使用\n分隔;

Cache-Control: max-age=43200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko Funshion/1.0.0.1
Host: neirong.funshion.com
...

空行

请求头部信息遇到空行表示Header部分结束。(连续遇到2个\r\n就认为是头部信息结束了)

正文(Body)

空行后面的内容都是Body. 它允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度;


HTTP响应

在这里插入图片描述

响应首行

格式为: [版本号] + [状态码] + [状态码解释]

[HTTP/1.1] [200] [OK]

其他都与请求的元素相同,包含Header、空行、Body


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
TRACE追踪路径1.1
CONNECT要求用隧道协议连接代理1.1
LINK建立和资源之间的联系1.0
UNLINK断开联系1.0

其中最常用和常见的还是GETPOST方法。
在这里插入图片描述

HTTP状态码

/类别原因
1xx信息性状态码接收的请求正在处理
2xxSuccess(成功请求的数据处理完毕
3xxRedirection(重定向需要进行附加操作以完成请求
4xxClient Error(客户端错误)服务器无法处理请求
5xxServer Error(服务器错误)服务器处理请求出错

最常见的状态码, 比如 :
200(OK)
404(Not Found)
403(Forbidden,没有权限)
404(Not Found)
302(Redirect, 重定向)
504(Bad Gateway,坏的网关)


HTTP常见Header

  • Content-Type: 数据类型(text / html等)
  • Content-Length: Body的长度
  • Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
  • User-Agent: 声明用户的操作系统和浏览器版本信息;
  • referer: 当前页面是从哪个页面跳转过来的;
  • location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
  • Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void Usage() {printf("usage: ./server [ip] [port]\n");
}
int main(int argc, char* argv[]) {if (argc != 3) {Usage();return 1;}int fd = socket(AF_INET, SOCK_STREAM, 0);if (fd < 0) {perror("socket");return 1;}struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(argv[1]);addr.sin_port = htons(atoi(argv[2]));int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));if (ret < 0) {perror("bind");return 1;}ret = listen(fd, 10);if (ret < 0) {perror("listen");return 1;}for (;;) {struct sockaddr_in client_addr;socklen_t len;int client_fd = accept(fd, (struct sockaddr*)&client_addr, &len);if (client_fd < 0) {perror("accept");continue;}char input_buf[1024 * 10] = {0}; // 用一个足够大的缓冲区直接把数据读完.ssize_t read_size = read(client_fd, input_buf, sizeof(input_buf) - 1);if (read_size < 0) {return 1;}printf("[Request] %s", input_buf);char buf[1024] = {0};const char* hello = "<h1>hello world</h1>";sprintf(buf, "HTTP/1.0 200 OK\nContent-Length:%lu\n\n%s", strlen(hello), hello);write(client_fd, buf, strlen(buf));}return 0;
}

编译, 启动服务. 在浏览器中输入 http://[ip]:[port], 就能看到显示的结果 "Hello World"
在这里插入图片描述

此处我们使用 9090 端口号启动了HTTP服务器. 虽然HTTP服务器一般使用80端口,但这只是一个通用的习惯. 并不是说HTTP服务器就不能使用其他的端口号.


http://www.ppmy.cn/news/149360.html

相关文章

基于Halcon卡尺测量: Metrology批量测量矩形和圆

处理图如下: 原图如下: 主要思想: 1.准备一次性将图中12个圆和2个矩形都检测出来 2.初步确定12个圆的圆心坐标和半径,初步确定两个矩形的中心坐标,角度,长短边长 3.创建计量模型 4.定义计量模型尺寸 5.增加检测矩形和圆形的信息参数 6.应用计量模型,获取结果 7.显示…

7min 到 40s:SpringBoot 优化居然可以玩出这么多花样!

0 背景 公司 SpringBoot 项目在日常开发过程中发现服务启动过程异常缓慢&#xff0c;常常需要6-7分钟才能暴露端口&#xff0c;严重降低开发效率。通过 SpringBoot 的 SpringApplicationRunListener 、BeanPostProcessor 原理和源码调试等手段排查发现&#xff0c;在 Bean 扫描…

关于对【mysql存储过程】的理解与简述

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/130857854 出自【进步*于辰的博客】 【存储过程】这个知识点&#xff0c;我在大二下期学习【mys…

LNMP架构

LNMP架构 一、LNMP架构原理二、LNMP部署1、安装 Nginx 服务1.安装依赖包2.创建运行用户3.编译安装4.优化路径5.添加 Nginx 系统服务 2、安装 MySQL 服务1.安装Mysql环境依赖包2.创建运行用户3.编译安装4.修改mysql 配置文件5.更改mysql安装目录和配置文件的属主属组6.设置路径环…

linux桌面播放视频播放器,五个最佳桌面媒体播放器

你的硬盘里可能有数百兆的音乐和视频文件&#xff0c;因此你需要一个完美的桌面媒体播放器&#xff0c;不仅仅能够完美博客你所有的多媒体文件&#xff0c;还能帮助你找到你需要的歌曲或电影&#xff0c;这里我们就推荐了五个英文的桌面媒体播放器&#xff0c;相信能帮助用户找…

android 音乐播放器评测,Android平台四大音乐播放器对比评测

一、软件界面&#xff0c;谁美观 现如今&#xff0c;谷歌android手机系统越来越流行&#xff0c;在此平台上的应用软件也逐渐增多。今天&#xff0c;我们就天天动听、Winamp、酷我听听、QQ音乐等四款较常用的天气软件作一番评比&#xff0c;看看它们在android平台上的表现。 参…

linux视频播放器软件下载,360万能播放器Linux版

360万能播放器Linux版最新版是一款在Linux系统上的视频播放器。自动扫描本地文件&#xff0c;根据自己的喜好分类视频音频&#xff0c;自主制作播放列表&#xff0c;容易选择再生顺序和方式&#xff0c;可以按顺序再生&#xff0c;也可以进行单循环。可以调节屏幕的播放率&…

html5 audio音频播放器

html5开启了一个新时代&#xff0c;因为它让浏览器本身变得不那么被动&#xff0c;audio api就是一个典型的列子&#xff0c;在html5还没确定之前&#xff0c;如果想要在网页上听音乐看视频唯一的办法就是用flash 意思是当你没有给浏览器装载Flash插件的话 那么音乐视频即是空谈…