从零开始理解HTTP协议,看完绝对能让你理解 !
Posted 小羊教你来编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始理解HTTP协议,看完绝对能让你理解 !相关的知识,希望对你有一定的参考价值。
HTTP协议解析
目录:
一.认识HTTP
1.HTTP理解
HTTP协议 (Hyper Text Transfer Protocol)是超文本传输协议,是一个基于TCP/IP通信协议来传输对应的数据(html文件. 图片文件 等…), 是个客户端和服务端互联的标准 客户端是终端用户(个人电脑),服务器端就是我们所访问的网站,客户端发起一个到服务端口(默认端口:80)的HTTP请求.
https协议就是对http协议进行了加密,提升了安全性.
2.引入
我们这里简单介绍Fiddler这个软件,它的主要作用就是在我们进行上网(数据传输),对于我们所传输的包进行抓包操作,来找到对应的HTTP协议实现传输的具体代码.
当我们在上面打开百度搜索的时候,显示出对应的抓包数据:
二.HTTP的格式
三.首行–http
1.请求行
(1)请求方法
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法.请求方法:就是在上面的也就是对应的请求行前面的单词.
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT .
请求方法 | 具体描述 |
---|---|
GET | 请求指定的页面信息,并且返回实体主体. |
HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
DELETE | 请求服务器删除指定的页面。 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
(2)URI
URI就是这里的网址编码,是一个标识符,用来找到对应的IP,实现传输,它的本质其实和URL是一致的.只不过URI在这里所显示的功能就是起到标识的作用,而URL是起到具体的对应的地址的作用.
(3)URL
URL是这里的网址
1> 协议名称
----这里是查看所遵循的协议
2>用户名:密码
----对于用户名这里一般是省略的,提高安全性
3>域名
----域名:是服务器的别名–最终访问服务器需要经过域名解析得到对应的服务器IP地址
4>端口
----端口(port):相当于将服务器的连接进一步的具体化
5>资源路径
----资源路径: 是一个相对的根目录
6>查询字符串
----提供给服务器的数据
7>标识
----等于表明网址开始的位置(当我们打开一个网址的时候,它默认都是位于最上端,因为从这里往下,显示的是你要查询的数据)
(4)协议版本
这里的HTTP/1.1就是对应的协议版本
2.响应行
(1)协议版本
----对所应用的协议版本的描述
(2)响应状态码
----直观的向客户端反馈的结果
状态码 | 描述 | 典型例子 |
---|---|---|
1xx | 一些对应的描述信息 | 101-协议切换状态码 |
2xx | 表示本次请求正确处理 | 200 |
3xx | 重定向-表示本次的请求移动到你的链接处,但是原链接依然可以用 | 301/302 |
4xx | 表示客户端错误 | 404 |
5xx | 表示服务器错误 | 502-里服务器没有收到正确的响应 504-超时 |
(3)状态码描述
----针对其状态的文字描述
四.头部–http
----中间这里的数据段就是对于key:val的键值对
五.空行–http
----是头部最后一个字段结尾\\r\\n组成的连续的\\r\\n\\r\\n作为特殊标志,作为http头部结尾特殊标志
六.正文–http
----这里就是对应的正文数据
http是一个应用层的协议,只是应用程序如何沟通的一种数据格式的约定.在传输层的tcp实现,http客户端实际上就是一个tcp客户端,http服务器实际上就是一个tcp服务器,只不过http客户端与服务端的通信使用的是HTTP协议来约定数据格式而已.
七.搭建一个http服务器
步骤:
1.搭建tcp服务端
2.去新建连接
3.使用新建连接,等待接收数据
4.接收过程: 首先接收http头部,解析头部,确定正文的长度
5.接收指定长度的正文
6.根据请求方法和资源路径确定客户端的请求目的
7.进行具体对应的业务处理
8.组织http协议格式的响应数据对客户端进行回复
9.如果是短连接,直接关闭套接字,如果是长连接,则继续等待接受数据
#include "tcpsocket.hpp"
#include <sstream>
int main(int argc, char *argv[])
{
if (argc != 3) { //判断首行是有三串字符
printf("usage: ./tcp_src 172.17.0.16 9000\\n"); //这里是对应的公网地址,选择arg0
return -1;
}
std::string srvip = argv[1]; //取出对应的请求方法
uint16_t srvport = std::stoi(argv[2]); //对对应的URI进行转换
TcpSocket lst_sock; //定义对应的socket结构体
CHECK_RET(lst_sock.Socket());
CHECK_RET(lst_sock.Bind(srvip, srvport)); //绑定
CHECK_RET(lst_sock.Listen()); //监听
while (1) { //循环内部开始通信
TcpSocket clisock; //取出对应的相关信息
std::string cliip;
uint16_t cliport;
bool ret = lst_sock.Accept(&clisock, &cliip, &cliport); //接受数据
if (ret == false) {
continue;
}
std::string buf;
clisock.Recv(&buf); //接受
std::cout << "request:[" << buf << "]\\n";
std::string body; //下面是正文对对应的数据在网页上表达
body = "<html><body><h1>Hello Bit</h1></body></html>";
std::stringstream ss;
ss << "HTTP/1.1 500 OK\\r\\n";
ss << "Connection: close\\r\\n";
ss << "Content-Length: " << body.size() << "\\r\\n";
ss << "Content-Type: text/html\\r\\n";
ss << "Location: http://www.baidu.com\\r\\n";
ss << "\\r\\n";
ss << body;
clisock.Send(ss.str()); //发送
clisock.Close(); //短连接则关闭
}
lst_sock.Close(); //关闭对应的socket
}
以上是关于从零开始理解HTTP协议,看完绝对能让你理解 !的主要内容,如果未能解决你的问题,请参考以下文章
看完让你彻底理解 WebSocket 原理,附完整的实战代码(包含前端和后端)