🎁个人主页:我们的五年
🔍系列专栏:Linux网络编程
🌷追光的人,终会万丈光芒
🎉欢迎大家点赞👍评论📝收藏⭐文章
Linux网络编程笔记:
https://mp.csdn.net/mp_blog/manage/column/allColumnList
前言:
当然先祝大家新年快乐!
我们访问网站,就是与对应的服务器进行IO,把我的请求给服务器,服务器给我对应的数据,或者处理问题的结果。URL是统一资源定位符,用来区分某个资源的地址。简单来说就是我们日常用的网址。
目录
1.URL
1.1概念解释
1.2基本格式:
1.3URL-Decode,URL-Encode
1.4URL-encode工具:
2.HTTP协议
2.1https与http
2.2http的宏观格式:
2.3http版本直接区别:
2.4实例代码:
3.telnet命令:
1. 测试网络服务
2. 远程登录
3. 调试网络问题
1.URL
1.1概念解释
URL:Uniform Resource Locator(统一资源定位器)。
URL是互联网上用来标识某一处资源的地址。它是一个标准的网络地址格式,用于指定网络资源的位置和访问方式。
所以URL就帮我们定位我们想要的资源在哪里(在哪里),和怎么去访问(怎么做)。
例如:
下面就是我们在百度的网址,直接在浏览器输入这个,就能访问百度。
https://www.baidu.com/
1.2基本格式:
scheme://host[:port]/path?query#fragment
scheme:表示协议类型。如:http,https。
host:表示服务器域名,或者IP地址。
port:表示端口号,http默认使用80端口号,https默认使用443端口号。现在大多是没有显示出来,访问的时候,浏览器会帮我们自动补充。
path:表示资源的路径,想访问服务器具体的哪个资源。注意:/表示不一定是根目录,而是web的更目录。
query:查询的字符串,向服务器传递参数。是一对一对的key=value,多个key=value用&连接。
1.3URL-Decode,URL-Encode
当我们查询一些特殊字符的时候,会对这些字符进行encode。
Decode的方法是:按ASII码表,把它转成16进制,然后加上百分号%。
wd=%5C%25%24%23%40!
\%$#@!上面就是浏览器帮我们进行的encode。
\的ASII码表是:92,对应的就是5C。然后再加上百分号%
1.4URL-encode工具:
点击这里:
UrlEncode编码/UrlDecode解码 - 站长工具
2.HTTP协议
Http的第一次介绍,更全的会在后面慢慢补充。
http是建立在TCP上面的,TCP是有连接,面向字节流的。
2.1https与http
现在我们看到的基本是https了,然后https也是http发展而来的,https更加安全。现在在这个信息时代,保证信息的安全性是非常重要的。
HTTPS 是 HTTP 的安全版本,通过在 HTTP 和 TCP 之间添加 SSL/TLS 层来实现数据加密。HTTPS 的主要作用是保护数据的隐私和完整性,防止数据在传输过程中被窃取或篡改。
-
数据加密:通过 SSL/TLS 加密数据,确保数据在传输过程中不被窃取。
-
身份验证:通过数字证书验证服务器的身份,确保客户端连接到的是正确的服务器。
-
完整性保护:通过加密算法确保数据在传输过程中不被篡改。
客户端发起 HTTPS 请求。
服务器发送 SSL/TLS 证书。
客户端验证证书的有效性。
客户端和服务器协商加密算法和密钥。
客户端和服务器通过加密通道进行数据传输。
2.2http的宏观格式:
http有请求模式和应答模式,这两个的格式基本差不多,但是第一行有点区别。
请求行包含:
1.请求方法。2.URI。3.http版本。
请求方法是GET,POST等。
响应行:
1.http版本。2.错误码。3.错误描述。
都是以\r\n进行结尾,报头和正文有一行空行进行区分。
每一个信息直接都有空格隔开,请求方法和URI有空格隔开,和http版本直接也有空格隔开。
2.3http版本直接区别:
现在用的http版本有1.0,1.1,2.0的。然后现在用的是1.1或者2.0了。
HTTP/1.0:简单但性能低下,适合早期的静态网页。
HTTP/1.1:解决了 HTTP/1.0 的许多性能问题,引入了持久连接和内容压缩等功能,是目前广泛使用的版本。
HTTP/2:在性能和功能上进行了重大改进,通过多路复用、头部压缩和服务器推送等技术,显著提高了传输效率和用户体验。
2.4实例代码:
#pragma once
#include <iostream>
#include <string>
#include <functional>
#include <unordered_map>
#include <fstream>
#include <ios>#include "TcpServer.hpp"using namespace TcpServerModule;class HttpServer
{const std::string sep = "\r\n";const std::string blank_line = "\r\n";public:HttpServer(int port): _tsvr(std::make_unique<TcpServer>(port)){}void Start(){_tsvr->InitServer([this](SockPtr sockfd, InetAddr client){ return this->HandlerHttpRequest(sockfd, client); });_tsvr->Loop();}// 处理http的方法bool HandlerHttpRequest(SockPtr sockfd, InetAddr client){LOG(LogLevel::DEBUG) << "Get a new client:" << sockfd->Fd() << "addr info:" << client.Addr();std::string s;sockfd->Recv(&s);std::cout << s << std::endl;std::string status_line = "HTTP/1.1 200 OK" + sep + blank_line;char body[1024*1024];std::ifstream ifs("./html.txt",std::ios_base::in | std::ios_base::binary);ifs.read(body,sizeof(body));std::string httpresponse = status_line + body;sockfd->Send(httpresponse);return true;}~HttpServer() {}private:std::unique_ptr<TcpServer> _tsvr;
};
3.telnet命令:
telnet [选项] [主机名或IP地址] [端口号]
telnet
是一个用于网络协议测试和远程登录的命令行工具,它允许用户通过 TCP 连接到远程服务器上的特定端口,进行交互式通信。
主机名和IP地址:表示要连接的远端的IP地址。
端口号表示要连接的端口号,如果不指定,就默认是23.(telnet服务的标准端口)
1. 测试网络服务
telnet
命令可以用来测试各种网络服务是否正常运行。例如,测试 HTTP 服务是否正常:
telnet example.com 80
连接成功后,可以手动输入 HTTP 请求:
GET / HTTP/1.1
Host: example.com
然后查看服务器的响应。
2. 远程登录
虽然现代网络中更推荐使用 ssh
(更安全),但 telnet
仍然可以用于远程登录到某些旧系统:
telnet example.com
3. 调试网络问题
telnet
可以用来检查网络连接是否正常。例如,检查是否可以连接到某个端口:
telnet example.com 25
如果连接失败,可能表示网络问题或目标端口未开放。