web是什么?
我们总是说webweb的,但是好像从来没彻底弄明白过它准确的定义到底是什么,我就把百度百科上的解释直接粘过来
web(World Wide Web)即全球广域网,也称为万维网,它是互联网的总称。 它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构。
web服务器做些什么?
web服务器一直等待在等待,当服务器得到请求后,它会查找资源,然后向用户返回一个结果,这个结果可能是一个 html、也可能是PDF、或者音频。不管是什么东西,总之都是客户请求的某个东西(资源)。
如果找不到这个资源,那么就会报404。
- 说到服务器,可能指以下两种:
- 物理主机(硬件)
- web服务器应用(软件)
web客户(端)做什么?
web客户端允许用户请求服务器上的某一资源,并向用户展示结果。
- 说到客户,可能是指以下两种:
- 人类用户
- 浏览器应用
也可能是两者都有。
那么两者如何通信?
要想要通信,它们必须有一种共同的语言。在web上,客户和服务器必须讲http,而且浏览器必须懂html。
客户发送一个HTTP请求,服务器会用一个HTTP响应做出应答。关键是: 如果你是一个web服务器,你就必讲HTTP。
HTTP概述
HTTP是TCP/IP的上层协议,那么在说http之前,有必要先大概看看TCP\IP是干啥的。
TCP
TCP负责确保从一个网络节点向另一个网络节点发送的文件能作为一个完整的文件到达目的地,尽管在具体的传送过程中这个文件可能会分解为小块传输,它保证文件完整性的关键动作有:
- 三次握手
这里引用翻身码农里的一个生动例子。
在古代,京城要与地方一个县衙通信。
京城首先发报: 县衙县衙,我是京城,我要与你建立连接,我的编号是1024.收到请回话。
过了一会京城收到回复: 京城京城,收到了你的消息,你的编号是1024,对不对?同意我们建立连接,我这边的序号是:2048。
于是京城再次发报:县衙县衙,我收到你的确认信了,也看到了你的序号是2048,我开始发货了!
这其实就是三次握手的过程,总结一下就是:主要为了验证京城和县衙的发信收信能力都没有问题,这样就证明连接是通的,但是京城和县衙之间并没有一条实际存在的路,tcp连接只是两端的一种状态,具体路怎么走是不确定的。
- 第一次握手:京城发信,县衙收到,县衙此时明白,自己的收信能力和京城的发信能力是没有问题的。
- 第二次握手:县衙发信,京城收到,京城此时也明白,自己发信和收信能力都是没问题的,同时它也知道县衙的发信收信能力也是没问题的,但是此刻县衙并知道自己的回复能不能被京城收到(不清楚自己的发信能力),所以此时有了第三次握手。
- 第三次握手:在收到京城的再次回复后,双方都已清楚,各自的收发能力都是没有问题的于是可以视为建立了连接。
- 报文重发
当一个需要传输的文件过大时,它便会被分成好几个部分分别传输,这些部分又被按顺序分别加以编号。并且每次发送都会等待对方回复确认,当对方回复称确实收到了该包裹,我们再继续发送剩余包裹,当一个包裹长时间没有确认时,我们会认为这个包裹“丢包”了,于是我们会将这一编号的包裹再发一遍,直到确认整个文件全部都已经接收为止。
IP
IP则是一个底层的协议,负责吧数据包沿路移动\路由到目的地。
HTTP
HTTP正是一种这样的网络协议,它依赖于TCP\IP从一处向另一处完整地传送请求和响应。
说白了它就是一个简单的 请求\响应序列:浏览器发出请求,服务器做出响应。
HTTP方法
http有很多方法,其中最著名的就是get和post方法了
- get方法
我们总是听别人讲,“get不安全啊,参数都暴露在地址栏里啊bulabula”,把get说的一无是处,好像能不用就不用get一样,其实有些时候认真去理解get只需要从它的字面意思去理解就行了,所谓get就是获得某一样东西,它的任务就是从服务器得到资源 - post方法
post方法更强大,其实可以称之为get++,它在请求资源的同时可以向服务器发送(post)一些表单数据。
URI、URL、URN
- URI:Uniform Resource Identifier,即统一资源标志符,用来唯一的标识一个资源。
- URL:Uniform Resource Locator,统一资源定位符。即URL可以用来标识一个资源,而且还指明了如何locate这个资源。(方法)
- URN:Uniform Resource Name,统一资源命名。即通过名字来表示资源的。
他们的范围由大到小排列。
URL肯定是一个URI,但是一个URI并不一定是一个URL,URL仅仅是URI的一种表现形式而已。
关于URL:
URL是URI的一种,不仅标识了Web 资源,还指定了操作或者获取方式,同时指出了主要访问机制和网络位置。
关于URN:
URN是URI的一种,用特定命名空间的名字标识资源。使用URN可以在不知道其网络位置及访问方式的情况下讨论资源。
而web中的每一个资源都有唯一的地址,也就是大家都会采用URL,所以URL存在感最强。
web服务器自己不做的两件事:
表面上来看我们提交请求页面,保存数据到服务器都是把任务交给服务器去做了,但事实上,这些事情只依靠服务器是不够的,并且事实上这些事并不是服务器做的。
- 动态内容
前面我们说过,服务器在收到资源请求时负责将资源响应给客户,但是服务器并不会自己在资源上添加或者修改什么东西,也就是说资源是什么样服务器就会原封不动的将资源返回,但是有一个“辅助应用”就可以生成动态页面,并且这个“辅助应用”可以与web服务器通信。 - 在服务器上保存数据
同样当用户把表单提交给web服务器时,服务器并不知道要怎么将它存储的信息提取并存入数据库,所以服务器会认为这并不是给我的,而是要我转交给另一个“辅助应用”,所以web服务器将表单信息、参数交给“辅助应用”,并由它负责为用户生成响应,再交给web服务器来返回。
web服务器擅长做的两件事:
- 提供静态的资源。
- 将任务转交给本服务器上的其他辅助应用。
而辅助应用其实就是CGI程序
那么什么是CGI??
先看定义:CGI 通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口。
通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。
所以实质上来讲servlet就是一种CGI程序
看到这里似乎有一点点明白了,servlet其实就应该是代表着本web服务器能提供哪些服务嘛。只不过这个servlet和传统的CGI程序又大有不同(以后再写一篇文章专门分析)。
这样一路梳理下来,我觉得我的体系瞬间清晰了许多,但是这还远远不够,如果说之前的web服务器对我来说是一个黑盒,那么现在也只是刚刚打开了一个小窗口,里面还有很多未知等待探索。