前言
本文的主要目标是用C++实现一个webServer,但在实现一个WebServer的前提下,我们首先需要知道什么是WebServer。
它其实很简单,当你浏览到本页面时,就已经在访问一个webServer了。
到目前为止,我想你应该对TCP与UDP协议已经不陌生了,并且已经能够用它们进行熟练的编程了。
比如写一个简单的聊天室,应该没问题了吧?如果还不会,本站的其它文章:网络编程详解
一个Web服务器,其本质也是一个服务器,底层使用的协议就是TCP协议。
也就是说,我们想要手写一个Web服务器,实际上是在手写一个TCP服务器而已。
这么一说,是不是就觉得
web服务器其实也不那么神秘了!
但既然它有了一个新名字,那必然就与普通的TCP服务器有所差别。
而其差别就在于:web服务器需要遵守一定的规则来 发送/接收 字符串,这个规则就叫做:HTTP协议
拿一个最简单的例子来说,当你想要看到本页内容,首先就需要先得到本页内容在本站服务器上的路径,也就是当前你的浏览器上方的那个链接。
以这个本站主页链接举例:https://www.kucoding.com/
有了这个链接,将其复制到网址栏,按下回车,你的浏览器就会作为一个TCP客户端,向本站点的服务器发送一个连接请求。
这里大家可能有个疑问,那就是我们平时编程时都用的ip地址与端口号进行连接的,这里也没看到这两个东西呀?
其实是有这两个东西的。
比如IP地址,浏览器会先发送一个请求获取域名www.kucoding.com的ip地址,也就是完整链接中间那一段,只是ip地址对我们来说是不可见的。
而端口,由于http协议默认为80端口,https默认为443端口,所以也给我们省略了
这个域名怎么来的?那就需要自己去购买了,一般都是几十块一年,购买后,绑定到自己的ip地址,这样你就也能通过域名来访问你的ip地址了。
这里同样提到了另一个https协议,是在http的基础上添加了一个s,即安全层(Secure)。
因为前面提到了,http是通过服务器与客户端直接发送一定规则字符串实现的,所以很容易被人拦截直接看到其中传输的内容,因此需要添加一个安全层,也就是先加密,再传输,到达之后再解密。
举个实际的例子,还是以上面那个链接为例,我们可以通过ping命令获取到本站点服务器的ip地址:

然后将这个链接前面那串域名替换为这个ip地址:`/media/labs/cpp/12-handwritten-webserver/202309141039489.png)
可以看到,:443会被自动省略掉,并且禁止访问
这是因为https多了一个安全层,需要对域名进行校验,但我们这里直接用的ip地址访问,没有域名,校验失败,就出现了错误(如果是http协议,那么就不会有这个问题了)
HTTP协议基础
现在,我们已经知道了web服务器实际上就是一个发送与接收固定规则字符串的TCP服务器
那么下一步我们需要知道的就是,这个规则是什么?
实际上的规则很简单,对于客户端而言,其固定协议如下面所示:
Method URL HTTP/Version
Header1: Value1
Header2: Value2
Body
首先是方法:Method
一般我们浏览器网页,用到的都是GET方法,即获取的意思,本文也将以GET方法为例子作为讲解。
然后是URL,即资源路径,比如前面提到的那个链接:`/media/labs/cpp/12-handwritten-webserver/202309141032550.png)
服务器就会通过这个来识别当前我们用的设备、浏览器版本之类的东西。
然后中间以一个空行作为分隔,后面的Body为请求体,但由于GET请求不需要,所以就没有它。
但服务器要响应这个GET请求时,却需要将要显示的网页内容通过响应体发送回来,只是叫法不同,实际上两者都指的是这个Body。
服务器协议为:
HTTP/版本号 状态码 状态信息
响应头信息
响应体
只有第一行与客户端不同,其它都一样的,下面一个实例举例子:
比如GET请求index.html页面:
GET /index.html HTTP/1.1
Accept: text/html
这个的请求头我只写了一个Accept,即客户端可接受的资源类型,为text/html,即html文本,没有请求体
然后我们的服务器就可以发出响应了:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
请开通后继续阅读后续 70% 并运行完整示例~
DISCUSSION
评论 0
还没有评论,来留下第一条吧。