(一)基础知识
当我们在浏览器的地址栏中输入网址,然后点击回车,接着,浏览器就会呈现出我们需要的web界面,那么,这个界面是怎么产生的?
web的界面是根据我们输入的URL(网址、地址),浏览器从服务器端获取对应的文件资源等信息,然后显示在浏览器上面。
像这种通过发送请求获取服务器资源的web浏览器等,都可以称之为客户端(client)
web使用http(超文本传输协议)协议作为规范,来完成从客户端到服务端等一系列的运作流程,而协议指的就是规则的约定,可以说,web是建立在http协议上进行通信的
关于http的产生和发展,这里就不赘述了,有兴趣的童鞋可以百度。。。。。。
为了理解http,有必要简单介绍下tcp/ip协议族
计算机与网络设备之间互相通信,双方就必须基于同样的方法。比如:如何发现通信目标、由谁发起通信、使用什么语言通信、怎么结束通信都需要事先确定,所有这些都需要一种规则,
这就是协议。协议中存在多种的内容;从电缆的规格到ip地址的选定方法,寻找异地用户的方法,建立通信的顺序,以及web页面显示需要处理的步骤等等
像这样把与互联网相关联的协议集合起来统称为tcp/ip。
tcp/ip的分层
tcp/ip很重要的一个特点就是分层。按照层次分为以下四层:应用层,传输层,网络层和数据链路层
分层的好处:如果互联网只由一个协议统筹,那么某一地方出问题,整体都会出现问题,无法使用;分层后,只需替换出现问题的或者需要修改的即可,而且分层后针对具体的设计也变得更为简单
应用层:体系的最高层,应用进程间通信交互的规则
tcp/ip协议族预存了各类通用的应用服务,比如:
ftp:文件传输协议
dns:域名系统协议
http:万维网应用协议
smtp:电子邮件协议
以上几种是常用的几种,还有很多其他的协议,感兴趣的可以找找其他专业的书籍看看
传输层:提供处于网络连接中的两台计算机间的数据传输,其中包括tcp和udp两种性质不同的协议
tcp:传输控制协议,传输的单位为报文段,提供面向连接的,可靠的数据传输服务
udp:传输单位为用户数据报,它是尽最大努力的提供数据传输服务,不保证可靠性
网络层:又名网络连接层
用来处理在网络上流动的数据包(封装)。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机并把数据包传给对方
链路层:又名数据链路层,网络接口层
处理连接网络的硬件部分。比如控制操作系统、硬件的驱动、网络适配器、光钎等
数据的封装:
用户端发送一个请求,从应用层开始,一直到链路层,每一层都会被打上该层所属的首部信息;反之,接收端在层与层之间传输时,每经过一层会去掉该层的首部信息,这种做法叫做封装
与http密切相关的协议
IP协议:位于网络层,作用是把各种数据包传送给对方,而要准确的把数据传送给对方,就需要满足各类条件,其中有2个很重要的条件:ip地址和mac地址
ip地址相信有点基础的人都知道,就是节点被分配到的地址,mac地址则是指网卡所属的固定地址,ip和mac地址可以进行配对
ip间的通信依赖于mac地址,在信息传输中,有时候由于中转太多,因此会采用ARP协议,这是个用来解析地址的协议,通过ip地址就可以反查出对应的mac地址
tcp协议:位于传输层,确保传输的可靠性
数据传输中为了传输方便,会将大块数据分割成报文段,而tcp协议能确认数据最终是否传送给对方
为了准确传输,传输中采用了三次握手策略(这种手段可以理解为多次确认,来确保数据传输的可靠性)
dns协议:负责域名解析,位于应用层,提供域名到ip地址间的解析
通过域名查找ip地址,或者逆向从ip地址反查域名
URL和URI
URL:统一资源定位符:表示资源的地点,具体指向(门牌号)
URI:统一资源标识符:用字符串标识某些互联网资源(该门牌号的地方具体有什么资源)
URL是URI的子集
(二)请求和响应报文的构成
http协议用于客户端和服务器之间的通信,请求访问资源的一方称为客户端,而提供资源响应的一方称为服务器端。
下面就是客户端和服务端之间简单的通信过程
PS:请求必须从客户端建立通信,服务端没收到请求之前不会发送响应
下面先来说说请求的构成:
1)请求方法URI协议/版本
2)请求头(Request Header)
3)请求正文
下面是一个请求的例子:
GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=jinqiao&password=1234
1)请求方法URI协议/版本
以上请求中“GET”代表请求方法,“/sample.jsp”表示URI,“HTTP/1.1代表协议和协议的版本。
根据HTTP标准,HTTP请求可以使用多种请求方法。具体的方法以及区别后面我们介绍。
2)请求头
请求头和请求正文之间是一个空行,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息:
username=jinqiao&password=1234
在以上的例子中,请求的正文只有一行内容。当然,在实际应用中,HTTP请求正文可以包含更多的内容。
HTTP响应与HTTP请求相似,HTTP响应也由3个部分构成:
1)状态行
2)响应头
3)响应正文
在接收和解释请求消息后,服务器会返回一个HTTP响应消息。
状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。
格式: HTTP-Version Status-Code Reason-Phrase CRLF
例如: HTTP/1.1 200 OK
状态代码:
状态代码由3位数字组成,表示请求是否被理解或被满足。
状态描述:
状态描述给出了关于状态代码的简短的文字描述。
状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类。
第一个数字有五种可能的取值:
- 1xx: 指示信息—表示请求已接收,继续处理。
- 2xx: 成功—表示请求已经被成功接收、理解、接受。
- 3xx: 重定向—要完成请求必须进行更进一步的操作。
- 4xx: 客户端错误—请求有语法错误或请求无法实现。
- 5xx: 服务器端错误—服务器未能实现合法的请求。
状态代码 状态描述 说明
200 OK 客户端请求成功
400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。
401 Unauthonzed 请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
404 Not Found 请求的资源不存在,例如,输入了错误的URL。
500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。
503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。
响应头
响应头可能包括:
Location:响应报头域用于重定向接受者到一个新的位置。
Server:响应报头域包含了服务器用来处理请求的软件信息。它和User-Agent请求报头域是相对应的,前者发送服务器端软件的信息,后者发送客户 端软件(浏览器)和操作系统的信息。
Content-Encoding:实体报头域被使用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容编码,因而要获得Content- Type报头域中所引用的媒体类型,必须采用相应的解码机制。
Content-Language:实体报头域描述了资源所用的自然语言。Content-Language允许用户遵照自身的首选语言来识别和区分实体。
Content-Length:实体报头域用于指明正文的长度,以字节方式存储的十进制数字来表示,也就是一个数字字符占一个字节,用其对应的ASCII码存储传输。
要注意的是:这个长度仅仅是表示实体正文的长度,没有包括实体报头的长度。
Content-Type:实体报头域用语指明发送给接收者的实体正文的媒体类型。
Last-Modified:实体报头域用于指示资源最后的修改日期及时间。
Expires:实体报头域给出响应过期的日期和时间。
Expires实体报头域使用的日期和时间必须是RFC 1123中的日期格式,例如:
Expires: Thu, 15 Sep 2005 16:00:00 GMT
下面是一个HTTP响应的例子:
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
(三)几种数据传输方式
说说http协议的一些特点:
1)无状态
http协议是一种自身不对请求和响应之间的通信状态进行保存的协议,即无状态协议。
这种设置的好处是:更快的处理更多的请求事务,确保协议的可伸缩性
不过随着web的不断发展,有时候,需要将这种状态进行保持,随即,就引入了cookie技术,cookie技术通过在请求和响应报文中写入cookie信息来控制客户端的状态。
有关cookie的内容后面我们再说。。。
2)持久性
正常在发送http时,都需要建立TCP的连接,再发送报文。
如果每次想要发送http报文都需要经过这个过程,那么时间大部分都会消耗在建立和断开连接的过程中。
因此http中使用了connection属性,用于指定连接的方式。
当设置成keep-alive,http就会建立一条持久化的连接,不需要每次都建立连接,再中断。
这样做的好处是:减轻了服务器端的负载,减少开销的那部分时间,使http请求和响应都能更快的结束,相应的,web页面显示速度也就相对提升了。
3)管线化
如果一个http请求,请求了大量的图片等大文件,那么其他的http请求怎么办呢?
现在,管线化技术的出现,使得http请求比持久性连接更要快;特点在于:请求数越多,时间差越明显。
4)内容编码
由于某些报文的内容过大,因此在传输时,为了减少传输的时间,会采取一些压缩的措施。
例如上面的报文信息中,Accept-Encoding就定义了内容编码的格式:gzip
有下面几种方式:
gzip:GNU压缩格式
compress:UNIX系统的标准压缩格式
deflate:是一种同时使用了LZ77和哈弗曼编码的无损压缩格式
identity:不进行压缩
5)多部分对象集合
有的时候传输的内容,不仅仅是一些字符串,还有可能是一些图片,字符,音乐二进制等混杂的内容。
这就需要使用多部分对象集合,multipart,例如在使用java编写web上传文件的代码时,需要在form中指定form的编码格式。
设置form的enctype属性的值为multipart/form-data。
这是因为默认的情况下form使用的编码格式是:applicatin/x-www-form-urlencoded,这种编码格式会把所有的内容进行编码,不适合上传文件这种情况。
这两种编码格式的区别主要是:
multipart/form-data 会以控件为基准,编码form中的内容。
application/x-www-form-urlencoded 会把form中的内容编码成键值对的形式。
6)范围请求
有些场景下,http报文请求一些很大的图片,但是加载过程很慢。
比如我们登录一些大图片的网址,会发现有时候图片是一块一块加载的。
这就是因为设置了http请求的长度,这样就可以分块的加载资源文件。
在请求报文中使用Range属性,在响应报文中使用Content-Type属性都可以指定一定字节范围的http请求。
接下来,说说几种http协议的数据传输方式
http协议的传输方式有很多种,处于安全考虑,常用的一般都是GET和POST两种,先来介绍下这两种
1)GET:获取资源
GET方法用来请求访问已被URL识别的资源
2)POST:传输实体主体
POST方法用来请求服务器传输信息实体的主体
GET和POST的区别:
首先,使用目标不同:GET方法只是用来查询,不会对浏览器上的信息产生影响,每次GET的方法都是相同的
其次,大小不同:GET是放在URL首部,因此大小随着浏览器而定,而POST则是在报文中,只要没有具体限制,文件的大小是没限制的
然后,安全性不同:GET采用的是明文传输,而POST是放在报文内部,无法看到
从使用场景的角度来说,一般像用户注册登录这种信息都是私密的,采用POST,而针对查询等,为了快速,大多采用GET传输。
(关于关于GET和POST的区别,最近重新看了很多别人写的博客啊资料什么的,发现上面的解释比较模糊,我就在下面的评论区里面将区别清晰的描述一下,当然,后面的博客也会详细的解释)
接下来介绍其他几种数据传输方式:
3)PUT:传输文件
PUT要求在请求报文的主体中包含文件内容,然后保存到请求URL指定的位置
处于安全考虑,一般web网站不使用此方法,若配合web的安全验证机制,或者架构采用REST标准的网站,就可能开放使用此方法
4)HEAD:获得报文首部
HEAD和GET方法一样,只不过不返回报文主体部分,用于确认URI的有效性及资源更新的日期时间等
5)DELETE:删除文件
DELETE是与PUT相反的方法,是按请求URI删除指定的资源
处于安全考虑,一般web网站不使用此方法,若配合web的安全验证机制,或者架构采用REST标准的网站,就可能开放使用此方法
6)OPTIONS:询问支持的方法
用来查询针对请求URI指定的资源支持的方法
7)TRACE:追踪路径
是让web服务器端将之前的请求通信还回给客户端的方法
发送请求时,在Max-Frowards首部字段中填入数值,每经过一个服务器端就-1,当数值为0时,停止传输,最后收到服务器返回状态码200 OK的响应
但是,这种方法基本很少使用,而且很容易引起XST(跨站追踪)攻击,就更不会用到了。
8)CONNECT:要求采用隧道协议连接代理
该方法要求在于代理服务器通信时建立隧道,实现用隧道协议进行TCP通信,主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经过网络传输。
最后,附上一张http1.1和http1.0版本各自支持的方法,另外,注意用大写。。。。。。
其中,LINK和UNLINK已被HTTP1.1废弃,不再支持!
(四)Http状态码
一:http状态码
表示客户端http请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作
状态码的类别如下:
http状态码种类繁多,大概有60多种,实际上经常使用的只有14种,下面为一一介绍
1、2XX 成功:请求被正常处理
1.1 200 OK
表示从客户端发来的请求在服务器端被正常处理
1.2 204 No Content
表示服务器接收的请求以成功处理,但没有资源可返回,即:响应报文中不含实体的主体部分
1.3 206 Partial Content
表示客户端进行了范围请求且服务器成功执行了这部分的GET请求,响应报文中包含由Content_Range指定范围的实体内容
“Content_Range为请求首部的一种类型,后面的随笔会讲到”
2、3XX 重定向: 服务器需要执行某些特殊处理以正确处理请求(即URI地址或者资源的缓存的资源有效时间过期)
2.1 301 Moved Permanently
永久性重定向:表示请求的资源已被分配了新的URI,以后应使用资源现在的URI,如果已经保存了书签,这时候应该按照Location首部提示的URI重新保存
2.2 302 Found
临时性重定向:表示请求的资源已被分配到了新的URI,希望(本次)能使用新的URI访问
2.3 303 See Other
表示请求对应的资源存在另一个URI,应该使用GET方法定向获取请求的资源
PS:当301、302、303响应状态码返回,几乎所有浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求自动再次发送
301、302标准禁止将POST改为GET,但实际中都会允许这么做~~~GG
2.4 304 Not Modified
表示客户端发送得附带条件的请求时,服务器运行请求访问,但未满足条件的情况,304返回时,不包含任何响应的主体部分
附带条件:采用GET方法的请求报文中包含If-......条件的任一首部,后面的随笔中介绍
2.5 307 Temporary Redirect
临时重定向:禁止将POST转换为GET,该状态码会严格遵守浏览器标准
3、客户端错误:4XX的响应结果表明客户端是发生错误的原因所在
3.1 400 Bad Ruquest
请求报文存在语法错误
3.2 401 Unauthorized
发送的请求需要有通过http认证(BASIC认证、DIGEST认证)的认证信息
PS:若之前已经进行了一次请求,则表示用户认证失败
返回含有401的响应必须包含一个适用于被请求资源的WWW-Authenticate首部用来质询用户信息
3.3 403 Forbidden
对请求资源的访问被服务器拒绝(服务端没有必要给出拒绝的详细理由,如果想做说明,可在实体主体部分对原因进行描述)
举例:未获得文件系统的访问授权、访问权限出现某些问题等
3.4 404 Not Found
服务器上无法找到请求的资源
4、 5XX服务器错误:服务器本身发生错误
4.1 500 Internal Server Error
服务器端执行请求时发生错误
4.2 503 Server Unavailable
服务器暂时处于超负载或者正在停机维护,现在无法处理请求
(五)Web服务器
1、http1.1规范允许一台http服务器搭建多个web站点。。。
比如提供web托管服务的供应商,可以用一台服务器为多为客户服务,也可以以每位客户持有的域名运行各自不同的网站,这里利用了虚拟服务器的功能。。。
客户端使用http协议访问服务器时,会经常采用类似www.baidu.con这样的主机名和域名
在互联网上,域名通过DNS服务映射到IP地址之后访问目标网站,可见,请求发送到服务器时,已经是以IP地址形式访问
所以,如果一台服务器内托管了www.baidu.com和www.sina.com这两个域名,收到请求时就需要搞清楚究竟要访问哪个域名
在相同的IP地址下,发送请求时,必须在Host首部内完成指定主机名或者域名的URI。
2、通信数据的转发程序
http通信时,出客户端和服务器外,还有一些用于通信数据转发的应用程序,比如代理、网关、隧道
2.1 代理:具有转发功能的应用程序
扮演了客户端和服务器“中间人”的角色,接受请求并转发给服务器,同时也接受响应并返回给客户端
代理不会改变URI,会直接将请求发送给持有资源的源服务器,然后响应通过代理服务器后再传给客户端
http通信中,可以级联多台代理服务器,每次通过代理服务器转发请求和响应时,会追加写入Via首部信息,以标记出经过的主机信息
代理服务器的优点:利用缓存技术(下文)减少网络带宽流量,组织内部针对特定网站的访问控制,获取访问日志为主要目的等
缓存代理:预先将资源的副本缓存在代理服务器上,再次受到对相同资源的请求时,可以将自己的缓存返回
透明代理:转发请求或者响应时,不对报文做任何加工的代理类型
2.2 网关:转发其他服务器通信数据的服务器
接受客户端发来的请求,就像自己拥有资源的服务器一样处理请求
网关的工作机制与代理什么类似,而网关可以使通信线路上的服务器提供非http协议服务
特点:提高通信安全性,可以在客户端和网关之间通信线路上加密以确保连接安全。
2.3 隧道:在客户端和服务器之间进行中转,并保持双方通信连接的应用程序
特点:可以使用SSL等加密手段进行通信,确保客户端能与服务器进行安全的通信
3、资源的缓存
缓存是指代理服务器或者客户端本地磁盘内保存的资源副本。
利用缓存可减少对源服务器的访问,节省通信流量和通信时间。
3.1 缓存的有效期
当源服务器的资源更新时,或者因为客户端要求,缓存的有效时间等因素,都需要向源服务器确认有效性,如果缓存失效,缓存服务器将再次向源服务器获取最新的资源
3.2 客户端的缓存
缓存不仅可以存与代理服务器内,还可以存在客户端浏览器中。如果缓存有效,就可以直接从本地磁盘中读取资源
同样,当缓存过期,还是需要向源服务器请求资源
(六)报文首部
http请求和响应报文内容比较多,会分为大概四部分更新,最近比较忙,没太多时间整理- -
首先来看看报文结构吧
1、http请求报文
http请求报文由方法、URI、http版本。http首部字段等构成
下面给大家示例一个访问my_view_page.php的请求报文首部信息
GET /my_view_page.php HTTP/1.1
Host: 10.0.17.183:8000
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://10.0.17.183:8000/my_view_page.php
Accept-Encoding: gzip, deflate, sdch
关于报文的首部信息,稍微详解
2、http响应报文
http响应报文由http版本、状态码(数字和原因短语)、http首部字段3部分组成
以下是刚才访问my_view_page.php时服务器返回的响应报文首部信息:
HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate
Date: Tue, 26 Jul 2016 09:32:11 GMT
Expires: Tue, 26 Jul 2016 09:32:12 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 3892
Content-Type: text/html; charset=utf-8
Last-Modified: Tue, 26 Jul 2016 09:32:12 GMT
报文中含有众多的字段,其中又以http首部字段内容最丰富,其同时存在于请求和响应中,并涵盖http报文相关的内容
3、http首部字段
定义:构成http报文的要素之一,在客户端与服务器之间以http协议传输信息的过程中,起到传递额外重要信息的作用
3.1首部字段结构
首部字段名:字段值
例如:以Content-Type来表示报文主体的对象类型
Content-Type:text/html
另外,字段值对应的单个http首部字段可以有多个值,比如
Keep-Alive:timeout=15,max=100
3.2 4种http首部字段类型
http1.1规范了47种首部字段
3.2.1 通用首部字段
定义:请求和响应报文都会使用的首部
3.2.2 请求首部字段
从客户端向服务器发送请求报文时使用的首部,补充了请求的附加内容、客户端信息、相应内容相关优先级信息
3.2.3 响应首部字段
从服务器向客户端返回响应报文时使用的首部。补充了资源内容更新时间等与实体有关的信息
3.2.4 实体首部字段
针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间与实体有关的信息
3.2.5 End-to-end首部和Hop-by-hop首部
http首部字段将定义成缓存代理和非缓存代理的行为,分成2种类型
端到端首部(End-to-end Header)
此类别中的首部会转发给请求/响应对应的最终接受目标,而且必须保存在由缓存生成的响应中,另外规定它必须被转发。
逐跳首部(Hop-by-hop Header)
此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发;http1.1和之后的版本,如要使用该首部,需提供Connection首部字段。
下面列举下http/1.1中的逐跳首部字段,除了这8个,其他所有字段都属于端到端首部。
Connection:
Keep-Alive
Proxy-Authenticate
Proxy-Authorization
Trailer
TE
Transfer-Encoding
Upgrade
(七)通用首部字段
通用首部字段的意思,就是:请求和响应报文双方都会使用的首部
1、Cache-Control
通过指定它的指令,能操作缓存的工作机制
指令参数是可选的,多个指令通过“,”分隔
Cache-Control: private, max-age=0, no-cache
Cache-Control指令一览:
1.1 缓存请求指令
指令 |
参数 |
说明 |
no-cache |
无 |
强制向源服务器再次验证 |
no-store |
无 |
不缓存请求或相应的任何内容 |
max-age[秒] |
必须 |
相应的最大Age值 |
max-stale(=[秒]) |
可省略 |
接收已过期的响应 |
min-fresh=[秒] |
必须 |
期望在指定时间内的响应仍有效 |
no-transform |
无 |
代理不可更改媒体类型 |
only-if-cached |
无 |
从缓存获取资源 |
cache-extension |
新标记指令(token{-}) |
1.2 缓存响应指令
指令 |
参数 |
说明 |
public |
无 |
可向任意方提供响应的缓存 |
private |
可省略 |
仅向特定用户返回响应 |
no-cache |
可省略 |
缓存前必须先确认其有效性 |
no-store |
无 |
不缓存请求或响应的任何内容 |
no-transform |
无 |
代理不可更改媒体类型 |
must-revalidate |
无 |
可缓存但必须再向源服务器进行确认 |
proxy-revalidate |
无 |
要求中间缓存服务器对换缓存的响应有效性再次确认 |
max-age=[秒] |
必需 |
响应的最大Age值 |
s-maxage=[秒] |
必需 |
公共缓存服务器响应的最大Age值 |
cache-extension |
新指令标记(token{-}) |
1.3 public
共享、公开的缓存状态,与private相反
Cache-Control: public
1.4 private
指定缓存对象,需要验证
Cache-Control: private
1.5 no-cache
防止从缓存中返回过去的资源,请求中如包含该命令,表示客户端不会接收缓存过的响应,必须向源放武器转发请求
如果响应中包含该命令,那么缓存服务器不能对其资源进行缓存,且源服务器也将不在对缓存服务器请求中提出的资源有效性进行确认,且禁止其对相应资源进行缓存操作
Cache-Control: no-cache=Location
由服务器返回的响应报文首部字段中,若Cache-Control中对no-cache字段名具体制定参数值,那么客户端在收到这个被指定参数值的首部字段对应的报文后,就不能缓存
换言之,无参数值的首部字段可以使用缓存,只能在响应中制定该参数
1.6 no-store
请求中包含机密信息,缓存不能在本地存储请求或响应的任一部分k
Cache-Control: no-store
1.7 s-maxage
一般指代理服务器
与max-age指令相同,不同点在于s-maxage只适用于供多位用户使用的公共缓存服务器
当使用该指令时,直接忽略对Expires首部字段及max-age指令的处理
Cache-Control: s-maxage=604800(单位:秒)
1.8 max-age
缓存资源缓存时间数值低于指定数值,就接受缓存的资源,如max-age为0,则需要请求源服务器
http1.1中,如遇到存在Expires首部字段的情况,会忽略Expires字段,优先处理max-age指令
Cache-Control: max-age=604800(单位:秒)
1.9 min-fresh
要求缓存服务器返回未过指定时间的资源
Cache-Control: min-fresh=60(单位:秒)
1.10 max-stale
规定缓存的有效期,如指令中没有参数,则无论多久,客户端都可以接受响应,如指定了参数,即使过了有效期,只要在指令的范围内,客户端都可以接受响应
Cache-Control: max-stale
1.11 only-if-cached
表示客户端只在缓存服务器有对应资源的情况下才接受响应,若无,则返回504
Cache-Control: only-if-cached
1.12 must-revalidate
代理向客户端返回响应前再次向源服务器确认资源的有效性,若无,则返回504,且该指令会忽略请求中的max-stale指令
Cache-Control: must-revalidate
1.13 proxy-revalidate
要求所有的缓存服务器在向客户端返回响应之前再次向源服务器确认资源的有效性
Cache-Control: proxy-revalidate
1.14 no-transform
要求无论请求还是响应,都不能改变实体主体的媒体类型,防止缓存或者代理压缩图片等操作
Cache-Control: no-transform
2、Connection
该首部字段具备下面2个作用
1)控制不再转发给代理的首部字段
Connection:不再转发的字段名(即删除后再转发)
2)管理持久连接
http1.1默认都是持久连接,客户端会在持久连接上持续发送请求,当服务器明确表示需要断开连接时,则指明首部字段值为close
Connection: close
http1.1之前的版本默认都是非持久连接,需要在旧版本上保持持久连接,需要加入Keep-Alive指令
Connection-Keep-Alive
3、Date
表明创建http报文的日期和时间
目前http1.1版本使用如下格式的时间:
Date: Sun, 31 Jul 2016 01:28:48 GMT
4、Pragma
是http1.1之前的版本历史遗留字段,仅作为与http1.0的向后兼容而定义,规范定义的形式唯一,如下所示
Pragma: no-cache
只用于客户端发送的请求中,客户端要求所有的中间服务器不返回缓存的内容
5、Trailer
事先说明在报文主体后记录了哪些首部字段,可应用于http1.1版本分块传输编码时
6、Transfer-Encoding
规定报文主体的编码方式
http1.1的传输编码方式仅对分块传输编码有效
Transfer-Encoding: chunked
7、Upgrade
检测http协议及其他协议是否可使用更高的版本进行通信,其参数值可用来指定一个完全不同的通信协议
客户端请求:
GMT /index.htm HTTP/1.1
Upgrade: TLS/1.0
Connection: Upgrade
服务器响应:
HTTP/1.1 101 Switching Protocols
Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade
上面的例子中,首部字段Upgrade指定的值为TLS/1.0,这里的两个首部字段的对应关系,Connection的值被指定为Upgrade。
Upgrade对象仅限于客户端和邻近服务器之间,因此,使用首部字段Upgrade时,还需要额外指定Connection Upgrade
对于附有首部字段Upgrade的请求,服务器可以用101Switch Protocols状态码作为响应返回
8、Via
使用首部字段Via是为了追踪客户端与服务器间的请求和响应报文的传输路径
Via不仅用于追踪报文的转发,还可避免请求回环的发生,因此,必须在经过代理时附加该首部字段内容
9、Warning
告知用户与一些与缓存相关的问题的警告
Warning的首部格式如下,日期部分可省略
Warning:[警告码] [警告的主机:端口号] "[警告内容]" ([日期时间])
http1.1中定义了7中警告,警告码对应的警告内容仅供参考
另外,警告码具备扩展性,今后有可能追加新的警告
(八)请求首部字段
请求首部字段
定义:请求首部字段是从客户端到服务器发送请求报文中所使用的字段,里面包含了附加信息、客户端信息以及对响应内容相关的优先级等内容
1、Accept
通知服务器用户代理可处理的媒体类型及媒体类型的相对优先级,可使用type/subtype这种形式,一次指定多种媒体类型
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
q表示权重,默认值为1.0,当服务器提供多种内容时,将会有优先返回权重值最高的媒体类型
下面举几个例子:
文本文件:
text/html,text/plain,text/css...
application/xhtml+xml,application/xml...
图片文件:
image/jpeg,image/gif,image/png...
视频文件:
video/mpeg,video/quicktime...
应用程序使用的二进制文件
application/octet-stream,application/zip...
2、Accept-Cherset
通知服务器用户代理支持的字符集及字符集的相对优先级,可一次性指定多个字符集。
该首部字段可用权重q值来表示相对优先级
该首部字段应用于内容协商机制的服务器驱动协商
Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
3、Accept-Encoding
告知服务器用户代理支持的内容编码及内容编码优先级顺序,可一次性指定多种内容编码
Accept-Encoding: gzip, deflate
常用的几种编码格式:
gizp:由文件压缩程序gzip(GUN zip)生成的编码格式
compress:由UNIX文件压缩程序compress生成的编码格式
deflate:组合使用zlib格式及由deflate压缩格式生成的编码格式
jdentity:不执行压缩或不会变化的默认编码格式
同样,这里可以使用q值表示相对优先级,也可以使用(*)作为通配符,指定任意的编码格式
4、Accept-Lanuage
告知服务器用户代理能够处理的自然语言集,以及其相对有限集,可一次指定多种自然语言集
同样可使用权重值q表示相对优先级
Accept-Lanuage: zh-cn,zh;q=0.7,en=us,en;q=0.3
5、Authorization
告知服务器用户代理的认证信息(证书值)。
通常想要通过验证的用户代理会在接受到第一次返回的401状态码响应后,把首部字段加入请求中,共用缓存接收到含有该字段的请求时操作处理会有所差异
6、Expect
客户端使用该字段告知服务器,期望出现某种特定行为
如果服务器无法理解期望作出回应而发生错误,会返回状态码417Expect Failed,客户端可以利用该字段,写明所期望的扩展
http/1.1规范值定义了100-continue(转台吗100Continue之意)
Expect: 100-continue
7、From
告知服务器使用用户代理的用户垫子邮件地址
目的:显示搜索引擎等用户代理的负责人的电子邮件联系方式
From: IMyalost@163.com
8、Host
告知服务器请求的资源所处的互联网主机名和端口号
Host首部字段是在HTTP/1.1规范内唯一一个必须被包含在请求内的首部字段
Host: www.baidu.com
9、If-Match
格式如If-xxx这样的请求首部字段,都可以称之为条件请求,服务器收到请求,只有判定条件为真时,才会执行请求
该字段告知服务器匹配资源所用的实体标记(ETag)值,这时无法使用弱ETag值
如果判断条件不为真,则返回412Precondition Failed响应
还可以使用(*)指定If-Match的字段值,这种情况下服务器将忽略ETag值,只要资源存在就处理请求
If-Match: "123456"
10、If-Modified-Since
条件请求,告知服务器若字段指定值早于资源更新时间,则希望能处理请求,如果在该字段指定的日期时间大于资源更新时间,则返回304Not Modified响应
用于确认代理或者客户端拥有的本地资源的有消息
If-Modified-Since: Thu, 15 Apr 2004 00:00:00 GMT
11、If-None-Match
条件请求,和If-Match作用相反。当该字段值的实体标记(ETag)值与请求资源的ETag不一致时,告知服务器处理该请求
在GET或HEAD方法中使用该字段可获取最新的资源
12、If-Range
条件请求,告知服务器若指定的值和请求资源的值一致,则作为范围请求处理,反之,则返回全部资源
request: response:
GET /index.html 206 Partial Content
If-Range: "123456" Content-Range: bytes 5001-10000/10000
Range: bytes=5001-10000 Content-Length:5000
上面的请求和资源匹配一致,那么久作为范围请求处理
13、If-Unmodified-Since
条件请求,该字段和If-Unmodified-Since字段作用相反,作用是告知服务器,指定的请求资源只有在字段值内指定的日期之后,未发生更新的情况下,才能处理请求。
如指定时间之后发生更新,则返回412 Precondition Failed作为响应返回
If-Unmodified-Since: Thu, 03 Jul 2016 00:00:00 GMT
14、Max-Forwards
我们都知道使用http协议通信时,请求可能会经过代理等多台服务器,如果由于某些原因导致请求转发失败,那么客户端收不到响应,我们对此一无所知
通过TRACE或者OPTIONS方法,发送包含该字段的请求时,该字段以十进制整数形式指定可经过的服务器最大数目
简单来讲,就是指定Max-Forwards的值,每经过一次转发,就-1.当值变为0.直接返回响应
Max-Forwards: 10
15、Proxy-Authorization
收到代理服务器发来的认证质询时,客户端向代理服务器发送包含首部字段的请求,以告知服务器所需要的认证的信息
Proxy-Authorization: Basic dGLwoPNLAGKGFY5
16、Range
对于只需获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的指定范围
接收到附带Range字段的服务器,会返回206Partial Content的响应;无法处理请求时,则返回200 OK的响应及全部资源
Range: bytes=5001-10000
17、Referer
告知服务器请求的原始资源的URI
Referer:www,baidu.com/index.xml
18、TE
告知服务器客户端能够处理响应的传输编码方式及相对优先级
TE:gzip, deflate;q=0.5
该字段还可以指定伴随trailer字段的分块传输编码的方式
TE:trailers
19、User-Agent
该字段会将创建请求的浏览器和用户代理名称等信息传给服务器
如果由网络爬虫发起请求,可能会在请求中添加爬虫作者的垫子邮件地址。因此,如果请求经过代理,那么中间也很可能被添加上代理服务器名称
User-Agent: Mozilla/5.0 (windows NT 6.1; WOW64; rv13.0) Gecko/=20100101 Firfox/13.0.1
(九)响应首部字段
响应首部字段:
服务器向客户端返回响应报文中所使用的字段,用于补充的附加信息、服务器信息、以及对客户端的附加要求等
1、Accept-Ranges
告知客户端服务器能否处理范围请求,以指定获取服务器的某部分资源
可指定的字段值分2种:
1.1 bytes:可处理范围请求
1.2 none:不能处理范围请求
Accept-Ranges: bytes
2、Age
告知客户端源服务器创建响应多久了,单位S
若创建响应的是缓存服务器,该字段指缓存后响应再次发起认证到认证完成的时间值,此时,必须加上首部字段Age
Age: 600
3、ETag
告知客户端实体标识。
这是一种将资源以字符串形式做唯一标识的一种方式,服务器会为没份资源分配对应的ETag值
另外,当资源更新时,ETag值也需要更新
ETag: "82e22293907ce725faf67773957acd12"
强ETag值和弱ETag值
3.1 强ETag值:不论实体发生多么细微的变化,都会改变其值
ETag: "usagi-1234"
3.2 弱ETag值
只提示资源是否相同;只有资源发生了根本改变,产生差异才会改变ETag值,此时,会在字段值最开始处附加W/
ETag: W/"usagi-1234"
4、Location
将响应接受方引导至某个与请求URI位置不同的资源
基本上该字段都会配合3xx:Redirction的响应,提供重定向的URI
Location: http://www.usagidesign.jp/sample.html
5、Proxy-Authenticate
把代理服务器所要求的认证信息发给客户端,他的认证行为在客户端与代理间进行
Proxy-Authenticate: basic realm="Usagidesign Auth"
6、Retry-After
告知客户端在多久之后再次发送请求,主要配合状态码503 Service Unavailable响应,或者3XX Redirect响应一起使用
字段值可以指定具体的日期时间(Wed, 04 Jul 2012 06: 34: 24 GMT等格式),也可以是创建响应后的秒数
Retry-After: 120
7、Server
告知客户端当前服务器上安装的http服务器应用程序的信息。其中包含软件应用名称,甚至版本号和安装时的启动项
Server: Apache/2.2.17(Unix)
Server: Apache/2.2.6(Unix) PHP/5.2.5
8、Vary
控制缓存。源服务器向代理传达关于本地缓存使用方法的命令
客户端收到从代理服务器收到的从源服务器返回的包含该字段指定项的响应之后,若再次进行缓存,仅对请求中含有相同字段的请求返回缓存
Vary: Accept-Language
9、WWW-Authenticate
HTTP访问认证。告知客户端适用于访问请求URI所指定资源的认证方案和带参数提示的查询
状态码401 Unauthorized响应中,肯定包含该字段
(十)实体首部字段
1、定义
包含在请求和响应中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息
2、Allow
通知客户端能够支持的Request-URI指定资源的所有http方法:如果服务器接收到不支持的方法,会返回状态码405Method Not Allowed作为响应返回
Allow:GET, HEAD
3、Content-Encoding
告知客户端服务器对实体的主体部分的选用的内容编码方式
内容编码指在不丢失实体信息的前提下所进行的压缩
主要采用以下这四种内容编码方式
gizp,conpress,deflate,identity
Content-Encoding: gizp
4、Content-Lanuage
告知客户端实体主体使用的自然语言(优先接收的语言)
Content-Lanuage: zh-CN
5、Content-Length
表明实体主体部分的大下(单位是字节)
若对实体主体进行编码传输,不能使用该字段
Content-Length: 15000
6、Content-Location
给出了与报文主体部分相对应的URI。与Location不同,该字段表示的是报文主体返回资源的URI
Content-Location: http://www.baidu/com/index-miss.html
7、Content-MD5
由一串由MD5算法生成的值,其目的在于检查报文 主体在传输中是否保持完整,以及确认传输到达。
Content-MD5: OFJKGKLDFUIGNG35565FGNHLDGNH==
8、Content-Range
告知客户端作为响应返回的实体的哪个部分符合范围请求,(单位:字节),表示当前发送部分及整个实体大小
Content-Range: bytes 5001-10000/10000
9、Expires
告知客户端资源失效的日期
如果首部字段存在Cache-Control有指定max-age指定时,会优先处理max-age指令
Expires: Wed, 04 Jul 2016 09:26:05 GMT
10、Last-Modified
指明资源的最终修改的时间
Last-Modified: Wed, 04 Jul 2016 09:26:05 GMT
这部分主要是附带说说,一般工作中不常用到,但了解也是很有好处的 - -
为Cookie服务的首部字段
Cookie的工作机制是用户识别及状态管理。
实现原理:方便管理用户状态,通过web浏览器将一些数据临时写入用户的计算机内,当用户访问时可通过通信方式取回之前发送的Cookle
调用Cookie的时候,由于可以调用Cookie的有效期,以及发送方的域、路径、协议等信息,所以正规发布的Cookie不是因为来自其他web站点和攻击者的攻击而泄漏
为Cookle服务的首部字段:
1、Set-Cookie字段的属性:
1)expires
指定浏览器可发送Cookie的有效期
若不指定则默认为会话时间段内
一旦Cookie从服务端发送到客户端,服务器就不存在可显式删除Cookie的方法,但可通过覆盖已过期的Cookie,实现对客户端的实质性删除
2)path
用于限制指定Cookie发送范围的文件目录
3)domain
通过该属性指定的域名可做到与结尾匹配一致
除了针对具体指定的多个域名发送的Cookie外,不指定domain属性显得更安全
4)secure
限制web界面仅在HTTPS安全连接时,才可以发送Cookie
发送Cookie时,指定属性的方法如下:
Set-Cookie: name=value; secure
5)HttpCookie
Cookie的扩展功能,使JavaScript脚本无法获得Cookie。主要目的是为了防止跨站脚本攻击对Cookie的信息窃取
发送指定HttpOnly属性的方法如下:
Set-Cookie: name=value; HttpOnly
2、Cookie
告知服务器,客户端想获得http状态管理支持时,就会在请求中包含从服务器接收到的Cookie。接收多个时,同样可以以多个发送
到这里基本关于http协议的基础就整理完了,整个的思路大概就是对TCP/IP的介绍,握手,数据传输的方式以及几种数据传输方法,请求响应报文的类型,字段等知识。。。
(十一)http与https
一、http的缺点
之前有介绍过http协议相关的一些知识,http是相当优秀和方便的,但它也有缺点,主要不足表现在如下几个方面:
△ 通信使用明文(不加密),内容可能会被窃听
△ 不验证通信方的身份,因此可能遭遇伪装
△ 无法证明报文的完整性,所以有可能已被篡改
其他未加密的协议也存在这类问题
△ 某些特定web服务器和特定web浏览器存在安全漏洞
1、通信使用明文可能被窃听
http本身不具有加密功能,无法做到对通信整体(使用http协议通信的请求和响应内容)进行加密,即:http报文使用明文(未经加密的报文)方式传送
TCP/IP协议族的通信机制:通信内容在所有通信线路上都可能被窥视
应对措施:对通信进行加密处理防止被窃听
加密对象:
①.通信的加密
http协议没有加密机制,可以通过SSL(Secure Socket Layer:安全套接层)或TLS(Transport Layer Security:安全层传输协议)组合使用,
加密http的通信内容,这就是常说的https(超文本传输安全协议)
②.内容的加密
http协议没有加密机制,对传输的内容本身进行加密,即报文实体主体部分;客户端对请求报文加密处理后传输,但前提是客户端和服务器都具有加密和解密机制,
主要应用于WEB服务中(但仍然有被篡改的风险)
2、不验证通信方身份,可能遭遇伪装
http协议中请求和响应不会对通信方进行确认,即存在“服务器是否是发送请求中URI真正指定的主机。返回的响应是否真的返回到实际提出请求的客户端”等类似问题
任何人都可以发起请求,服务器只要接收到请求,不管对方是谁都会返回一个响应(仅限于发送端IP和端口号没有被WEB服务器设定限制访问的前提下)
http协议的隐患有以下几点:
①.无法确定请求发送至目标的web服务器是否是按真实意图返回响应的服务器;有可能是已伪装的服务器
②.无法确定响应返回到的客户端是否是按真实意图接受响应的那个客户端;有可能是已伪装的客户端
③.无法确定正在通信的对方是否具备访问权限;因为某些web服务器保存有重要信息,只发给特定用户通信的权限
④.无法判断请求来自何方
⑤.即使时无意义的请求也会接收,无法阻止海量请求下的D0S攻击(Denial of Service:拒绝服务攻击)
3、无法证明报文完整性,可能已遭篡改
完整性:指信息的准确度,若无法证明其完整性,意味着无法判断信息是否正确
http协议无法证明通信的报文完整性,因此,请求或者响应在传输过程中,如果遭到篡改,是无法知道的;类似这种请求或响应传输中被攻击者拦截篡改的攻击
称为中间人攻击(Man-in-the-Middle attack,MITM)
防止篡改:常用的方法有MD5和SHA-1等散列值校验的方法,以及来确认文件的数字签名方法
二、HTTP+加密+认证+完整性保护=HTTPS
1、通常把添加了加密和身份认证机制的http协议称为https(HTTP Secure);证书可证明服务器或者客户端的身份
2、https相当于身披SSL外壳的http
https并非应用层的一种新协议,而是在http通信接口部分用SSL(Secure Socket Layer:安全套接字层)和TLS(Transport Layer Security:安全层传输协议)协议代替
通常,http和TCP直接通信,当使用SSL时,先由http和SSL通信,再由SSL和TCP通信
SSL是独立于http的协议,其他应用层的如SMTP何Telnet等协议都可以配合SSL进行使用
3、加密技术
SSL采用公开密钥加密(Public-key cryptography)的加密处理方式,加密方法中加密算法是公开的,但密钥是保密的,以保持加密方法的安全性(密钥用来对已经加密的内容进行解密)
加密和解密通用一个密钥的方式称为共享密钥加密(Common key crypto system),也称为对称密钥加密
公开密钥加密方式:
公开密钥加密使用一对非对称密钥,一把叫做私有密钥(private key),一把叫做公开密钥(public key)
过程:发送密文的一方使用对方公开的密钥进行加密,对方收到被加密信息后,使用自己的私有密钥进行解密(要想根据密文和公开密钥解密,理论上可以,但实际操作起来,非常困难)
HTTPS采用混合加密机制
https采用共享密钥加密和公开密钥加密两者并用的混合加密机制。若密钥可实现安全交换,则可能仅使用公开密钥加密(公开密钥加密相比共享密钥加密,速度较慢)
实际运用中应该合理运用两种加密机制的优势,组合起来进行通信(交换密钥环节利用公开密钥加密方式,建立通信交换报文阶段使用共享加密机制)
4、证书
由数字证书认证机构(CA:Certificate Authority)和其他相关机关颁发的公开密钥证书
处于客户端和服务器双方都可信赖的第三方机构立场,对通过申请的服务器公开密钥做数字签名,分配该公开密钥,将其与共钥证书绑定,然后服务器传给客户端,以进行公开密钥加密方式通信;
收到证书的客户端使用数字证书认证机构的公开密钥,对服务器证书的数字签名进行认证,然后明确2点:
①.认证服务器的公开密钥是真实有效的数字证书认证机构
②.服务器的公开密钥是指的信赖的
作用:
①.证明通信方的服务器是否规范
②.确认对方服务器背后运营的企业是否真实存在(拥有该功能的证书就是EV SSL证书:Extended Validation SSL Cetificate );特点:浏览器背景色是绿色的
5、HTTPS安全通信机制
HTTPS通信过程:
①.客户端发送Client Hello报文开始通信,报文中包含客户端支持的SSL指定版本、加密组件、列表等
②.服务器接收到请求报文时,在响应报文中包含SSL版本以及加密组件发送Server Hello(加密组件内容从接收到的客户端加密组件中筛选出来)
然后服务器发送Certificate报文,其中包含公开密钥证书
最后服务器发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束
③.第一次握手结束,客户端Client Key Exchange报文回应,报文中包含通信加密中使用的一种名为Pre-master sercet的随机密码串(该报文已用上一步骤的公开密钥进行加密)
接着客户端你继续发送Change Cipher Spec报文,该报文提示服务器,在此报文之后的通信采用Pre-master sercet密钥加密
最后客户端发送Finished报文;该报文包含通信连接至今全部报文的整体校验值(这次握手能否成功,以服务器是否可以正确解密报文为判断标准)
④.服务器同样发送Change Cipher Spec报文
服务器同样发送Finisher报文
⑤.服务器和客户端Finished报文交换完成后,SSL连接完成,通信收到SSL保护,
⑥.应用层协议开始通信,即HTTP请求
⑦.最后由客户端断开连接;断开连接时,发送close_notify报文,然后发送TCP FIN报文关闭与TCP的通信
上面的通信过程中,应用层发送数据时会附加MAC(Message Authentication Code)报文摘要,MAC可查询报文是否遭受篡改,保护报文完整性
通信流程图(服务器公开密钥证书建立HTTPS的过程)
HTTPS使用SSL(Secure Socket Layer:安全套接字层)和TLS(Transport Layer Security:安全层传输协议)这两种协议
△ :使用SSL时,处理速度回变慢
①.通信慢:通信时候大量消耗CPU及内存资源,相比较HTTP而已,网络负载可能变慢2-100倍(通信量增加)
②.加密处理:在服务器和客户端都要进行加密和解密,更多的消耗了服务器和客户端硬件资源,导致负载增强
改善方案:使用SSL加速器(专用服务器),为SSL通信专硬件,可以提高数倍SSL计算你速度,仅在SSL通信处理时发挥作用,以分担负载。
(十二)http概述
1、web客户端和服务器
http客户端发出请求,其中包含请求内容,发给服务器,服务器再返回内容中回送请求的数据,http客户端和服务器构成了万维网的基本组件
我们常说的客户端,就是web浏览器,比如微软的IE、Google的chrome,火狐的Firefox等,浏览器向服务器发送http请求对象,并将对象显示在你的屏幕上
2、资源
web服务器是web资源的宿主,源头;最简单的web资源就是服务器文件系统中的静态文件,其中可能包含很多内容:文本文件、HTML文件、word文件、图片文件、Adobe的acrobat文件等
但资源不局限于静态文件,它还可以根据需要生成软件程序(比如照相机中活生生的照片、股票交易、房产交易的数据库、在线商店中的礼物等等)
总之,所有类型的内容都来源于资源。。。
2.1 媒体类型
互联网上有数千种不同的数据类型,http给每种需要通过http传输的对象都打上了MIME类型(MIME type)的数据格式标签
MIME:多用途英特网邮件扩展
web浏览器每次从服务器取回一个对象时,会先查看其MIME类型,看看能否处理该类型;大多数浏览器都可以处理数百种常见的对象类型
MIME类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠来分隔,例如
HTML格式的文本文档:text/html
普通的ASCII文本文档:text/plain
图片类型:image/jpeg、image/gif
2.2 URI
每个服务器资源都有一个名字,这样客户端就可以说明它对什么资源感兴趣
服务器资源名称被称为:统一资源标识符(Uniform Resource Identifier,URI)
URI就像因特网上的邮政地址一样,在世界范围内唯一标识并且定位信息资源
2.3 URL
URL:统一资源定位符是资源最常见的形式,它描述了一台特定服务器上某资源的特定资源,明确说明了如何从一个精确、固定的位置获取资源
上图的URL说明了协议、服务器和本地资源
大部分URL遵循一种标准格式,该格式包含三个部分:
第一部分:方案;说明了访问资源所使用的协议类型,通常为http协议:hhtp://
第二部分:地址;比如:www.baidu.com
第三部分:指定服务器上某个资源,比如:specisal/saw-blade.gif
2.4 URN
URI的第二种方式就是URN:统一资源名;URN是作为特定内容的唯一名称使用的,与目前的资源所在地无关,使用URN,可以将资源四处转移,还可用同一个名字通过多种网络协议来访问资源
URN还处于试验阶段,因为其有效的工作需要一个支撑架构来解析资源的位置。而此类架构比较缺乏,后面详解介绍
3、事务
一个事务由一条请求命令和一条响应结果构成,这种通信时通过http报文(HTTP message)的格式化数据块进行的
事务也可以理解为从客户端到服务器再到客户端,一次完整通信的过程
3.1方法
http支持八种不同的请求命令,被称为方法,每条请求报文都包含一个方法,告诉服务器要执行什么动作,之前有专门介绍过这几种方法;
传送门:http://www.cnblogs.com/imyalost/p/5630940.html
3.2状态码
每条响应报文都会携带一个状态码,用以告知客户端,请求结果,或是否需要其他动作,之前也有介绍过这几种状态码;
传送门:http://www.cnblogs.com/imyalost/p/5688169.html
3.3一个web界面中可以包含多个对象
通常并不是单个资源,而是一组资源的集合(一个事务获得一种资源,不同的资源【甚至分布在不同服务器上】组合构成一个界面)
4、报文
构成:一行行简单的字符串组成
特点:纯文本,方便读写
请求报文(request message):从客户端发往服务器
响应报文(response message):从服务器发往客户端
http报文包括以下三个部分:
起始行:报文第一行,用来说明要做什么,出现了什么情况
首部字段:位于起始行后面,有零个或者多个,每个首部字段都包含一个名字和一个值,便于解析,之间用冒号(:)隔开,以一个空行结束
主体:空行下面为报文主体,其中包含了所有类型的数据
5、连接协议
5.1 TCP/IP
http协议是位于整个数据传输通信的最上层应用层协议,不关注细节,负责通信细节的协议为传输层控制协议(Transmission Control Protocl,TCP)
TCP特点:1)无差错的数据传输
2)按序传输(按照数据发送顺序到达服务器)
3)未分段的数据流(任意时刻任何大小将数据发出去)
英特网是全世界计算机和网络设备最常用的层次化分组交换网络协议集,其隐藏了网络和硬件的特点和弱点,使各类型的计算机和网络都能进行可靠的通信
下面是互联网协议的五层协议栈
5.2 连接、IP地址及端口号
客户端向服务器发送请求报文之前,需要用网际协议(Internet Protocol,IP)地址和端口号在客户端和服务器之间建立一条TCP/IP连接通道
URL是资源的地址,自然能够为我们提供储存资源的机器的地址,看下面几个URL:
http://207.200.83.29:80/index.html
http://www.netscape.com:80/index.html
http://www.netscape.com/index.html
第一个使用了机器的IP地址207.200.83.29,以及端口号80
第二个使用了文本形式的域名(主机名:IP地址比较人性化的别称)。通过域名服务(Domain Name Service,DNS)机制对主机名进行转换,后面详细介绍这一部分
第三个没有端口号,这种情况一般默认端口号为80。
下图为浏览器通过http显示服务器中某个简单HTML资源的流程导图
步骤如下:
1)浏览器从URL中解析出服务器主机名;
2)浏览器将主机名转换为服务器的IP地址;
3)浏览器将端口号(如果有)从URL中解析出来;
4)浏览器建立一条与服务器的连接TCP连接通道;
5)浏览器向服务器发送一条http请求报文;
6)服务器向浏览器发送一条http响应报文;
7)结束通信,关闭连接,浏览器显示具体资源;
说到这里,我很想写写关于数据通信时候所谓的“三次握手”,但之前的http协议基础中已经介绍过,还不懂的可以去里面找找,其实就是数据的封装
6、协议版本
目前我们使用的http协议版本是http1.1,其重点关注的是校正http设计中的结构性缺陷,明确语义,引入重要的性能优化措施,并删除一些不好的特性
HTTP-NG(http2.0):是http1.1后继结构的原型建议,重点关注性能的大幅优化,以及更强大的服务逻辑远程执行框架
目前http2.0还在不断商议中,可能被应用到的新技术预计有以下7种,不排除有重大更改的可能性
7、web的结构组件
web的应用程序,除了浏览器和服务器之外,还有其他几个很重要的组件(以前的博客中有介绍,所以这里就大致说下,后面具体解释他们的功能用处)
7.1 代理:位于客户端和服务器之间的http中间实体
web安全、应用集成以及性能优化的重要组成模块
出于通信安全考虑,会将代理做为转发所有web数据流的可信任中间节点使用,还可对请求响应进行过滤,后面详细介绍
7.2 缓存:http仓库,使常用页面资源可以保存在离客户端更近的地方
web缓存或者代理缓存,可以将经过代理传送的常用的允许缓存的资源保存下来,下一个请求若有相同的资源,可直接享受该资源
http对缓存定义了很多功能,使缓存更高效,并规范了缓存资源的有效期和隐私性,后面详细介绍
7.3 网关:连接其他应用程序的特殊web服务器
网关通常将http数据流转换成其他的协议,接受请求时就好像自己是资源的源服务器,例如
一个http/ftp网关会http请求接受对ftp-URL的请求,但通过ftp协议来获取资源,得到的资源被封装成一条http报文,发送给客户端
关于具体的网关的内容,后面详细介绍
7.4 隧道:对http通信报文进行盲转发的特殊http应用程序
隧道常用的方式是通过http连接承载加密的安全套接层(Secure Scokets Layer,SSL)数据流,这样SSL数据流可以穿过只允许web数据流通过的防火墙
隧道可以在非http网络上转发数据(显示的是HTTP/SSL隧道)
7.5 Agent代理:代表用户发起自动http请求的半智能web客户端程序
其他类型:对web上闲逛的自动用户采用Agent代理,无人监视下发布http事务并获取内容,比如:“网络蜘蛛”、“网络机器人”等
自动搜索引擎“网络蜘蛛”就是Agent代理,可以全世界范围内获取web页面
(十三)URL与资源
一、URL的语法
URL是互联网资源的标准化名称
URL提供了一种定位互联网上任意资源的手段,但这些资源要通过不同方案(协议:比如http、ftp、smtp)来访问,因此URL语法会略有差异
大部分URL都遵循通用的语法,而且不同URL方案风格和语法都有重叠
大多数URL协的语法都建立在下面9个部分构成的通用格式上:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
其中最重要的3个部分是:方案(scheme)、主机(host)和路径(path)
通用URL组件:
1、方案-使用什么协议
方案:实际上规定了如何访问指定资源的主要标识符,它告诉负责解析URL的应用程序应该是用什么协议
方案组件必须以一个字母符号开始,由第一个“:”符号将其与URL其余部分分隔开来。(方案名大小写不敏感)
2、主机与端口
想要在往上寻找到资源,应用程序需要知道哪台机器装载了资源,以及在机器的什么地方可以找到对目标资源进行访问的服务器,URL的主机和端口提供这2点信息
主机组件标识了往上能访问资源的宿主机器。可用主机名或者IP地址来表示主机名。比如下面2个URL就是指向同一个资源
主机名指向:http://joes-hardware.com:80/index.html
IP指向:161.58.228.45:80/index.html
端口组件标识了服务器正在监听的网络端口。对下层使用TCP协议的http协议来说,默认端口为80
3、用户名和密码
有些服务器都要求输入用户名和密码才允许用户访问数据,比如FTP(文件传输协议),如下面几个例子
ftp://ftp.prep.ai.mit.edu/pub/gnu
没有用户名和密码,只有标准的协议、主机和路径;如果某个应用程序使用的URL协议要求输入用户名密码,但用户没有提供,通常会插入一个默认的用户名和密码,比如FTP
ftp://anonymous@ftp://ftp.prep.ai.mit.edu/pub/gnu
指定了一个用户名anonymous,与主机组合在一起,看起来像一个email地址一样;字符“@”将用户名和密码组件与其他部分分隔开来
ftp://anonymous:my_password@ftp://ftp.prep.ai.mit.edu/pub/gnu
指定了用户名和密码,两者之间由字符“:”隔开
4、路径
路径说明了请求的资源位于服务器的什么地方,通常是一个分级的文件系统路径;比如:
http://joes-hardware.com:80/seasona/index-fall.html
这个URL中的资源路径就是seasona/index-fall.html,很像Unix文件系统中的文件系统路径
路径是服务器定位资源所需的信息,可以用“/”将http URL中的路径组件划分为一些路径段(path segment),每个路径段都有自己的参数字段
5、参数
对很多协议来说,只有简单的主机名和到达对象路径的是不够的,除了端口和用户名密码,还需要更多的内容才可以访问
有些负责解析URL的应用程序需要协议参数才能工作;否则服务器不会提供服务,或者提供错误的服务,比如
ftp协议有两种传输方式:二进制和文本。如果用文本形式传送二进制图片,结果很难预料有多糟糕
参数组件是URL中的名值队列表,由“/”将其与其他部分分隔开,比如
ftp://ftp.prep.ai.mit.edu/pub/gnu;type=d
参数为type=d,其中参数名为type,值为d
6、查询字符串
在我们发送请求时,很多的资源,比如数据库服务,都可以通过查询来缩小请求资源的类型范围,例如
http://www.joes-hardware.com/inventoty-check.cgi?itcm-12731
问号(?)右边的内容就是这个URL的查询组件。URL的查询组件和标识网关资源的URL路径组件一起被发送给网关资源。可以将网关当做访问其他应用程序的访问点
如下图:查询目的是检查清单中是否size为large、color为blue的条目
网关基本都是希望查询字符串以一系列“名/值”对的形式出现,名值对之间用“&”分隔
上面的例子,查询组件有2个名/值对:item=12731和color=blue
7、片段
有些资源类型,比如HTML,除了资源级意外,还可以进一步划分,比如一个带有章节的大型文本文档,资源的URL会指向整个文档,但理想情况,可以指向资源中的章节
为了方便引用,URL允许使用片段(frag)组件来表示资源内的一个片段,片段挂在URL右边,最前面有一个字符“#”,比如:
http://www.joes-hardware.comtools.html#drills
这个例子中,片段引用了joes-hardwareweb服务器上页面/tools.html中的一个部分,这部分名字叫drills
服务器处理的是整个对象,URL片段仅由客户端使用并展示
二、URL快捷方式
web可以理解并使用URL的快捷方式,比如缩略,自动扩展(用户输入关键部分,浏览器负责填充)
1、相对URL
URL有2种方式:绝对的和相对的。目前为止,我们使用的URL基本都是绝对的,它包含了访问资源所需的全部信息
相对URL是不完整的,要从相对URL中获取访问资源的全部信息,就必须相对于另一个基础(base)的URL进行解析
相对URL是URL的一种便捷缩略记法,下面是一个嵌入了相对URL的HTML文档实例
<html>
<head><title>joe's tools</title></head>
<body>
<h1>tools page</h1>
<h2>hammers<h2>
<p>joe's hardware online has the largest selection of<a herp="./
hammers.html">hammers
<a/>on earth
</body>
</html>
上面的例子是资源http://www.joes-hardware.com/tools.html的HTML文档,在这个文档中包含了URL./hammers.html的超链接
虽然看起来不完整,但实际上是合法的相对URL,这个URL可以相对于它所在的文档中的URL对其进行解释
使用缩略形式的相对URL语法,写HTML时就可以省略URL中的方案、主机和其他一些组件,这些组件可以从所属资源的基础URL中推导出来,其他资源的URL也可以用这种缩略形式来表示
下图说明了如何从基础URL中推导出缺失的组件信息
相对URL只是URL的片段或一小部分,处理URL的应用程序需要在相对和决定URL之间进行转换
PS:相对URL为了保持一组资源(HTML页面)的便捷性提供了一种便捷方式,如果使用相对URL,可以在搬移一组文档时,仍保持链接的有效性;
因为相对URL是相对于新基础进行解释的,类似于在其他服务器提供镜像内容等功能
1.1 基础URL
基础URL是作为相对URL的参考点来使用的,可以来自以下不同的地方:
在资源中显式提供:有些资源会显式指定基础URL
比如:HTML文档中可能会包含一个定义了基础URL的HTML标记<BASE>,通过它来转换HTML文档中的所有相对URL
封装资源的基础URL:如果在一个没有显式指定基础URL的资源中发现一个相对URL,如上面的HTML文档所示,可将其所属资源的URL作为基础
没有基础URL:某些情况没有基础URL,一般意味着你有一个相对URL,但有时可能只是一个不完整或者损坏的URL
1.2 解析相对引用
解析:要将相对URL转换为一个决定URL,需要将相对URL和决定URL划分成组件段,这样,实际上只是在解析URL,但这种做法会将其划分为一个个组件,可以称之为解析/分解URL
将基础和相对URL划分成组件,可以下用下图的算法来完成转换
这个算法将一个相对URL转换成了其绝对模式,之后,就可以用其引用资源
2、自动扩展URL
很多浏览器会在用户提交URL/输入URL时尝试自动扩展URL,这样为用户提供便捷,用户不需要输入完整的URL,浏览器自动扩展
自动扩展特性有以下2种方式:
2.1 主机名扩展
只要有些小提示,浏览器就可以帮你将输入的主机名扩展为完整的主机名,比如:输入baidu,构建出www.baidu.com;弊端在于有时候会为其他http应用程序带来问题,比如代理,后面详细解释
2.2 历史扩展
将以前用户访问过的URL记录储存起来,当用户输入URL时将其与历史记录中的URL前缀进行匹配,并提供一些完整的选项供用户选择
PS:与代理一起使用时,URL自动扩展的行为可能有所不同,后面详细解释
三、URL字符集
URL是可移植的:它命名了互联网上所有的资源,需要通过各种不同协议来传输资源,资源在传输时采取了不同的机制,因此,信息的安全传输就很重要
安全传输意味着URL传输不能丢失信息,但有些协议,比如SMTP(简单邮件传输协议),传输方法就是剥去一些特点的字符
URL是可读的:因此,即使不可见、不可打印的字符能穿过邮件程序,从而成为可移植的,也不能在URL中使用
URL是完整的:有人希望URL中包含初通用的安全字母表之外的二进制数据或字符,因此需要一种转义机制,将不安全的字符编码为安全字符再传输
1、URL字符集
1.1 很多计算机应用程序使用的都是ASCII字符集,ASCII使用7位二进制码来表示大多数按键和少数不可控字符,其移植性也很好,但考虑到全球用户太多,以及有时候URL中会包含任意二进制数据
就需要将转义序列集成进来,通过转义序列将ASCII字符集的有限子集对任意字符值或数据进行编码,这样就实现了可移植和完整性
1.2 编码机制
为了避开安全字符集带来的限制,人们设计了“转义”表示法来表示不安全字符,其中包含一个百分号(%),后面跟2个表示字符ASCII码的十六进制数,下面是几个例子
1.3 字符限制
URL中,有几个字符被保留起来,有着特殊含义。有些字符不在定义的ASCII字符集中,还有些字符会和某些协议网关产生混淆,因此不赞成使用
四、常见协议
下面附录一个关于常用常见的协议列表
五、URL未来发展
URL可用来命名所有现存对象,其还提供一种可在各种协议间共享的统一命名机制,但并不完美;因为URL只表示实际地址,而不是准确的名字,意味着如果资源地址有变化,URL就无法对其进行定位
永久统一资源定位符(PURL),其本质是搜索资源过程中引入一个中间层,通过一个中间资源定位符(resource locator)服务器对资源的实际URL进行登记和追踪
客户端可以向定位符请求一个永久的URL,定位符可以以一个资源为响应,将客户端重定向到资源当前的URL去
(十四)TCP/IP协议
下面是协议层从底层至顶层的一个模型图:
一、计算机网络的背景
1.1 计算机的发展
有人说:“20世纪最伟大的发明就是计算机”,自诞生伊始,计算机经历了一系列发展,从大型通用计算机、超级计算机、小型机、个人电脑、工作站以及现如今笔记本、平板、智能手机等,
计算机已经彻底融入了我们的生活
1.2 计算机的发展模式
起初,计算机只是以单机模式(独立模式)被广泛应用,随着发展,计算机被一个个的连接起来,形成了一个计算机网路,从而实现了信息共享,远距离传递信息等工作
计算机网络,根据规模可分为2种:
WAN:Wide Area Network(广域网)
LAN:Local Area Nerwork(局域网)
二、计算机与网络发展的七个阶段
1.1 批处理
Batch Processing:事先将用户程序和数据装入卡带或磁带,由计算机按一定顺序读取,使用户要执行的程序和数据能够一并批量得到处理的方式
1.2 分时系统TSS
Time Sharing System:多个终端和同一个计算机相连,允许多个用户同时使用一台计算机系统
特性:多路性、独占性、交互性、及时性
1.3 计算机间的通信
计算机之间以通信线路连接,加快了数据读取时间,极大地缩短了传输数据时间,多台计算机分布式处理,架构变得更加灵活,操作更加人性化
1.4 计算机网络
窗口系统的产生,方便了用户操作,用户不仅可以同时执行多个程序,还能自由切换作业
窗口系统:在计算机上可以打开多个图形窗口进行处理的系统。代表性的有常用于Unix上的 X Window System、微软的Windows、苹果的Mac OS X等
1.5 互联网的出现
异构型计算机连接和电子邮件、万维网等信息传播方式促使互联网开始从大到整个公司小到一个家庭内部开始普及互联网,实现了世界各地用户通过接入互联网而即时沟通与交流
1.6 互联网技术为中心的时代
代表性事件:作为通信基础设施、支撑通信网络的电话网,被IP网所替代
1.7 “单纯建立连接”到“安全建立连接”
互联网时代给人带来了高度便捷的信息网络环境,但也带来了负面的问题:计算机病毒、信息泄露、网络欺诈等,出于个人信息安全以及数据通信更加安全便捷,安全建立连接自然而然的出现了
三、协议
1.1 随处可见的协议
互联网中常用的代表性的协议有IP、TCP、HTTP等,LAN中常用协议有IPX、SPX等
“计算机网络体系结构”将这些网络协议进行了系统的归纳;TCP/IP就是这些协议的集合
其中,还有Novell公司的IPX/SPX、苹果公司的AppleTalk(仅限苹果公司计算机使用)、IBM开发的用于构件大规模网络的SNA以及前DEC公司开发的DECnet等
1.2 协议的必要性
简单来说,协议就是计算机之间通过网络实现通信时事先达成的一种“约定”;这种“约定”使那些由不同厂商的设备,不同CPU及不同操作系统组成的计算机之间,只要遵循相同的协议就可以实现通信
协议可以分很多种,每一种协议都明确界定了它的行为规范:2台计算机之间必须能够支持相同的协议,并且遵循相同的协议进行处理,才能实现相互通信
1.3 分组交换协议
定义:将大数据分割为一个个叫做包(Packet)的较小单位进行传输的方法(之前的http协议学习随笔中有讲到数据通信过程);如图
计算机通信会在每一个分组中附加上源主机地址和目标主机地址送给通信线路;这些发送端地址、接收端地址以及分组序号写入的部分就是“报文首部”
一个较大的数据被分为很多个分组,为了标明原始数据的归属,有必要将分组序号写入包中,接收端会根据序号,分组按序重新装配为原始数据
协议中,通常会规定报文首部应写入哪些信息,如何处理;相互通信的每台计算机则根据协议构造报文首部,读取首部等内容,发送和接收方必须对报文首部和主体保持一致的定义和解释
四、协议的标准化
计算机通信诞生之初,系统化与标准化未收到重视,不同厂商只出产各自的网络来实现通信,这样就造成了对用户使用计算机网络造成了很大障碍,缺乏灵活性和可扩展性
为解决该问题,ISO(国际标准化组织)制定了一个国际标准OSI(开放式通信系统互联参考模型)
TCP/IP并非ISO指定,是由IETF(国际互联网工程任务组)建议、致力推进标准化的一种协议,其中,大学等研究机构和计算机行业是推动标准化的核心力量,现已成为业界标准协议
协议的标准化也推动了计算机网络的普及
五、协议分层和OSI参考模型
1.1 协议的分层
概念:ISO在指定标准的OSI之前,提出了作为通信协议设计指标的OSI参考模型,将协议分为七层,使得原来复杂的网络协议更加简单化
定义:在七层模型中,每个分层都接受由它下一层所提供的特定服务,并且负责为自己的上一层提供特定的服务,上下层之间进行交互所遵循的约定叫做“接口”,同一层之间的交互所遵循的约定叫做“协议”
协议分层的优点:
每个分层可以独立使用,其实系统中某些分层发生变化,也不会影响整个系统,因此可以构造一个扩展性和灵活性都比较强的系统;
此外,通过分层可以细分通信功能,更易于单独实现每个分层的协议,界定各个分层的具体责任和义务
协议分层的劣势:
过分模块化,处理变得更加沉重,以及每个模块都不得不事先相似的处理逻辑等
1.2 OSI参考模型
实际上,分组通信协议很复杂,OSI参考模型将其分为了易于理解的七个分层,如下图:
不过,OSI参考模型只是一个模型,对各层只做了粗略的定义,并没有对接口和协议做详细的定义,想深入了解还需要学习具体的协议规范
1.3 OSI参考模型中每个分层的作用
下图表述了简单的每个分层的作用:
1.3.1 应用层:为应用程序提供服务并规定应用程序中通信相关的细节;包括的协议如下:
①:超文本传输协议HTTP:这是一种最基本的客户机/服务器的访问协议;浏览器向服务器发送请求,而服务器回应相应的网页
②:文件传送协议FTP:提供交互式的访问,基于客户服务器模式,面向连接 使用TCP可靠的运输服务
主要功能:减少/消除不同操作系统下文件的不兼容性
③:远程登录协议TELNET:客户服务器模式,能适应许多计算机和操作系统的差异,网络虚拟终端NVT的意义
④:简单邮件传送协议SMTP:Client/Server模式,面向连接
基本功能:写信、传送、报告传送情况、显示信件、接收方处理信件
⑤:DNS域名解析协议:DNS是一种用以将域名转换为IP地址的Internet服务
⑥:简单文件传送协议TFTP:客户服务器模式,使用UDP数据报,只支持文件传输,不支持交互,TFTP代码占内存小
⑦:简单网络管理协议(SNMP): SNMP模型的4个组件:被管理结点、管理站、管理信息、管理协议
SNMP代理:运行SNMP管理进程的被管理结点
对象:描述设备的变量
管理信息库(MIB):保存所有对象的数据结构
⑧DHCP动态主机配置协议: 发现协议中的引导文件名、空终止符、属名或者空,DHCP供应协议中的受限目录路径名 Options –可选参数字段,参考定义选择列表中的选择文件
1.3.2 表示层:将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式;主要负责数据格式的转换,确保一个系统的应用层信息可被另一个系统应用层读取
具体来说,就是将设备固有的数据格式转换为网络标准传输格式,不同设备对同一比特流解释的结果可能会不同;因此,主要负责使它们保持一致
1.3.3 会话层:负责建立和断开通信连接(数据流动的逻辑通路),记忆数据的分隔等数据传输相关的管理
PS:其实在应用层、表示层、会话层这三层,协议可以共用:
1.3.4 传输层:只在通信双方的节点上(比如计算机终端)进行处理,而无需在路由器上处理,传输层是OSI中最重要、最关键的一层,是唯一负责总体的数据传输和数据控制的一层;
传输层提供端到端的交换数据的机制,检查分组编号与次序,传输层对其上三层如会话层等,提供可靠的传输服务,对网络层提供可靠的目的地站点信息主要功能
在这一层,数据的单位称为数据段(segment)
主要功能:
①:为端到端连接提供传输服务
②:这种传输服务分为可靠和不可靠的,其中Tcp是典型的可靠传输,而Udp则是不可靠传输
③:为端到端连接提供流量控制,差错控制,服务质量(Quality of Service,QoS)等管理服务
包括的协议如下:
TCP:传输控制协议,传输效率低,可靠性强
UDP:用户数据报协议,适用于传输可靠性要求不高,数据量小的数据(比如QQ)
DCCP、SCTP、RTP、RSVP、PPTP等协议
具体的内容可参考这篇文章:http://book.51cto.com/art/200807/81191.htm
1.3.5 网络层:将数据传输到目标地址;目标地址可以使多个网络通过路由器连接而成的某一个地址,主要负责寻找地址和路由选择,网络层还可以实现拥塞控制、网际互连等功能
在这一层,数据的单位称为数据包(packet)
网络层协议的代表包括:IP、IPX、RIP、OSPF等
1.3.6 数据链路层:负责物理层面上的互联的、节点间的通信传输(例如一个以太网项链的2个节点之间的通信);该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。
在这一层,数据的单位称为帧(frame)
数据链路层协议的代表包括:ARP、RARP、SDLC、HDLC、PPP、STP、帧中继等
1.3.7 物理层:负责0、1 比特流(0/1序列)与电压的高低、逛的闪灭之间的转换
规定了激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性;该层为上层协议提供了一个传输数据的物理媒体。只是说明标准
在这一层,数据的单位称为比特(bit)
属于物理层定义的典型规范代表包括:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45、fddi令牌环网等
关于七层协议具体的协议以及定义规范,后面随笔会慢慢介绍,推荐一篇博客,有关七层协议的介绍:http://blog.csdn.net/lisa890608/article/details/8231666
六、传输方式的分类
网络通信科根据数据发送方法进行多种分类,分类方法很多,下面列举几种常见的:
1. 面向有连接型和面向无连接型
1.1 面向有连接型
发送数据之前,需要在收发主机之间建立一条通信线路,在通信传输前后,专门进行建立和断开连接的处理,如果与对端之间无法通信,可避免发送无谓的数据
1.2面向无连接型
这种类型不要求建立和断开连接,发送端可任何时候发送数据,接收端也不知道自己何时从哪里接受数据,这种情况下,接收端需要时常确认是否收到数据,彼此也不需要确认对方是否存在
2. 电路交换和分组交换
软件通信方式大致分为2种:电路交换和分组交换,TCP/IP协议组,采用的就是分组交换
2.1 电路交换
电路交换中,交换机主要负责数据的中转处理;计算机与交换机相连接,交换机之间由众多通信线路连接,计算机发送数据时,需要先连接电路,建立连接,即可进行通信,直到连接被断开
2.2 分组交换
最初,一台计算机收发信息时会独占整个电路,其他计算机只能等待,且无法预测何时结束通信,为解决这个问题,将发送的数据分为多个数据包,按一定的顺序排列后发送,这就是分组交换
分组交换中,由分组交互机(路由器)连接通信线路;在每个分组首部写入发送端与接收端地址(即同一条线路同时为多个用户服务),也可以确认区分每个分组的数据目的地,以及它与哪台计算机通信
分组交换的大致处理过程:发送端将数据分组分给路由器,路由器收到后缓存到自己的缓冲区,然后再转发给目标计算机;因此,分组交换也称为:蓄积交换
路由器收到收据会按照顺序进行缓存至相应队列,然后以先进先出顺序将其逐一发送(有时会优先发送目标地址较特殊的数据)
分组交换的缺陷:分组交换中,通信线路共享,因此,通信传输速度可能有差异,根据网络拥堵情况,数据到达目标地址时间长短不同;另外,路由器缓存饱和或溢出时,可能发生数据丢失,无法发送到接收端的情况
电路交换和分组交换的特点:
3. 根据接收端数据分类
3.1 单播
简单来说就是一对一通信,最早的固定电话就是单播通信的一个典型例子
3.2 广播
将消息从一台主机发送给与之相连的其他所有主机;典型例子就是电视播放(将电视信号一齐发送给非特定的多个连接对象)
3.3 多播
与广播类似,也是将消息发送给多个相连接的接收主机;不同之处在于多播要限定某一组主机作为接收端
3.4 任播
在特定的多台主机中选择一台作为接收端的一种通信方式(从目标主机群中选择一台最符合的主机作为目标主机发送消息,一般被选中的主机将返回一个单播信号,随后发送端只会和这台主机通信)
在实际的应用中有DNS根域名解析服务器
PS:几种不同方式的思维逻辑图:
七、地址
通信传输中,发送端和接收端可以被视为通信主体,它们由“地址”加以标识,在计算机通信中,每一层协议的地址都不同
1. 地址的唯一性
通信地址必须明确的表示一个主体对象,以便确认通信主体,同一个网络中不允许有2个相同的通信主体存在,这就是地址的唯一性
2. 地址的层次性
地址总数不多的情况下,有了唯一地址就可以定位相互通信的主体;如果地址总数比较多,那么想要高效的定位通信主体,就需要让地址具有层次性
比如:MAC和IP地址在标识一个通信主体时都具有唯一性,但只有IP地址具有层次性
MAC地址由制造商制造的网卡,通过识别制造商号,制造商内部产品编号以及产品通用编号来确保MAC地址的唯一性
IP地址由网络号和主机号2部分组成,即通信主体IP地址不同,若主机号不同,网络号相同,说明其处于同一个网段
网络通信中,每个节点都会根据分组数据的地址信息,参考一个发出接口列表,来判断报文应该由哪个网卡发送出去,其中,MAC和IP的区别在于:
MAC:寻址参考的表叫做地址转发表,其中所记录的实际上MAC地址本身
IP:寻址参考的表叫做路由控制表,其中所记录的IP地址是集中了之后的网络号(网络号与子网掩码)
八、网络的构成要素
搭建一套网络环境需要涉及到很多电缆和网络设备,下面只介绍下连接计算机和计算机的硬件设备:
搭建网络的主要设备及其作用:
1. 通信媒介与数据链路
计算机之间通过电缆相互连接,电缆可以分为很多种,根据数据链路不同,选用的电缆类型也不同,而媒介本身也可被划分为电波、微波等不同类型
各种数据链路一览:
传输速率:数据传输过程中,两个设备之间数据流动的物理速度称为传输速率,单位为bps(Bits Per Second,每秒比特数),即单位时间内传输的数据量多少
传输速率又称为带宽,带宽越大网络传输能力就越强
吞吐量:主机之间实际的传输速率称为吞吐量,单位为bps
吞吐量不仅衡量带宽,同时还有主机的CPU处理能力、网络拥堵程度、报文中数据字段的占有份额(不含报文首部,只计算数据字段本身)等信息
2. 网卡
任何计算机连接网络时,必须使用网卡(全称网络接口卡,也称为网络适配器、网卡、LAN卡)
3. 中继器
OSI模型中第一层——物理层面上延长网络的设备;由电缆传过来的波信号或光信号,经由中继器波形调整和放大再传给两一个电缆
一般情况下,中继器两端连接的是相同的通信媒介(有些中继器也可完成不同通信媒介之间的转接工作)
有些中继器可提供多个端口服务,被称为中继集线器(Hub)或者集线器,每个端口都可称为一个中继器
4. 网桥/2层交换机
网桥是在OSI模型第二层——数据链路层面上连接2个网络的设备;它可以识别数据链路层中的数据帧,并将数据帧临时存储于内存,再重新生成一个全新帧转发给相连的另一个网段
网桥能够连接不同传输速率的数据链路,并且不限制连接网段的个数
数据链路中有个数据帧叫做FCS,用以校验数据是否正确送达目的地;网桥通过检查该域中的值,将损坏的数据丢弃,此外,还能通过地址自学机制和过滤功能控制网络流量
地址:MAC地址、硬件地址、物理地址及适配器地址,也就是网络上针对NIC分配的具体地址
自学式网桥:自行判断是否将数据报文发送给相邻的网段的网桥(记住曾通过自己转发的所有数据帧的MAC地址,并存储到自己的内存表中)
以太网等网络中经常使用交换集线器(Hub),也属于网桥的一种;交换集线器中连接电缆的端口都能提供类似网桥的功能
5. 路由器/3层交换机
路由器:OSI模型第三层——网络层面上连接2个网络、并对分组报文进行转发的设备,根据IP地址进行处理;TCP/IP中网络层地址就成为了IP地址
路由器可以连接不同的数据链路,它还有分担网络负荷的作用(某些路由器具备一定的网络安全功能)
6. 4~7层交换机
4~7层交换机负责处理OSI模型中从传输层至应用层的数据;即以TCP等协议的传输层及其上面的应用层为基础,分析收发数据,并对其进行特定的处理(例如:负载均衡器)
应用场景:带宽控制、广域网加速器、特殊应用访问、防火墙等
7. 网关
网关:OSI模型中负责将从传输层到应用层的数据进行转换和转发的设备;处理传输层及以上的数据
网关不仅转发数据还对其进行转换,通常会使用一个表示层或应用层网关,在不能直接通信的协议间进行翻译,最终实现通信
代理服务器:
使用万维网(www)时,为控制网络流量和处于安全考虑,使用代理服务器(也是网关的一种,称为应用网关)
使用代理服务器,客户端与服务器之间不需要直接通信,而是从传输层到应用层对数据和访问进行各种控制处理,防火墙就是一种通过网关通信,针对不同应用提高安全性的产品
代理服务如下图:
各种设备及其对应网络分层预览图:
九、现代网络
1. 网络的构成
核心网(数据传输核心)+边缘网络(传输节点)+接入层(汇聚层:连接边缘网络的部分)
2. 互联网通信
实际的网络构成图:
3. 移动通信
移动通信示意图:
4. 信息发布以及数据中心
数据中心由大型服务器、存储以及计算机网络构成(某些大型数据中心甚至连接到“主干网”)
数据中心结构图:
(十五)TCP/IP协议
一、TCP/IP的标准化
1、TCP/IP的含义
一般来说,TCP/IP是利用IP进行通信时所必须用到的协议群的统称。
具体点,IP或ICMP、TCP或UDP、TELENT或FTP、以及HTTP等都属于TCP/IP协议,而TCP/IP一词泛指这些协议,有时称它们为TCP/IP为网际协议族/TCP/IP协议族
如下图所示:
2、标准化的精髓
特性:开放性、注重实用性(被标准化的协议能否被实际运用)
TCP/IP协议由IETF(国际互联网工程任务组)讨论制定;即将协议的大致规范定下来,然后进行通信试验,及时修订
3、规范——RFC
RFC:request for comment,即征求意见表;那些需要标准化的协议,会被计入RFC并在互联网上公布;RFC不仅包含协议规范内容,还包括协议实现和运用的相关信息,以及实验方面的信息
RFC通过编号组织每个协议的标准化请求;其编码是既定的,一旦成为某个RFC的内容,就不能再对其进行修改;若要修改已有某个协议内容,则需要重新发行一个新的RFC文档,同时,老的RFC文档作废
新的RFC文档会明确规定是扩展了哪个已有RFC以及要作废哪个已有RFC
基于每次修改RFC时都会产生新的RFC编号太麻烦,为此,采用了STD(standard)方式管理编号,其作用是:用来记录哪个编号制定哪个协议
4、TCP/IP的标准化流程
TCP/IP的标准化流程大概分为以下几个阶段:
①.互联网草案阶段:从提出开始不断进行讨论实验,有了一定成熟度,觉得实际可行,认为其可以进行标准化,可进入下一阶段
②.提议标准阶段:计入RFC,开始进入众多设备厂商生产环节,投入试验使用,一般为6个月,当所有参与协议的人觉得其“实用性强,不存在太多问题”,则进入下一阶段
③.草案标准阶段:一般为期4个月,在经过不断的使用和讨论改进后,被大众所使用接受,那么这个草案标准就进入下一个阶段
④.标准阶段:到这个阶段,意味着该标准已广泛被使用且具有很强的实用性
5、RFC获取方法
①.网址:http://www.rfc-editor.org/rfc/
ftp://ftp.rfc-editor.org/in-notes/
这两个网址保存着所有的RFC文件,网站中有一个名为rfc-index.txt的文件,包含所有RFC概览;RFC网站除了发布RFC相关信息,还提供RFC检索功能
②.STD或FYI以及ID获取地址
关于STD、FYI、ID也可以从以下网站获取,其概览一分别记录在std-index.txt、fyi-index.txt等文件中
STD获取地址:http://www.rfc-edctor.org/in-notes/std/
FYI获取地址:http://www.rfc-edctor.org/in-notes/fyi/
ID获取地址:http://www.rfc-edctor.org/Internet-drafts/
JPNIC的ftp服务器中的目录:
STD获取网址:ftp://ftp.nic.ad.jp/rfc/std/
FYI获取网址:ftp://ftp.nic.ad.jp/rfc/fyi/
ID获取网址:ftp://ftp.nic.ad.jp/internet-drafts/
二、互联网基础知识
1、互联网定义
互联网,英文单词为Internet;Internet指的是将多个网络连接使其构成一个更大的网络,所以Internet本意为网际网
“互联网”是指由ARPANET发展而来、互联全世界的计算机网络;互联全世界的计算机网络,现在“互联网”对应的英文单词为“The Internet”
与Internet对应的另一种网络叫做intranet,该网络指使用Internet技术将企业内部组织机构连接起来形成一个企业范围的内部网络,提供面向企业内部的通信服务
2、互联网与TCP/IP关系
互联网进行通信时,需要相应的网络协议,TCP/IP是为使用互联网而开发定制的协议族;因此,互联网的协议就是TCP/IP
3、互联网的结构
小范围内的网络连接形成机构内部网络,机构内部网络连接形成区域网络,各个区域相互连接,则形成连接全是的互联网;互联网是一个有层次的网络
互联网中每个网络都是由骨干网(BackBone)和末端网(Stub)组成;每个网络之间通过NOC相连;如果运营商不同,则网络连接方式和使用方法也不同。异构网络需要有IX支持
互联网就是众多异构网络通过IX互联的一个巨型网络
△ NOC:Network Operation Center(网络操作中心)
△ IX:Internet Exchange:网络交换中心
4、ISP和区域网
连接互联网需要向ISP(internet service provider:互联网服务提供商)或区域网提出申请,不同的ISP提供的互联网接入服务也不同
区域网指的是特定区域内由团体或志愿者提供的网络服务,通常价格比较便宜,但有时会出现连接方式复杂或者使用有限制的情况
当申请网络服务时,建议确认了解一下提供的具体服务条目、服务的细则(接入方式、条件、费用)等,再决定
三、TCP/IP协议分层模型
1、TCP/IP与OSI参考模型
TCP/IP与OSI在分层模块上的区别:
OSI:注重通信协议必要的功能是什么
TCP/IP:在计算机上实现协议应该开发哪种程序
2、硬件(物理层)
TCP/IP的最底层是负责数据传输的硬件。这种硬件就相当于以太网或电话线路等物理层的设备,TCP/IP是在网络互连的设备之间能够通信的前提下才被提出的协议。
3、网络接口层(数据链路层)
利用以太网中的数据链路进行通信,属于接口层;将其当做“驱动程序”也可以(驱动程序是在操作系统与硬件之前起桥梁作用的软件)
PS:有时也将硬件层和网络接口层合并起来,称为“网络通信层”
4、互联网层(网络层)
互联网层使用IP协议,相当于OSI中的第三层模型;IP协议基于IP地址转发分包数据
IP协议的作用:将分组数据包发送到目的主机
TCP/IP分层中的互联网层与传输层的功能通常由操作系统提供,尤其是路由器,它必须得实现通过互联网层转发分组数据包的功能
连接互联网的所有主机跟路由器必须都实现IP功能,其他链接互联网的网络设备(网桥、中继器)则不是必须
IP:跨越网络传送数据包,使整个互联网都能收到数据的协议;传送数据时,IP地址作为主机的标识
IP还隐含数据链路层的功能:通过IP,相互通信的主机之间不论经过怎样的数据链路,都可以实现通信
IP是分组交换的一种协议,但是不具有重发机制;即使分组数据包未到达对端主机也不会重发;属于非可靠性传输协议
ICMP:IP数据包发送过程中一旦发生异常导致无法到达对端目标地址时,需要给发送端一个发生异常的通知,ICMP就是为了该功能而定制;有时可用来诊断网络健康状况
ARP:从分组数据包的IP地址解析出物理地址(MAC地址)的一种协议
5、传输层
TCP/IP传输层有TCP和UDP两个具有代表性的协议,主要功能是让应用程序之间实现通信;其通信逻辑如下图:
TCP:面向有连接的传输层协议,可以保证通信两端主机之间的通信可达;可以正确的处理传输过程中丢包、传输乱序等异常情况;还能有效利用带宽,缓解网络拥堵。
UDP:面向无连接的传输层协议,不关注对端是否真的收到传送的数据;如需检查对端是否收到分组数据包,或对端是否连接到网络,需要在应用程序中实现常用于分组数据较少或多播。广播通信及视频通信等领域。
6、应用层(会话层以上的分层)
TCP/IP分层中,将OSI中的会话层、表示层、应用层都集中到了应用程序中实现
TCP/IP应用的架构绝大多数术语客户端/服务端模型;提供服务的程序叫服务端,接受服务的程序叫客户端,服务器会预先部署到主机上,等待接收任何时刻客户端发送的请求
常见的应用层协议:
HTTP协议:(HyperText Transfer Protocol)
浏览器与客户端通信所使用的协议,传输数据主要格式为HTML,http协议OSI应用层协议,而HTML属于表示层的协议
文件传输协议:FTP(File Transfer Protocol)
传输过程可以选择用二进制还是文本方式,传输时会建立两个TCP连接:发送传输请求时用到的控制连接和实际传输时用到的数据连接
电子邮件协议:SMTP(Simple Mail Transfer Protocol)
可以发送声音图像文字,甚至改变文字大小、颜色等
远程登录(TELNET与SSH):
常见的还有其他远程登录协议,比如:BSD UNIX系中的rlogin的r命令和X Window System中的X协议
网络管理协议:SNMP(Simple Newwork Management Protocol)
在TCP/IP进行网络管理时,采用该协议,其中使用SNMP管理的主机。网桥、路由器等称作SNMP代理(Agent),进行管理的那一段叫做管理器(Manager)
在SNMP代理端,保存着网络接口信息、通信数据量、异常数据量以及设备温度等信息,这些信息通过MIB访问,在TCP/IP中,SNMP属于应用协议,MIB属于表示层协议
MIB(Management Information Base):可透过网络的结构变量
四、TCP/IP分层模型
1、数据包首部
每个分层都会对所发送的数据附加一个首部,首部中包含该层必要的信息;通常为协议提供的信息为包首部,所要发送的内容为数据
关于包、帧、数据报、段、消息的概述:
包:一个概括性术语,指数据整体
帧:数据链路层中包的单位
数据报:IP和UDP等网络层以上分层中包的单位
段:TCP数据流中的信息
消息:应用协议中数据的单位
2、发送数据包
假设A发送邮件“早上好”给B,那么它的通信过程大概如下:
①.应用程序处理
应用程序启动,新建邮件及内容,点击发送,应用程序对邮件进行编码处理,然后发送给下一层TCP
②.TCP模块的处理
根据上层应用发来的指示,建立负责建立连接、发送连接及断开连接;TCP提供将应用层发来的数据顺利发送至对端的可靠传输
为了实现该功能,会在应用层数据前端加一个TCP首部,首部包括源端口号和目标端口号。序号以及校验,随后将附加了TCP首部的包发送给IP
③.IP模块的处理
IP将TCP传递的首部和数据合并,并在首部之前加上自己的IP,IP包生成后,参考路由控制表决定接受此IP包的路由或者主机,随后,IP包将被发送给连接这些路由或主机网络接口的驱动程序,实现发送数据
④.网络接口(以太网驱动)的处理
以太网接受到的IP包,对其来说就是数据,会给其加上以太网首部并进行发送处理,首部中包含接收端MAC地址,发送端MAC地址以及标志以太网类型的以太网数据协议
3、数据包接收处理
①.网络接口(以太网驱动)的处理
主机收到以太网包,首先找到MAC地址判断是否为发送给自己的,如果不是则丢弃数据
如果是,则确认数据类型,然后将数据包发送给对应的类型处理程序处理
②.IP模块的处理
收到数据包先进行判断处理,如果包首部IP地址与自己匹配则接受数据并寻找到上一层协议,并转发给上一层进行处理
③.TCP模块的处理
接收到数据包首先计算校验和,判断数据包是否被破坏,然后检查是否按序接受数据,最后检查端口号,确定具体应用程序
数据接受完毕,接收端发送一个“确认回执”个发送端
④.应用程序的处理
接收端应用程序会直接接收发送端的数据,并进行解析处理
转载:https://www.cnblogs.com/imyalost