从零开始理解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请求服务器删除指定的页面。
CONNECTHTTP/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协议来约定数据格式而已.

TCP的详细实现

七.搭建一个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 原理,附完整的实战代码(包含前端和后端)

小白入门——如何从零开始学习Python,过来人的一些学习经验,能让你少走弯路

Java开发从零开始!高级java工程师面试宝典

Java开发从零开始!高级java工程师面试宝典

这六个 MySQL 死锁案例,能让你理解死锁的原因!

图解Raft算法原理(从零开始学区块链 46)