网络基础--应用层
本文将重点介绍TCP/IP四层结构模型中的应用层。
⏰应用层
应用层是我们在之前的学习中,接触的最多的一层结构,我们所写的应用程序都是运行在应用层的。
🕛再谈“协议”
我们之前简单的认识过了协议,并说过协议本质是一种“约定”。而在之前关于套接字编程中的接口介绍中,我们都是以字符串为形式来进行传输的,那么如果我们要传输的是结构化的数据呢?下面我们通过一个网络简易计算器的例子来具体介绍一下有关结构化数据传输的协议。
🕒简易网络计算器
如果我们将实现一个简易的加法器服务端,那么就需要客户端将两个操作数及运算符发送到服务端,经由服务器计算再返回给客户端。那么客户端应该以什么方式将数据传输过来呢?
第一种协议制定可以是:
客户端以字符串的方式发送类似"3+2"
的字符串;而这个字符串中的两个操作数均为整型;运算符为字符'+'
,而且作为加法器,中间的字符只能是'+'
;数字与字符之间没有空格…
第二种协议制定方案:
定义结构体来表示我们要传输的数据;发送数据时将结构体按照某种规则转换成字符串,接受时再按照同样的规则转换为结构体;这个过程叫做序列化与反序列化。
无论我们采用方案一, 还是方案二, 抑或是其他的方案, 只要保证 一端发送时构造的数据, 在另一端能够正确的进行解析, 就是没有问题的. 这种约定, 就是 应用层协议。
//协议制定
namespace ns_protocal
{
struct Request
{
int x;
int y;
char op;
Request()
:x(0)
,y(0)
,op('+')
{
}
};
struct Response
{
int ans;
int status;
Response()
:ans(0)
,status(0)
{
}
};
}
具体代码可以参考:网络版简易计算器实现
🕛HTTP协议
虽然说应用层协议是程序员自己定的,但其实已经有计算机界的大佬制定了一些现成的、并且非常好用的应用层协议,可以供我们直接参考使用。HTTP(超文本传输协议)就是其中之一;接下来我们将介绍HTTP协议。
🕒HTTP协议格式
在正式介绍HTTP协议之前,我们先来认识一下url。
🕕认识URL
平时我们俗称的网址其实就是url(Uniform Resource Locator,统一资源定位符),比如我们所熟知的www.baidu.com
就是一个url。以https://www.baidu.com/index.html
这个网址为例,url的组成有:
- 1.https:// 为协议方案名,此处代表超文本传输安全协议。
- 2.www 代表一个Web(万维网)服务器,通常在访问时都可以省略。
- 3.baidu.com/ 服务器域名,或站点服务器的名称。
- 4.index.html 为文件路径,此处为网站服务器根目录下的一个html文件。
🕕urlencode与urldecode
实际上,在url中,像/ ? :等这样的字符已经被url当作特殊意义处理了,因此这些字符不能随意出现。如果某个参数中带有这些特殊字符就需要对这些特殊字符进行转义。
转义的规则为:将需要转码的字符转为16进制,然后从右到左,取4位,(不足4位直接处理),每2位作为一位,前面加上%,转换为%XY的格式。
上述过程即为urlencode,而urldecode则是urlencode的逆过程。
urlencode工具
🕒HTTP协议格式
- HTTP请求
我们通过TCP的socket编程来探究一下HTTP请求的格式,HTTP的服务器套接字编程与之前的套接字并无区别,其中我们直接将浏览器的访问请求打印出来:
static void* HandlerRequest(void* args)
{
int sock = *(int*)args;
delete (int*)args;
cout << "################### begin: " << sock << " #######" << endl;
char buf[4096];
ssize_t s