LAMP预备知识

OSI七层参考模型与TCP协议栈的区别:OSI的七层参考模型只是参考模型,只是纸上谈兵罢了,而TCP/IP是以OSI七层模式为基础演化而来的实际使用的模型,是实战派。OSI七层参考模式的上三层是资源子网,而下四层为通信子网。

主机与主机之间的通信:在linux的内核当中,下四层的通信功能都是在内核当中实现,主机与主机之间的通信依靠内核与内核就可以完成,也就是直接在内核空间就可以完成,根本用不上用户空间的参与,事实上,的确有此种程序,这是一种结构。

还有另一种结构,把应用程序建立在用户空间,用户空间的程序想要完成通信的话就必须依靠内核空间当中通信子网,也就是说用户空间的程序想要完成通信的话就必须依靠内核的通信子网。

套接字:套接字是为了实现进程与进程之意的通信的一种机制,主要目的在于允许同一主机或者不同主机的不同进程之意进行通信。套接字其实有两种类型。一般来讲,一在个主机上,一个完整套接字由特定的IP+特定的端口组成,想要实现这种套接字需要内核当中的tcp/ip协议栈参与封装报文,这只是一般来讲,而事实上,套接字是分为两种类型的,第一种就是IP+端口的方式,这种类型的套接字主要是为了完成主机之间的通信,IP用来标识不同的主机,而端口用来标识不同的服务。此外还有一种套接字,这种套接字叫做unix  sock,它存在的目的是为了完成同一个主机上进程之间的通信,比如说可以把一个程序的输出定向到一个文件当中,然后下一个程序去这个文件当中取出数据,这其实是通过文件系统实现的,而文件系统又是内核实现的,这种基于文件系统或者文件的套接字就被称为unix sock.

raw套接字:不基于tcp也不基于udp而是应用程序自行控制维护报文的传输,这种奇怪的应用程序是存在的,其实这就意味着有的应用程序可以绕过传输层,但是无论如此也绕不过网络层。 这样的话套接字就有了三种。

主机与主机之间传输文件的简略过程:这个文件被用户空间送入内核空间后,首先是由网络层进行封装,每一个数据包的总大小大不能超过16位,也就是65535个字节(B),而这65535个字节是包含IP首部,而IP的首部最少是20个字节,最大是60个字节,所以一个IP数据包除去首部之后要传输的数据大小范围为:65475B-----65515B之间,也就是说一个IP数据包要传输的文件大小范围在0.65M左右。

这一个数据包到达下一层数据链路层的时候还要切片,链路层数据的最大传输单元是大于等于46字节小于等于1500个字节,加上帧头与帧尾固定的18个字节,也就是一个数据帧的大小范围是大于等于64个字节小于等于1518个字节,也就是一个数据帧的大小介于0.064KB到1.518KB之间。

等到到达目的主机之后根据标识标志片偏移合并起来最终提交给用户空间的应用层。

TCP与UDP:tcp的全称是transmisson control protocol传输控制协议,也称做是面向连接的协议。udp的全称是user datagram protocol 用户数据报协议,无连接,也称做是不可靠的连接。它们两个区别就是tcp在建立连接时需要首先建立虚连接(三四)。

物理层与数据链路层实际是由网络硬件设备与其对应的驱动程序组成,比如一个网卡加上这个网卡的驱动程序就只可以实现物理层与链路层的功能,而驱动实际上又工作在内核空间当中,由内核直接调用,TCP/IP协议栈也在内核当中 ,所以我们说通信子网(下4层)实际上全部都是内核当中的。

跨主机的通信 : 互联网上绝大多数的跨主机通信都是c/s架构的。所谓的服务端的用户空间的服务程序在启动是会向内核注册申请一个套接字,这种套接字通常是特定的IP+特定端口,当服务程序向内核申请注册以后,内核就有一个“职责”,内核要时刻等待来访问此套接字的数据,一旦识别数据包访问的是此套接的话,内核就会根据其信息知道到底是哪个进程注册了此套接字,进而会把此数据包提交给用户空间的应用程序。

那么内核是怎样识别数据包访问的是哪个进程呢?一个主机上有那多的进程,套接字有那么多,内核是怎样办到的呢?TCP/IP协议栈就位于内核当中,当内核在解封装的时候就会识别出来,通过网络层识别访问的主机,通过传输层识别访问的是哪个进程。

主动与被动:服务端因为是要提供服务的,相当于医院当中医生坐诊,要等待用户访问,不能主动出去拉客,那么这就是被动,而被动需要一个具体的地址等待客户的请求,所以服务器要申请侦听的套接字都是比较固定的。客户端则不同,客户端不需要等待别人访问,所以客户端也就没有必要申请一个固定的套接字使用,只要选择一个没有被使用的端口即可。

客户端的IP加上端口、服务端的IP加上端口,这四种元素就可以标识一个完整的连接,这四种元素只要变化其一种,就可以标识一种不同的连接。

应用层协议:假设一个ftp的客户端要与smtp的服务端进行通信可以成功吗?smtp可以识别ftp的请求吗?当然是不可以的,这些程序在设计的时候都是遵守一定的规范来设计编写,能识别的请求是特定的请求,其实也就是说只能识别按照某一种特定规范编写的请求,那么这种规范是什么?其实这种规范就叫做应用层协议。举个例子httpd程序是根据http协议设计编写的,那么它能识别的客户端的请求也只能是根据http协议开发出的客户端请求,如果一个ftp的客户端去访问httpd进程的话,httpd是不会识别的,因为httpd服务只能根据根据http协议开发的程序发出的请求。

