作者:田田田田
链接:https://www.zhihu.com/question/19998865/answer/295453533
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
WSGI很好理解,虽然是Web App相关的一个概念,但是彻底理解需要了解一下TCP/IP协议,至少能够区分应用层、传输层和物理层。不清楚的话容易误解。
WSGI是一个接口,接口就是把两个模块连接起来。理解接口,重点不在接口本身,而在连接的两个模块,接口……只是个接口而已了。具体需要理解:
1、这个接口连接了哪两个模块?
2、两个模块各自做了什么工作,通过接口连接后,共同实现了什么功能?
3、为什么不在1个模块内做完所有的事,要划分成两个模块?(接口的好处:分工)
下面来分析【用户通过浏览器访问网页】的全过程,理解这个就能回答前两个问题了。
1 首先理解:用户通过浏览器访问网页,具体经过了哪些环节?
用户通过浏览器访问网页,在应用层就是用户的浏览器和服务器的Web App会话,而建立应用层的会话需要依托TCP/IP协议封装与数据传输,具体步骤有:
(1)用户输入URL
(2)浏览器代为封装成符合http格式的Request请求,包含请求首行、请求头和请求体
(3)Request请求是应用层数据,再由OS完成TCP、IP、MAC层封装,送到网卡处以比特流形式送送
(4)经过网络传输,比特流到达服务器端,被服务器接收。
(5)服务器OS逐一去掉 MAC、IP、TCP层封装,剥出应用层数据,也就是Request请求,并交给应用层的Web应用
(6)Web解析Request请求内容,并生成Respond响应,交给服务器OS
(7)Respond响应也是应用层数据,由服务器OS完成TCP、IP、MAC层封装,送到网卡处以比特流形式送送
(8)经过网络传输,比特流到达服务器端,被用户机器接收。
(9)用户机器OSS逐一去掉 MAC、IP、TCP层封装,剥出应用层数据,也就是Respond响应,并交给应用层的浏览器。
(10)浏览器根据Response响应内容,组织显示给用户看。
2 接着着重理解:在上述流程里,服务器OS和Web APP各自做了什么事情?
【服务器OS】从比特流拆出Request请求,以及将Response打包成比特流。
【Web APP】主要在实现http协议,具体有:
(1)收到 Request;
(2)解析Request具体请求内容,调用资源生成html,并组织成一个Response;
(3)发出Response;
3、再理解:服务器OS跟Web APP如何完成数据交换?
注意到服务器OS跟Web APP有数据交换:服务器OS将Request请求传给Web APP,Web APP处理后,将Respond响应传给服务器OS。
那么,服务器OS怎么把Request请求传给Web APP?
答案,通过调用WSGI接口。WSGI接口是抽象的,具体实现一般是调用函数。
如httpd = make_server(’’, 8001, application)创建一个服务器,这个服务器上的WSGI接口实现,就是调用application函数。在application中实现了Web App的请求处理,服务器调用application函数,同时将自己的成果Request作为参数传递进去,就由Web App接力完成下一步处理。Web App处理后,成果作为application的返回值返回给服务器。
最后回答开头的两个问题:
1、这个接口连接了哪两个模块?
答:服务器OS和Web APP。
2、两个模块各自做了什么工作,通过接口连接后,共同实现了什么功能?
服务器OS完成TCP/IP底层的工作,Web App完成TCP/IP应用层的工作,共同组成Web服务器。