详细后端开发知识讲解

一. 前言前端

本片文章面向后端开发,讲述后端在进行开发时所使用的WEB服务器的工做流程,正所谓知根知底,WEB服务器是后端开发人员平常用于调试WEB程序和与前端通信的一种方式!算法

WEB服务器最为强大的地方是可以执行WEB程序,其WEB程序的编程语言并无明确的规定,由于只要你所使用的服务器支持这样的程序就能够了!数据库

WEB服务器更像是一个平台,在此平台上编写软件咱们称其为WEB编程,注:WEB编程下有许多规范好比CGI,FastCGI等等,这个是要看服务器的支持范围!apache

不一样服务器所使用的规范不一样,好比JSP服务器只能运行由JAVA EE编写的WEB程序,不能用于运行像C/C++、Python等编程语言编写而成的WEB程序!编程

一般状况下的WEB服务器所使用的编程规范均为CGI编程、只能运行CGI规范的程序,除了一些例外的WEB服务器,好比JSP服务器!后端

二. CGI规范,WEB服务器执行过程数组

什么是CGI规范?浏览器

CGI是Common Gateway Interface的缩写,其意义为公用网关接口,意思能够理解为:在WEB服务器上运行一个程序或脚本,而且WEB服务器要将脚本执行结果返回给浏览器(客户端)!服务器

规范从何而谈?网络

规范的意思是,不管你使用任何语言编写,都必须使用输出函数(cout,printf,print)输出HTML格式的数据信息,WEB服务器根据这些信息传递给浏览器,浏览器HTML树并将其显示到浏览器当中,即为一个WEB页面!

更加深层次的来讲其实,不管你使用什么语言编写,只要在WEB服务器中的配置文件中,使其支持CGI编程,而后将你编译完成的二进制可执行文件后缀名改成.cgi,最后前端页面在使用get或post方法请求这个WEB程序,WEB服务器会自动执行这个程序并将其结果送回给浏览器(TCP/IP协议)!

实际执行是由操做系统来完成的,只是WEB服务器将程序中打印输出的字符信息给重定向到WEB服务器当中了,即WEB服务器在调用你的CGI程序时会使用一条操做系统都有的命令,重定向:

>>

printf或cout等打印函数的底层实现过程是将数据写入到显存中,根据要打印字符的位置并把位置写入到显存下,GPU会根据显存数据在屏幕点亮像素点中对应的二极管(RGB),通常字符字体都是由操做系统来完成的,由于字体的不一样,笔画也就不一样!printf会把要打印的字符数据转交给操做系统,在从用户态到内核态之间的转换,在到显存,且也要考虑编码的问题,由于不一样的编码对应不一样的数据,printf只会移交ASCII(最底层是没有字符这个概念的只有二进制码,而二进制码能够转换成ASCII码)码,操做系统须要根据当前程序使用的编码,并将ASCII码转换成当前编码要输出的字符,而且操做系统也要考虑屏幕分辨率,比较分辨率的不一样像素点占用就不一样!

其当服务器在执行CGI程序时,也能够不用把程序后缀改成.CGI,你能够在配置文件中增长支持的扩展后缀名:.exe、.py、.c、.elff(ARM可执行文件/Linux可执行文件,Linux就是为ARM设计的)

注意若是你配置成源文件的格式须要WEB服务器的支持,好比apache服务器,仅支持py文件,apache服务器会自动编译.py文件并执行!

若是是在Linux或MAC系统下须要设置目录权限:

chown -R 555 //全部访问权限

如何接受从服务器传递来的信息?

当咱们前端页面向WEB服务器发送一个请求时(get/post)会有一个传参,里面包含着请求数据,好比:

https://www.zzhblog.cn/c.cgi/?utm_source=csdnbar

其意思为,请求www.zzhblog.cn服务器下的c.cgi程序,并向其传递一个参数,参数名为:utm_source,参数数据为:csdnbar

也有这样的:

https://www.zzhblog.cn/?utm_source=csdnbar

没有请求的程序名,实际上是WEB服务器后台给隐藏掉了,你能够在本身的WEB后台中配置默认文件,即输入网站地址而无需指定文件名,访问即返回默认文件!

或者隐藏请求文件名,WEB服务器会把这些信息放到报文头了,浏览器接受到以后会自动隐藏!

那么咱们要怎样获得传递来的信息呢?这里就须要使用CGI提供的模块了,CGI提供了C/C++版的模块和Python等的模块,使用这些模块里的Get方法能够垂手可得的获取后台服务器传递过来的信息,而后在对这些数据进行处理,并把处理结果重定向给WEB服务器,最后WEB服务器将结构返回给浏览器,注意结果必须以HTML格式返回!


整个执行过程都是通过HTTP协议格式规范来的!

不过目前有的WEB服务器已经开发出本身的WEB服务器编程语言,也就是说该WEB服务器只能运行指定运行编译的程序,而且该语言下提供了不少较为方便的模块,能够调用直接读取一些相关数据,和处理数据的模块!

关于C/C++方面的WEB程序开发

C/C++编写WEB程序开发效率实在是很是之低,由于一般状况下咱们作WEB服务器处理,通常都是对字符的解析,而C/C++传递过来的GET或POST数据是一个完整的URL和报文,须要C/C++本身去解析这些数据,不像其余编程语言已经为其解析完成,拿过来直接处理便可,并且C/C++对字符处理方面库支持自己就不好,须要开发人员手动编写字符处理库,因此这也是为何你们不肯意使用C/C++作WEB服务器开发,由于要写不少代码,即便是由CGI模块的支持,但CGI模块只能用于获取WEB服务器传递过来的数据!

