通讯的条件
学前小故事
通过这个故事,我们来理解两台电脑之间的通信,必须具备什么样的条件?
有一天啊,这个小明和小强,一个在山的这头放牛,一个在山的那头割草。但是,由于无聊,这个小明就像找对面的小强聊聊天。由于这个距离比较远,根本就看不清楚,这个小强在对面干嘛!它就大声喊道:小强,你是在割草吗?这个小强听到有人在叫他。抬起头,隐隐约约看到有人在对面的山头,但是山高风大,这个小强根本就听不清楚小明在问他什么。(他以为小明在问他别的东西)他就回了一句:不,我是在这边割草。这个小明听见了小强回应了他,但是他也没听清楚。他只是听到小强这边,说了一个什么什么草。然后,这个小明以为他不是在割草,他就又回应了一句:我原以为你是在那边割草。就这样,这两个人聊了一下午,聊得很开心。但是,到最终都不明白,对方在干什么。
这两个人聊得这么开心,它应该具备什么样的条件?
1) 首先,第一点,他们能聊天,两个人得能够看见对方吧!所以说,第一个必须具备的条件就是在可见范围之内。(两个人必须看得见对方)
2) 第二点,这两个人能聊天,肯定说的是同一种语言吧!
3) 第三点,两个人肯定都得知道对方是谁吧!如果这两人不认识,你说他们一下午还会聊得开心吗?
4) 第四点,小明对小强喊了一声,这都是通过声音来传播的,他肯定要有一个介质吧! 所以说,必须要有信息传播的介质。
两台电脑之间通讯应该具备什么样的条件
我先画出了两台电脑,并列出了,这两台电脑之间通讯所必须具备的基础条件。
1.传播信息的介质
来分析讨论一下,首先第一点电脑要传播信息,肯定要有传播信息的介质。我们人传播信息的时候,是通过声音来传播的;(这个空气就是我们的介质)我们电脑要传播信息的时候,它是通过我们的网线来传播的。我们画两条网络:
2.通讯的环境
有了网线,还不够啊!这个电脑它通信的话,必须具备一个通信的环境。就像我们刚才这个小明跟小强一样。他们两个要聊天的话,他们必须在可见范围之内才能聊天。我们的电脑也一样,它要通信的话,必须具备一样通信的环境。电脑可以通过网络来进行通信:
3.IP
有了这个网络和网线之后,按理来说,这两台电脑就可以通信了。但是还有个问题。我们这一个网络里面,可能电脑有成千上万台。那么,这么多台电脑,我怎么就能找到对面那台电脑呢?(那它是找不到的,为了解决这个问题呢!)我们可以在同一个网络里面,对不同的电脑进行命名。(这个命名,不像人类的名字一样,通过字母或者中文字符,它是通过一个IP地址的形式来进行命名的。)而这个IP地址呢!它其实就是4组0到255组成的数字。来标注在同一个网络里面,不同电脑的身份。我们这里现在就为这两台电脑标上IP地址,注意啊!在同一个网络里面,这个IP地址是不能够重复的。(这个A电脑和B电脑之间的通讯条件基本上具备了)
4.端口号
那么,我们这个电脑是不是就能够通讯了呢?(确实是能够通信了)但是我们知道,我们的电脑通信实际上是通过一个网络应用程序要实现通信的。(就比如说我们的qq,我们要发信息的时候,通过qq来发信息的)我们必须在每台电脑上安装一些网络应用程序。
那么,这下问题又来了,我们通过qq来发信息,发到对面的电脑上,都能找到对面的电脑上了。但是这个对面的电脑它怎么知道我要使用qq来处理信息呢?(这个我们要考虑一下)其实,它是不知道的,那么为了解决这个问题。我们在每台电脑上安装网络应用程序的时候。每个网络应用程序,它必须有一个唯一的标识。通过这个唯一的标识,我们就可以找到对应的网络应用程序了。(而,这个唯一的标识我们把它叫做:端口号(port)而这个端口号,它必须在0到655之间的一个数字。所以说,这个qq在启动的时候,不管是哪台电脑,它都有一个唯一的标识号。
5.tcp/ip协议
现在两台电脑都已经具备了网络传输的一个基本条件了。现在我想实现这样一个功能,通过A电脑上的qq这个应用程序,发送一个数据“你好”,到B电脑上的qq应用程序。A电脑要发送数据,必须要对这个数据进行处理。(因为,我们知道电脑不能识别人类的语言,所以说这个信息必须处理完了才能发送)那么,这个处理过程,我们把它称为数据打包。这个数据打包,其实就是有点类似我们平时生活当中寄邮件这么一个过程。我们知道,我们要寄某个物件,寄到某个地方去,我们首先要去邮局领取信息单。
填写对方的收货地方。(填写对方的收货人等等一系列的信息)填好之后,就把物件包裹好。然后邮递员才能够通过这个信息单上面的信息把你的物件准确无误的传递到你的朋友那里去。而我们的电脑要把这个拟好的数据传到对方电脑上去,它也是要经过这个过程。(这就是数据打包的过程)数据打包的过程,它不是说乱打包,这个传输数据的时候,也是要遵循一个标准来打包的。这个标准是什么呢?就是网络数据传输的基本协议:tcp/ip协议。通过这个协议,我们就可以把我们的数据打成一个数据包。通过网络传到对面的浏览器上面。当然,通过网络传输的时候,是谁来充当这个邮递员呢?就是我们的路由器。因为你这个数据包包裹好了之后,这个路由器能够识别出这个数据包里面,所对应的对方的ip地址。(和对方应用程序的端口号)。他就能准确无误的把这个数据包传递到对方的电脑上去。
所以说,我们打包这个数据的时候,就必须遵循这个tcp/ip协议。
什么是tcp/ip协议
tcp/ip协议,它其实是一套协议
按层可以分为4层
第一层:应用层
应用层里面,它包含了一系列的协议,比如说:http超文本传输协议(这也是我们web应用传输的一个协议);第二个是ftp协议(文件传输协议);还有一种就是smtp(这是我们的简单邮件传输协议)。当然,还有其它很多。
第二层:传输层
传输层里面有两个协议:Tcp和udp协议。
第三层:网络层
网络层里面,它有很多,我这里举两个例子。Ip协议和icmp协议。
第四层:网络接入层
由于这一层,和我们的电脑硬件有关系,所以我们这里就不深入讨论了。
tcp协议
这个tcp协议的全称叫做:传输控制协议(transmission control protocol)
这个协议的特点
它的特点是:面向连接的一种协议,这个面向连接就能够保证数据准确无误的,不会发生数据丢失的一种情况。
它是怎么保证的
首先,这个A电脑发送一段数据到B电脑上,问这个B电脑在不在。如果这个B电脑能接收到这个数据,那么B电脑就会回一句话给A电脑(发一个数据过来),告诉A电脑:我在,你可以发数据过来。而这个A电脑接收了B电脑的数据过后,它还是再一次发送数据过去,告诉B电脑:我知道你在了,现在我们可以发数据了。那么,经过这三次发数据,它就能够保证数据准确无误传到B电脑上。这三次发数据其实就是我们平时所说的:三次握手。通过这三次握手,来保证不会发生数据丢包。
udp协议
它的全称叫做:用户数据报协议。
它的英文名叫做:user data protocol。
udp协议的特点
它就是更tcp恰好相反,它是面向无连接的一种协议。它不管对面到底在不在,它只管把这个数据包发出去。如果对面的电脑没在的话,它就把这个数据包丢掉。
这两种协议,分别会应用到什么地方
比如说:我们的文件下载。这个文件下载,如果是你采用udp协议,如果数据丢包了,你的数据下载就不完整,这种文件在电脑上是打不开的。所以说,为了保证我们的文件能够准确无误的下载下来,我们肯定会采用tcp协议。而我们发送qq信息的时候,你发个数据过去,对面到底有没有接收到,这个其实不是很重要。(它如果没有接收到,你再发一次就行了,所以说这种我们就采用udp)
这种协议,它有什么区别
tcp面向连接,能保证数据能够准确无误的传到对方电脑上;(但是它的传输效率相对于udp,就要低一些,因为它要经过几次握手)
而这个udp的话,虽然说它的传输效率高,但是可能会发生数据丢包。所以说,各有各的特点,我们这里不能说哪个协议好,哪个协议不好。
HTTP协议
http协议
它的全称叫做:超文本传输协议。
它的英文叫做:hyper text transfer protocol。
这个协议是建立在tcp和udp之前的一种协议。(它是应用层的协议)
为什么需要http协议
我们知道:tcp和udp只是为了发送数据而存在的。而这个数据在对方的电脑上,要怎么才能解释出来这种数据呢?那么,我们还是要按照标准来解析才行。比如说,我们这个麦子学院的网站,我们在这里输入用户信息
然后,我们点击提交登录,那么它发的数据会很多。(比如会发送我们使用的浏览器的内核是什么、采用的什么浏览器、浏览器支持的压缩方式、浏览器支持的语言,还有就是我刚才提交的用户名和密码)那么,这些信息都会提交到服务器上去,这些信息,如果提交到服务器上去之后,服务器如何来解析这些信息呢?
我们就必须按照一个标准来解析。你那边是如何封装成数据包的,我这边就按照什么方式来解析。
比如:
第一行是浏览器的信息;
第二行是用户的信息;
第三行才是一些其它的信息。
通过这样的方式,那么我们才能把数据正确的解析出来。所以,http协议作为一种上传协议,它的存在肯定有它的道理的
http协议是什么样的协议
http是hyper text transfer protocol(超文本传输协议的缩写),用于从www服务器传输超文本到本地浏览器的应用层传输协议。也就是说,比如我通过浏览器访问麦子学院的首页:然后,我一回车,内容就出现了,这种就是基于http协议的
它通常是承载于tcp协议之上(这个http协议的底层是采用tcp传输的),并且该协议是一种基于请求/响应模式的无状态协议。由万维网协会(world wide web consortium)和Internet 工作小组IETH(Internet Engineering Task Force)在1990年定义1.0版本,目前最新版本1.1。
HTTP概念分析
上一节http里面的信息比较多,我们来挨个分析一下。
请求/响应模式
刚才我们在浏览器里面输入了www.maiziedu.com这么一串字符串之后,后台发生了什么事情?我们来分析一下。(左边是我们的谷歌浏览器,右边是麦子学院在因特网上的主机)
当我在谷歌浏览器里面输入这一串字符串,然后,一敲回车。那么我的这个浏览器会干什么呢?
它首先会找这个因特网上麦子学院的主机,然后跟它建立连接。
建立好连接之后,它会马上发一个数据包过来:
这个发数据包的过程,我们叫做客户端的请求,我们用英文单词request来命名它。
然后,服务器接收到这个数据之后,会对这个数据作出一系列的处理和,最后把处理的结果响应到客户端:(这个过程我们叫做响应(response))
然后,再跟我们的客户端断开连接:
大概就分为了这么4个步骤
我们只要已发送数据,那么它肯定就有请求和响应。并且这个请求和响应之后,它会建立连接,之后再断开连接。
无状态怎么理解
无状态其实就是说,我们这个麦子学院的主机,它其实是不知道客户端的一个状态的,不知道是谁来访问我的。不知道这个客户端是第几次来访问的。也不知道是谁建立的这个连接。所以说,这个无状态是服务器不知道客户端的状态。(这种连接,它连接上后,得到数据之后,它马上会断开连接)(这个服务器它只知道有人来访问,却不知道是谁来访问)。这就是基于无状态的连接。
1.0 和1.1的版本有什么区别
1.0的版本,就是每次请求,它都会建立连接,然后断开连接。(只要请求完,响应完,它就会断开连接)那么,我们想一下:麦子学院首页这么多数据。
有图片、有css样式、有js代码,这么一个网页里面,它包含的东西很多,它不可能在一次请求里面把所有的数据包含在整个网页里面。那么,这些文件,我们都需要单独请求的。比如说我们这里打开控制台,再刷新一次网页:我们请求的实际上只有这么一个:www.maiziedu.com但是,它后面还发生了很多次请求。这个时候,如果采用1.0版本的话。我们请求这个首页,它建立一次连接,请求这个数据,断开连接。那么,我们请求下面的,比如这个css:
那么,它又要建立连接,发送请求,响应数据,断开连接。(又要经历这么一个步骤)这么多东西,你要在一次访问里面,建立N多次连接,断开N多次连接,肯定会降低访问效率。而1.1版本里解决了这个问题。我们规定一个断开连接的时候,比如说5秒钟。
在这5秒钟之内,你建立好了连接,你只要有新的请求过来,我都不断开连接,直接响应过去。时间超过5秒,我这里就给你断开连接。你下次请求,你就必须要重新建立连接。(这样就提高了访问效率)
因为,我们第一次访问麦子学院的首页的时候,它建立连接,其实后面我们马上会请求很多数据,发送很多次请求。注意,这个发送请求的速度是很快的。它在5秒之内绝对能完成这么多次请求。当我们最后一个文件得到之后,我们就再也没发请求过去,这个时候,超过5秒,在5秒之外的这个时间,有新的请求过来,它就会把这个连接断开掉。
什么叫URL
什么叫URL
刚才我们在地址栏输入了一串字符串,这一串字符串可不是乱输的。是有一定格式的。这串字符串我们把它叫做URL:统一资源定位符。也就说,我们网络上的所有资源,我们要找到它的话,我们必须给它一个唯一的路径。这个唯一的路径,我们就把它叫做:统一资源定位符。
字符串的格式
协议://主机域名或ip地址:port/资源路径
1.协议
这个协议可以是http,https,ftp等等一系列的。只要后面是冒号,双斜杠,这是固定的格式。后面这个主机域名或ip地址。然后,还有端口号,还有资源的路径。这么一串就可以组成我们的URL了,组成我们的统一资源定位符了。(就能找到唯一的资源了)
比如http://www.maiziedu.com
这个协议是http。我们这个主机域名是www.maiziedu.com。我们请求的资源是它的首页,所以这里没有输入也能找到.
2.域名
域名就是我们互联网上某一个主机的名称。在我们的浏览器发送这个网址的字符串,我们敲回车的时候,它会在互联网上找这个域名所对应的ip地址。这个域名所对应的ip地址是谁来告诉它呢?是通过一种叫做域名解析器的这么一个东西来实现的,叫做DNS。
这个东西,首先把域名发到DNS这里来,问它这个www.maiziedu.com这个域名的ip地址是多少。那么这个域名解析系统就会把这个请求再往下次发。(它这里面可能会记录了这个当前麦子学院的ip)它就会找这个当前所对应的IP地址。输入ip地址和输入域名的差别就是,ip地址不方面我们人类记忆,而我们域名就很方便我们人类的记忆。所以说,我们一般访问网站的时候,都是输入它的域名,而不是它的IP地址。
当这个DNS解析了这个域名之后,它对应的IP地址就会找这个因特网上对应的主机,就是我们这个麦子学院的主机。这样就实现了一个请求访问了。建立了一个连接。
3.端口号
4.资源路径
这个资源路径就必须是在服务器上的一个资源路径了
假如我们麦子学院的首页是:
http://www.maiziedu.com/index.html这个首页。那么它的资源路径,全路径就应该这样写。我们才能访问到对应的首页。
请求数据包
请求数据包包括哪些东西?
它包括四个部分
a) 请求行;
b) 请求头;
c) 空行;
d) 请求体。
请求行
数据包里的请求行怎么获取
在这个火狐浏览器里面,我装了一个插件,这个插件叫做:HttpFox。点开它,这个插件会截取我们每次发送数据的请求包:
这里我们刷新一下麦子学院首页,然后再打开这个插件。看到它不断的发请求,不断的解析这个数据包。
我么截取的这个数据包是我们这个域名地址,这个URL的数据包。
这里它有一个请求头。后面对应了它的值。
请求头里面,第一行是它的请求行:
那么,这是对应我们这里的这个东西:
里面是这样规定的
第一个是请求的方式。
然后空格,斜杠,空格。
然后后面是请求的http协议的版本。
请求方式包含了什么
PUT:请求服务器存储一个资源,并用Request-URL作为其标识。
DELETE:请求服务器删除Request-URL所标识的资源。
POST:在Request-URL所标识的资源后附加新的数据。
GET:请求获取Request-URL所标识的资源。
HEAD:请求获取由Request-URL所标识的资源的响应消息报头。
TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断。
CONNECT:保留将来使用。
OPTIONS:请求查询服务器的性能,或查询与资源相关的选项和需求。
这么多请求方式里面,其实我们用的最多的是POST和GET属性。(在实际开发当中,用的也是这两种)
这两种的区别
刚才我们这里,并没有指定为GET请求,那为什么这里就是GET请求呢?
因为我们在浏览器地址栏里面输入一个地址,比如说我们输入www.maiziedu.com,我一敲回车,这里它其实默认就采用了GET的方式发送数据的。而我们这个POST请求,会在什么时候用到呢?这个在我们提交表单的时候,它可以采用POST(当然我们需要指定)当然,也可以采用GET。
GET方式,如果在提交表单的时候,它会把提交上去的数据放到URL后面。它会采用?来分隔URL和参数,参数与参数之间采用&这个符号来分隔。如果我们提交表单的时候,它会把这个请求的数据放到URL里面提交上去。
但是如果我们采用这个POST请求的话。它会把这个请求的数据,放到我们刚才说的第四部分:请求体里面。(也就说,这个时候用户就看不到)
请求头
在火狐的这个插件里面,它上面有一系列的请求头:
这些又代表什么意思呢?也就说,我们这个请求发送到服务器上面,这个浏览器会把浏览器它自己本身的一些信息带过去。
带的是哪些信息呢?
Host:www.maiziedu.com(就是我们对应的主机)
User-Agent:代表我们使用的操作系统,以及使用的浏览器和它的内核(例如:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36)
Accept:代表的我们的浏览器能处理的一些文本类型(例如:image/webp,image/*,*/*;q=0.8)
Accept-Language:代表的我们这个浏览器能够处理的自然语言。(例如:zh-CN;zh;q=0.8;en-US;q=0.5;en;q=0.3)
Accept-Encoding:代表它的编码(例如:gzip,deflate)
Cookie:代表我们要想服务器提交的而一串数据,当然这个Cookie,我们在后面也会讲解。
Connection:keep-alive(保持连接,就是说,不是我请求完之后,马上就断开连接)
当然不同的的类型,它是不一样的。
空行
空行的作用是用来分隔我们的请求头和消息体的分隔符。刚才我们说到这个请求体,这个浏览器想服务器发送了数据过后,存储的一些数据,它就放在请求体里面。
响应数据包
响应数据包分为4部分
这4部分分别是:
a) 状态行;
b) 响应头;
c) 空行;
d) 消息体。
状态行
这个不用多说,我们麦子学院是采用http协议1.1版本的。而这个200是什么呢?它是一个状态码。后面还有一个OK。这个OK是这个状态码所对应的文本描述。
状态码是用于描述当前我们这个用户访问这个阶段,它处于的一种状态。状态码是由三位数字组成的,第一个数字定义了响应的类别,且有5种可能的取值:分别是1、2、3、4、5开头的这么一个数字
1xx:指示信息—表示请求已接受,继续处理。
2xx:成功—表示请求已被成功连接、理解、接受。
3xx:重定向—要完成请求,必须进行更进一步的操作。
就是,如果我访问这个麦子学院的服务器,这个麦子学院的服务器判断这个资源在我这里找不到。它在另外一个服务器上面找得到。那么,它就会发送一个数据包过来,告诉你在别的服务器上去请求,那么这个过程我们叫做重定向,这个在后面我们也会解释的。
4xx:客户端错误—请求由语法错误或者请求无法实现。
比如说,我在这里后面随便乱写一个,然后回车。那么,它这里弹出一个页面:(当然,这是麦子学院自己定义的一个访问出错的页面)
我们看一下这个浏览器里面:(这里报了一个404的错误)
代表什么呢?这个代表用户输出的地址不存在。在服务器上面找不到这个资源。
5xx:服务器端错误—服务器未能实现合法的请求。
比如说,这个服务器端哪里代码出错了,或者是哪里发生故障了它就会返回以5开头的状态码(后面我们也会用代码来演示)。
常见的状态码有哪些
200:代表数据成功接收、处理、响应。
302:代表重定向。
404:代表资源不存在,就是我们刚才看到的效果。
500:代表的是服务器端出错了。
响应头
响应头其实是跟我们的请求头是对应起来的。它也是前面一个名称,后面一个值。
响应头里面包含哪些信息
Date 代表产生这个响应头所对应的时间。(这些响应头我们写代码是可以定义的)
Date Sat,28 Nov 2015 14:57:22 GMT
Server代表这个是麦子学院的服务器采用的是Apache这么一个服务器,而且是基于Linux操作系统的(ubuntu)。
Server Apache/2.4.7 (Ubuntu)
编码采用GZIP,它跟我们的服务器是对应起来的。
Content-Encoding:gzip
而Content – Length代表什么呢?代表的是响应的这个数据的大小。11114字节。
Content-Length:11114。
这里设置的超时的时间是5秒钟,而最大的不超过100秒。
Keep – Alive:timeout=5;max=100;
Connection也是保持长连接。
Connection:keep-Alive。
Content-Type代表本次响应过来的一个文件类型和文件的编码。
Content-Type:text/html;charset=utf-8;
空行和消息体
当然,空行也是用于分割这个响应头和消息体。它也是起了一个分隔的作用。消息体会把我本次响应过来的数据放在消息体里面。给我发过来。
这个在哪里看得到呢?
比如这里我们把这个插件打开,找到content这项,随便点击查看一个css文件。我们看下面,这就是在本次响应里面给我发送过来的文件:(非常多)