从零开始理解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
}
  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值