再则,C/C++自己就是一个不是易学,且要考虑内存泄漏问题的一个编程语言,如今不少编程语言会自动帮你释放不用且丢失的内存,解决内存泄漏,也就是托管式代码平台,经典的有:.net

C/C++WEB服务器开发效率与其余编程语言对比

C/C++须要编写不少代码来完成某个任何,极其下降后端开发效率,可是也提升我的编程能力,如今不少编程语言都提供了不少模块,来完成某些任何,甚至能够说不是编程语言,是脚本,专门调用C/C++写的代码,好比Python!

因为Python简单,模块多,能够简单调用模块处理许多复杂模块,因此很收后端开发人员的欢迎!

有的时候没有CGI模块,WEB服务器在开发文档中会告诉你,参数会存放在哪儿,哪一个临时文件中,或直接利用C/C++传参的方式传递:

a.out aaa aaa

a.out代码:

int main(int x,int *a[]){
}

这是最经典的方式,x表明参数数量,a表明参数!

a通常是个数组指针,指向每一个参数!

for(int i = 0;i < x;++i){
printf("%s",*a[i]);
}

CGI与FastCGI

CGI程序只能被请求一次,也就是说一次只能执行一个客户端发来的请求,假如说有一百个客户端同时请求这个程序,那么该程序要一个一个的执行!

FastCGI就是CGI的升级版,该规范能够同时以多线程的方法来执行CGI程序,一百个客户端同时请求CGI程序时,服务器就会同时执行一百个CGI程序来处理这些客户端,能够在WEB服务器的配置文件中修改选择对应的CGI和FastCGI方法,WEB服务器会根据这些方法来作对应的规范!

执行效率与算法

在前端把数据传递到后端之后,后端要着手处理这个数据,就拿搜索引擎为例子:当咱们在搜索引擎中输入相关数据时,要知道,在庞大的万维网平台中,网页资源几乎数不胜数,天天都会要上亿的新网页诞生。

搜索引擎中有一个叫蜘蛛的模块,用于将这些数据爬下来,也就是网络爬虫,保存到服务器本地上,假设你的搜索引擎服务器中有数百亿条数据,而且网页路径和域名,网页名在数据库里存储好的,那么当用户在浏览器里输入某个关键字时,就会找到海量的相同数据,那么后端人员要作的是将这些数据以热度并排名按从大到小的方式出如今搜索页面的下拉框里,供用户挑选,那么此时就考虑到算法的要求了,假若算法太复杂,那么后端执行个一两分钟才返回结果那么用户体验是否是就不好?


三. HTTP协议规范

这里不作详细介绍,由于博主以前有写过对HTTP/HTTPS协议规范的详细介绍,因此这里简明摘要!

HTTPS之因此叫HTTPS是由于在使用TCP协议加密时经过SSL算法进行加密,HTTPS传输过程比HTTP要更加耗时!

其次使用HTTPS握手过程须要证书验证,因此WEB服务器方也必须支持SSL协议!

在浩荡的互联网中,就像开车同样,当咱们开一辆货车运载资源时,不免会赶上堵车,那么此时就须要交通法则,来规定咱们怎样传输,从而避免网络堵塞的状况,同时也要避免两辆车互相撞在一块儿致使数据丢失,发生丢包的情况,因此HTTP协议规范用语规定互联网中应该怎样传输数据,好比HTTP协议规范肯定使用TCP协议来传递数据,防止由于网络拥堵或堵塞致使丢包的现象,实则上路线的选择是由猫(调制转换器)来决定的,猫会根据当前链接的线路情况来肯定最优的传输路线,而TCP只是规定怎样来完成此次的传输,传输路线是由猫来完成的,以及收,收到以后猫会把数据发送给网卡,网卡解析数据在发送给上层,也就是造成了网络七层的概念!


以上的APDU、PPDU即为封装,由于上层须要把本身的数据封装到一个包里,而后发给下层,下层在把这个数据拆开翻译意思,在根据意思添加本身的报文格式进去,即造成了APDU、PPDU包格式!

假如我要向IP为1.0.0的地方发送一个A的字符,那么须要填写IP地址和数据段信息,而后发送给传输层,传输层在把这个数据拆开分析其意思,而后在进行格式转换,压缩,肯定传输方式,在传送给下一层,这样作的方法是为了确保不一样的数据结果格式上的歧义问题(表示层之后的层格式是统一的,因此须要表示层来统一格式),而后在到物理层在转换成BIT的电路信号方式肯定最优路线发送到指定路由下,路由器接收到以后呢,在一步一步按照前面的步骤拆包,一步一步分析包,最终发送到电脑上的指定程序下!

其实像应用服务器,是没有七层这么个概念的,实则上就三层,应用层选择好路径,数据和方法,表示层分析数据和方法,并对这些格式进行压缩,加密而后传递给传输层,传输层在拆开肯定方法,修改报文格式,增长新的包头,直接发送给物理层,由猫直接发送出去,在TCP协议中无需通过HTTP协议,HTTP协议只在WWW开头的万维网域名下有效!


相关链接:HTTP/HTTPS协议原理HTTP/HTTPS协议原理HTTP协议层开发