应用层的协议是特定的,而传输层的协议是通用的。内核当中的通信子网只是负责传输的,就像通用的软件,各种应用都可以进行调用,因为它只负责通信,所以它不管上层的应用是否能够识别信息,能够识别请求信息取决应用层协议。

image.png

何为http ? hypertest  transport  protocol超文本传输协议。那么什么样的文本就是超文本呢?遵守html格式编写的语言就是超文本。什么是html?hypertest  mark  language超文本标记语言。

 

URI和URL : URL(uniform resource locator)是统一资源定位符,而URI(uniform resorce identifier)是统一资源标识符,URI存在的意就是为了标识资源的唯一性。URL是URI的子集,因为URL只是实现了URI规定的一部分功能,一个完整的URL通过是这样的:

http://www.magedu.com/image/logo.jpg[A3]               #完整的URL示例

Ø  http:// 是方案、我们通过将其理解成为协议,其实就是通过哪个方式获取资源,通过ftp也可以呀!

Ø  www是主机而不是域名

Ø  magedu.com这是是域名

Ø  /image/logo.jpg指的是访问资源的路径,这是绝对路径。

客户端和服务端:http的客户端叫做browser(浏览器),服务端就是一个遵守http协议的应用程序。那么客户端是怎样访问服务端的呢?浏览器它会提供一个地址栏让用户输入URL来获取资源,常用的http的浏览器有两种类型是GUI和CLI。

image.png

html :上面的标记语言是为让客户端的浏览器方便显示的,具体的效果,比如文本颜色和文本大小的微调需要css的参与才可以,使用html和css开发的网页都是静态的网页。此外还有动态网页,所谓的动态网页就是不仅有html和css组成,此外还有程序脚本。网页程序脚本分为两种,一种是在客户端执行,一种是在服务端执行,现在最常见的就是在服务器执行的脚本,因为如果在客户端执行脚本的话很不安全。当一个客户端访问一个提供动态网页时的服务器时,服务器会在本地把脚本执行一下,然后通过html标记以后把结果返回给客户端。

前端语言:前端语言就是指开发网页时编写脚本的语言,最常用的前端语言有php,asp.net,jsp这是三种最常见的,php用于中小型网站的开发,而大型网站要通过jsp开发,当然只要是遵守CGI(common geteway interface通用网关接口协议)的语言都可以开发网页,比如:C,C++,python等其实都可以可以的,比如C也可以开发网页,而且开发出来的网页跑的贼快!普通的语言需要解释器,而C不用解释器可以直接运行,但是为什么不用C呢?因为C的主要还是用来开发操作系统的,开发网页并不是太好用,开发和维护的成本相较于专门开发网页脚本的PHP要大的多。

值得一提的是:flash动画与动态网站是没有一分钱的关系的。

一个网页文件可能是有多个对象存在的。还是以上一个html为例子,客户端通过browser请求此html文件,当把此文件请求下来之后,客户端的浏览器会发现<img src=”abc.jpg”>还要加载一个图片于是还要再次向服务器发送请求,把此图片再请求下来,总而言之,当我们请求一个网页时并不是只请求一次就够的,图片与html是两个文件,并不是一个文件。网页当中的对象可以是服务器本地的资源,比如图片,而且还可以是别的服务器或者别的网站的图片,只要客户端的浏览器能够请求到都可以被显示。明文这一点非常的重要。举个例子,淘宝网页上的图上非常之多,难道这些图片都存在放服务器的本地之下吗?并不是这样的,这些图片可能分散到多台服务器,这样很多用户进行请求的时候就不会对单台服务器产生太大的压力,而谷歌和百度的界面并不是太花,因为要保证用户的体验尽可能的快,明白此理论对以后的调优意义重大。

超文本是通过http协议传输的文本,http是超文本传输协议,并不是超图片传输协议,那么网页当中的图片是通过怎样的方式传递到客户端的呢?当然是通过超链接链过去的,那么这个图片是通过什么协议加载到客户端的本地的呢?图片是二进制编码格式,而http协议只能传输超文本,总不能把图片的二进制当成是文本通过http传输给客户端吧!这样肯定不行,因为到了客户端那边是不能够还原的,客户端会看到一堆的乱码。怎样办呢?在解开这个谜团之前我们要先了解了一下http的版本。

http的版本 :http于1991研制成功之后发展至今有三个版本。

l  0.9版本,此版本为第一版,仅仅支持html文档,真心是不能传输图片。

l  1.0版本,此版本为第二版,不仅支持html文档,还支持多媒体数据的传输,当然,不仅是增加此一项功能,这里并不多讲,http发展到这一个版本就其实就可以传输图片了。那么它是怎样实现的呢?说是http多媒体的实现不得不提的是smtp(简单的邮件传输协议),引协议早先也只能传输文件,后来为了扩展功能加入了传输多媒体的机制:MIME:multpurpose  internet mail extension,此中机制通过base64的编码,实现了将二进制数据编码当成文本发送,并能够让接收方还原回来的格式,而http1.0的版本也借用此机制。在1.0的版本上,还引入了缓存的机制,能够保持连接(keep-alive),使得用户体验更加顺畅。

l  1.1版本在1.0基础上再次完善,更精确的缓存控制,更多的请求方法,原生支持持久连接。成为至今使用最为广泛的版本。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章