33. 什么是WEBService,实现WEBService有哪些框架,为什么WEBService经常被认为太重了,只有银行和大型国企才会使用的更多有一些?
WebService是一种跨编程语言、跨操作系统平台的远程调用技术。
远程调用技术:远程调用是指一台设备上的程序A可以调用另一台设备上的方法B。
比如:银联提供给商场的pos刷卡系统,商场的pos机转账调用的转账方法的代码其实是跑在银行服务器上的。
再比如,amazon,天气预报系统,淘宝网,校内网,百度等把自己的系统服务以WebService服务的形式暴露出来,
让第三方网站和程序可以调用这些服务功能,这样扩展了自己系统的市场占有率。
跨编程语言:是指服务端、客户端程序的编程语言可以不同
跨操作系统平台:是指服务端、客户端可在不同的操作系统上运行
从表面上看,WebService是指一个应用程序向外界暴露了一个能通过Web调用的API接口,
我们把调用这个WebService的应用程序称作客户端,把提供这个WebService的应用程序称作服务端。
从深层上看,WebService是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。
它定义了应用程序如何通过Web实现互操作性,通过WebService标准对服务进行查询和访问。
目前开发Web Service的几个框架:
分别为 Axis,axis2,Xfire,CXF以及JWS (也就是前面所述的JAX-WS,这是Java6发布所提供的对Web Service服务的一种实现。
WebService是个很重型的规范,它的应用协议是SOAP (简单对象访问协议),它所依赖的下层通信方式不单单是HTTP,
也有SOAP over SMTP, SOAP over TCP,由于HTTP协议群众基础广,开发调试方便,所以,成了WebService中最为流行的方式。
甚至很多公司在内网通信,也用HTTP来做,比如,应用调用搜索引擎,Solr就是一个例子。
但HTTP也是TCP上性能比较差的协议,因为HTTP是基于TCP的,有3次握手,
再加上HTTP是个文本传输协议(虽然也可以传二进制的附件,但业务逻辑还是文本用的多),
又有很多复杂的HEADER。所以人们发明了一些更高效的通信协议来做远程调用,
比如ACE、ICE、Corba、淘宝的HSF,但这是后话了,不展开细说。你只要知道,HTTP之所以流行,乃是简单易用群众基础广的结果。
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
34. 什么是tcp/ip协议?TCP的三次握手指的是什么,为什么一定要三次握手,而不是四次或者是两次?
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)
是指 能够在多个不同网络间实现信息传输的协议簇 。
所谓协议(protocol),其实就是一个群体之间规定的规则,这个规则的目的是为了保证这个群体里面的人可以正常交流。
还是回到计算机和网络的通信这边来举例。比如: 如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、
怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。协议中存在各式各样的内容。
从电缆的规格到 IP 地址的选定方法、寻找异地用户的方法、双方建立通信的顺序,以及 Web 页面显示需要处理的步骤,等等。
像这样把与互联网相关联的协议集合起来总称为 TCP/IP。也有说法认为,TCP/IP 是指 TCP 和 IP 这两种协议。
还有一种说法认为,TCP/IP 是在 IP 协议的通信过程中,使用到的协议族的统称。
按层次分,TCP 位于传输层,提供可靠的字节流服务。
所谓的字节流服务(Byte Stream Service)是指,为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。一言以蔽之,TCP 协议为了更容易传送大数据才把数据分割,而且 TCP 协议能够确认数据最终是否送达到对方。
确保数据能到达目标
为了准确无误地将数据送达目标处,TCP 协议采用了三次握手(three-way handshaking)策略。用 TCP 协议把数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对方确认是否成功送达。
握手过程中使用了 TCP 的标志(flag) —SYN(synchronize) 和ACK(acknowledgement)。
发送端首先发送一个带 SYN 标志的数据包给对方。接收端收到后,回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。
最后,发送端再回传一个带 ACK 标志的数据包,代表“握手”结束。
若在握手过程中某个阶段莫名中断,TCP 协议会再次以相同的顺序发送相同的数据包。
注意的是:除了上述三次握手,TCP 协议还有其他各种手段来保证通信的可靠性。
为什么 TCP 需要握手这个操作 在解答为什么 TCP 需要三次握手, 而不是两次之前, 首先需要回答的问题是:
如果读者对比一下 UDP 的通信流程和 TCP 的通信流程, 可以发现, 在 UDP 协议中, 是没有握手这个操作的。
这里就引出了 TCP 与 UDP 的一个基本区别, TCP 是可靠通信协议, 而 UDP 是不可靠通信协议。
TCP 的可靠性含义: 接收方收到的数据是完整, 有序, 无差错的。
UDP 不可靠性含义: 接收方接收到的数据可能存在部分丢失, 顺序也不一定能保证。
UDP 和 TCP 协议都是基于同样的互联网基础设施, 且都基于 IP 协议实现, 互联网基础设施中对于数据包的发送过程是会发生丢包现象的,
为什么 TCP 就可以实现可靠传输, 而 UDP 不行?
TCP 协议为了实现可靠传输, 通信双方需要判断自己已经发送的数据包是否都被接收方收到, 如果没收到, 就需要重发。
为了实现这个需求, 很自然地就会引出序号(sequence number) 和 确认号(acknowledgement number) 的使用。
发送方在发送数据包(假设大小为 10 byte)时, 同时送上一个序号( 假设为 500),那么接收方收到这个数据包以后,
就可以回复一个确认号(510 = 500 + 10) 告诉发送方 “我已经收到了你的数据包, 你可以发送下一个数据包, 序号从 510 开始” 。
这样发送方就可以知道哪些数据被接收到,哪些数据没被接收到, 需要重发。
为什么需要三次握手,而非两次?
正如上文所描述的,为了实现可靠传输,发送方和接收方始终需要同步( SYNchronize )序号。 需要注意的是, 序号并不是从 0 开始的,
而是由发送方随机选择的初始序列号 ( Initial Sequence Number, ISN )开始 。 由于 TCP 是一个双向通信协议, 通信双方都有能力发送信息,
并接收响应。 因此, 通信双方都需要随机产生一个初始的序列号, 并且把这个起始值告诉对方。
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
35. 什么是http协议?get和post请求有什么区别?http请求content-Type有几种,有什么区别?http适合什么场景?http状态码有哪些?
什么是Http协议
Http协议即超文本传送协议 (HTTP-Hypertext transfer protocol) 。它定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,
以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向(transaction-oriented)应用层协议,
它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。并且详细的规定了客户端浏览器与服务器之间互相通信的规则。
客户端与服务器端在Http协议下的交互过程如图:
这些通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。如下:
l 客户端发送给服务器的”信”,我们称之为”请求协议”。
l 服务器端发送给浏览器的”信”,我们称之为”响应协议”。
注意:使用HttpWatch抓包工具可以抓取HTTP协议的内容。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
get和post请求有什么区别?
1、GET请求一般用去请求获取数据,
POST一般作为发送数据到后台时使用
2、GET请求也可传参到后台,但是其参数在浏览器的地址栏的url中可见,所以隐私性安全性较差,且参数长度也是有限制的
POST请求传递参数放在Request body中,不会在url中显示,比GET要安全,且参数长度无限制
3、GET请求刷新浏览器或回退时没有影响
POST回退时会重新提交数据请求
4、GET 请求可被缓存
POST 请求不会被缓存
5、GET 请求保留在浏览器历史记录中
POST 请求不会保留在浏览器历史记录中
6、GET 请求可被收藏为书签
POST 不能被收藏为书签
7、GET请求只能进行url编码(application/x-www-form-urlencoded)
POST支持多种编码方式(application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。)
8、GET请求比较常见的方式是通过url地址栏请求
POST最常见是通过form表单发送数据请求
post请求和get请求都是HTTP的请求方式,本质上来说并无区别,底层实现都是基于TCP/IP协议。
但是请求有各种各样的方式,于是HTTP对请求方式进行了划分和规定,于是产生了get、post处理请求的分工和区别。
此外还有搜索到另外一个区别:GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
1. GET与POST都有自己的语义,不能随便混用。
2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,
两次包的TCP在验证数据包完整性上,有非常大的优点。
3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
Content-Type使用的是 “主类型/子类型; 额外参数” ( [type]/[subtype]; parameter )的数值格式。
“主类型” (type)主要有以下几种:
1. text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的; 默认是text/plain;
2. multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据; 默认是multipart/mixed;
3. application:用于传输应用程序数据或者二进制数据; 默认是application/octet-stream;
4. message:用于包装一个E-mail消息;
5. image:用于传输静态图片数据;
6. audio:用于传输音频或者音声数据;
7. video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。
8. drawing:--未整理
9. java:--未整理
10 Model:--未整理
“子类型” (subtype)用于指定"主类型"的详细形式。 其中以x-开头表示该类别尚未标准化 。
当客户端不能确定“子类型”时,会根据“主类型”来获取默认的子类型。
"额外参数" (parameter)用于指定请求/响应内容的字符编码格式。例如text/html;charset=utf-8;
HTTP状态码的适用场景有哪些呢?
206:一般用来做断点续传,或者是视频文件等大文件的加载
301:永久重定向会缓存 新域名替换旧域名时
302:临时重定向不会缓存 常用于未登陆的用户访问用户中心重定向到登录页面
400:参数有误 请求无法被服务器识别
403:告诉客户端进制访问该站点或者资源 如在外网的环境下,然后访问只有内网IP才能访问的时候则会返回
404:服务器找不到资源时 或者服务器拒绝请求又不想说明理由时
504:网关超时
常见的http状态码:
100:这个状态码是告诉客户端应该继续发送请求,这个临时响应是用来通知客户端的,部分的请求服务器已经接受,
但是客户端应继续发送求请求的剩余部分,如果请求已经完成,就忽略这个响应,而且服务器会在请求完成后向客户发送一个最终的结果
200:这个是最常见的http状态码,表示服务器已经成功接受请求,并将返回客户端所请求的最终结果
202:表示服务器已经接受了请求,但是还没有处理,而且这个请求最终会不会处理还不确定
204:服务器成功处理了请求,但没有返回任何实体内容 ,可能会返回新的头部元信息
301:客户端请求的网页已经永久移动到新的位置,当链接发生变化时,返回301代码告诉客户端链接的变化,
客户端保存新的链接,并向新的链接发出请求,已返回请求结果
404:请求失败,客户端请求的资源没有找到或者是不存在
500:服务器遇到未知的错误,导致无法完成客户端当前的请求。
503:服务器由于临时的服务器过载或者是维护,无法解决当前的请求。
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
36. 了解maven的module。
Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具。
所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml。
它们之间通过继承和聚合(也称作多模块,multi-module)相互关联。
那么,为什么要这么做呢?我们明明在开发一个项目,划分模块后,导入Eclipse变成了N个项目,这会带来复杂度,给开发带来不便。
从字面意思来说,module就是模块,而pom.xml中的modules也正是这个意思,用来管理同个项目中的各个模块;
如果maven用的比较简单,或者说项目的模块在pom.xml没进行划分,那么此元素是用不到的;不过一般大一点的项目是要用到的。
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
37. 为什么要用Rest风格,如果不用Rest的话,接口应该怎么定义,在使用Rest风格之前,大家都是用什么方式写接口的?
REST即 表述性状态传递 (英文:Representational State Transfer,简称REST)
是Roy Fielding博士在2000年他的博士论文中提出来的一种 软件架构 风格。. 它是一种针对 网络应用 的设计和开发方式,
可以降低开发的复杂性,提高系统的可伸缩性。. 在三种主流的 Web服务 实现方案中,
因为REST模式的Web服务与复杂的 SOAP 和 XML-RPC 对比来讲明显的更加简洁,越来越多的web服务开始采用REST风格设计和实现。
Rest风格
1、REST描述的是在网络中client和server的一种交互形式;REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口);
2、Server提供的RESTful API中,URL中只使用名词来指定资源,原则上不使用动词。“资源”是REST架构或者说整个网络处理的核心,
表示一个网络实体,代表一个资源;它对应唯一的一个资源,是资源的地址。
3、用HTTP协议里的动词来实现资源的添加,修改,删除等操作。
4、Server和Client之间传递某资源的一个表现形式
用 HTTP Status Code传递Server的状态信息。
在使用Rest风格之前,大家都是用什么方式写接口的?
URL该怎么写就怎么写,但是没有PUT,GET,POST,DELETE方法
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
38. 生成Json有几种方式,他们之间的好处和坏处分别是什么,为什么推荐使用JsonTaglib来处理Json?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。
JSON是由道格拉斯·克罗克福特在2001年开始推广使用的数据格式,在2005年-2006年正式成为主流的数据格式,
雅虎和谷歌就在那时候开始广泛地使用JSON格式。
JSON类似于XML、比XML更小、更快、更容易解析。但同时XML也有它不可替代性,应根据使用场景进行更合适的选择
两者不同的是,json没有结束标签,读写速度更快,使用数组,不使用保留字,能够使用内建的JavaScript eval()方法解析。
JSON语法简单,很容易理解,并且对象信息自描述,数据传输量小不占用宽带
JSON支持的语言包括C、C#、Java、JavaScript,PHP,Python、Ruby等等
对于Ajax应用程序来说,JSON比XML更快捷,更易用
JSON-taglib是一个JSP 2.0标记库,用于在JSP代码中呈现JSON(JavaScript Object Notation)数据。 它可以作为AJAX应用程序的服务器端的一部分,允许您使用JSP的全部功能来格式化您的JSON数据。 标签库建立在由Douglas Crockford编写的Java JSON库上。
Json生成方式有三种:
① 使用json工具类库转化生成,如FastJson(阿里巴巴)、Gson(谷歌)、Jackson等;
② 使用注解ResponseBody返回java对象或集合,自动转化生成;
③ 使用JsonTaglib在jsp中设置字段或者嵌套生成。
如何实现 使用JsonTaglib来处理Json?
首先需要添加 JsonTaglib 依赖,指定所在仓库。
而后将数据传入jsp,在jsp中添加声明标签,并使用JsonTaglib内的标签。
json:object,表示json数据对象;
json:property,表示json对象中的属性;
json:array,表示json数组。
对象中可以有数组,数组中也可以有对象,可以使用这三种标签嵌套生成各种格式的json数据,完全能够满足开发需求。
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
39. 一份规范的接口文档应该包括什么内容,衡量接口(API)设计好和坏的准则是什么?
“接口文档”又称为“API文档”,一般是由开发人员所编写的,用来描述系统所提供接口信息的文档。
大家都根据这个接口文档进行开发,并需要一直维护和遵守。
一般一个规范的接口文档至少包含三部分信息,分别是基本信息,请求参数部分,响应部分
基本部分又包括接口名称,接口URL,请求方法以及描述信息; 请求参数部分主要包括请求头和请求体部分,主要是对这两个部分的每个字段定义的说明和解释 响应部分主要包括响应返回的数据类型,已经响应数据中每个字段的含义 。
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
40. Http的Header里面包含哪些字段,每个字段都有哪些含义?
HTTP HEADER
HTTP(HyperTextTransferProtocol) 即超文本传输协议,目前网页传输的的通用协议。HTTP协议采用了请求/响应模型,
浏览器或其他客户端发出请求,服务器给与响应。 就整个网络资源传输而言,包括message-header和message-body两部分。
首先传 递message-header,即http header消息 。 http header 消息通常被分为4个部分:
general header, request header, response header, entity header。但是这种分法就理解而言,感觉界限不太明确。
根据维基百科对http header内容的组织形式,大体分为Request和Response两部分。
Accept 表示客户端期望服务器返回的媒体格式。客户端期望的资源类型服务器可能没有,所以客户端会期望多种类型,并且设置优先级,服务器根据优先级寻找相应的资源返回给客户端。
# 注意:先逗号分割类型,再分号分割属性
Accept: audio/*; q=0.2, audio/basic
表示audio/basic类型的资源优先,如果没有,就随便其它什么格式的audio资源都可以。q的取值范围是(0-1],其具体值并没有意义,它仅用来排序优先级,如果没有q,默认q=1,也就是最高优先级。
Accept-Charset 表示客户端期望服务器返回的内容的编码格式。它同Accept头一样,也可以指定多个编码,以q值代表优先级。
# 注意:先逗号分割类型,再分号分割属性
Accept-Charset: utf8, gbk; q=0.6
表示utf8编码优先,如果不行,就拿gbk编码返回.
Content-Type Content-Type是服务器向客户端发送的头,代表内容的媒体类型和编码格式,是对Accept头和Accept-Charset头的统一应答。
Content-Type: text/html; charset=utf8
表示返回的Body是个html文本,编码为utf8
Accept-Language 表示客户端期望服务器返回的内容的语言。很多大型互联网公司是全球化的,它的技术文档一般有有多种语言,通过这个字段可以实现文档的本地化,对国内用户呈现简体中文文档,对英语系用户呈现英文文档。
Accept-Language:zh-CN,en-US;q=0.8,zh-TW;q=0.6
表示大陆简体中文优先,其次英语,再其次台湾繁体中文
Content-Language 这个头字段内容是对Accept-Language的应答。服务器通过此字段告知客户端返回的Body信息的语言是什么。
Content-Length 表示传输的请求/响应的Body的长度。GET请求因为没有Body,所以不需要这个头。携带Body的并且可以提前知道Body长度的请求/响应必须带上这个字段,以便对方可以方便的分辨出报文的边界,也就是Body数据何时结束。如果Body太大,需要边计算边传输,不到最后计算结束是无法知道整个Body大小的,这个时候可以使用http分块传输,这个时候也是不需要Content-Length字段的。
Content-Location 当客户端请求的资源在服务器有多个地址时,服务器可以通过Content-Location字段告知客户端其它的可选地址。这个字段比较少见。
Content-MD5 在Header中提供这个信息是用来做Body内容校验。它表示Body信息被md5算法处理后的base64字符串。这个字段也比较少见。因为校验机制在TCP层已经有实现了,再来一层校验并没有多大意义。另外资源的md5值往往用来放在后面的ETag头信息中作为资源的唯一标识来使用。
Date 如果服务器没有缓存,那么Date就是响应的即时生成时间。如果服务器设有缓存,那么Date就是响应内容被缓存的时间。它必须符合规范里定义的特定格式,这种格式叫着HTTP-Date,不支持随意定义自己的时间格式。
Date: Tue, 15 Nov 1994 08:12:31 GMT
Age 表示资源缓存的年龄,也就是资源自缓存以来到现在已经过去了多少时间,单位是秒。
Expires 服务器使用Expect头来告知对方资源何时失效。如果它的值等于Date头的值,就表示资源已经实效。
Expires: Thu, 01 Dec 1994 16:00:00 GMT
ETag 资源标签,每个资源可以提供多个标签信息。它一般用来和下面的If-Match和If-None-Match配合使用,用来判断缓存资源的有效性。比较常见的标签是资源的版本号,比如可以拿资源数据的md5校验码作为版本号。
If-Match If-Match的值一般是上面提到的ETag的值,它常用于HTTP的乐观锁。所谓HTTP乐观锁,是指客户端先GET这个资源得到ETag中的版本号,然后发起一个资源修改请求PUT|PATCH时通过If-Match头来指定资源的版本号,如果服务器资源满足If-Match中指定的版本号,请求就会被执行。如果不满足,说明资源被并发修改了,就需要返回状态码为412 Precondition failed 的错误。客户端可以选择放弃或者重试整个过程。
If-None-Match 类似于If-Match,只是条件相反。
Allow 表示资源支持访问的HTTP Method类型。它是服务器对客户端的建议,告知对方请使用Allow中提到的Method来访问资源。
Connection 当客户端和服务器需要协商连接的属性时,可以使用Connection头部。比较常用的一个值是close,用来通知对方在当前请求结束后关闭连接。
Expect 用于请求发送之前向服务器询问许可。譬如要向服务器发送一个很大的文件而不确定是否超出限制,就可以在请求头里携带一个Expect头部
如果服务器说不行,就会返回417 Expectation Failed错误告知客户端放弃。如果可以那就返回100 continue状态码告知客户端放马过来吧,于是客户端就会继续上传Body内容。如果服务器提前收到Body内容就会放弃返回100 continue响应。
From 该字段一般用来标记请求发起者的邮件地址,相当于给请求赋予一个责任人。如果服务器发现请求存在问题,就会通过此字段联系到发起人进行处理。因为邮件地址涉及到隐私信息,所以请求携带From头需要征得用户的同意。RFC协议建议所有的机器人代理发起的请求应该携带此头部,以免遇到问题时可以找到责任人。不过如果是恶意的机器人,估计这样的建议也只是耳边风而已。
Host RFC协议规定所有的HTTP请求必须携带Host头,即使Host没有值,也必须带上这个Host头附加一个空串,如果不满足,应用服务器应该抛出400 Bad Request。协议虽然这样规定,不过大部分网关或者服务器都比较仁慈,既然没有指定Host字段,那就给你默认加上一个。 网关代理可以根据不同的Host值转发到不同的upstream服务节点,它常用于虚拟主机服务业务。
Last-Modified 标记资源的最近修改时间,它和Date比较类似,区别是Last-Modified代表修改时间,而Date是创建时间。
If-Modified-Since 浏览器向服务器请求静态资源时,如果浏览器本地已经有了缓存,就会携带If-Modified-Since头,值为资源的Last-Modified时间,询问服务器该资源自从这个Last-Modified时间之后有没有被修改。如果没有修改过,就会向浏览器返回304 Not Modified通知浏览器可以放心使用缓存内的资源。如果资源修改过,那就像正常的GET请求一样,携带资源的内容返回200 OK。
If-Unmodified-Since 类似于If-Modified-Since,意义相反。区别是当服务器资源条件不满足时,不是返回304 Not Modified,而是返回412 Precondition Failed。
Range 支持断点续传的服务器必须处理Range头,它表示客户端请求资源的一部分时指定的请求字节范围。它是客户端向服务器发送的请求头。
Content-Range 针对上面的Range头,服务器响应客户端时也需提供相应的Content-Range头,表示传输的Body数据在整体资源块中的字节范围。比如下面的例子表示该资源总共有47022字节,当前响应的内容是21010-47021字节之间的内容。
Content-Range: bytes 21010-47021/47022
之所以是47021而不是47022是因为offset是以0开始的,47021就是最后一个字节。
If-Range 在断点续传时,为确保连续2个请求之间服务器资源本身没有发生变化,需要If-Range头带上ETag的资源版本号。服务器资源根据这个版本号来判定资源是否改变了。如果没变,就返回206 Partial Content将部分资源返回。如果资源变了,那就相当于一个普通的GET请求,返回200 OK和整个资源内容。
Location 服务器向客户端发送302跳转的时候,总会携带Location头信息,它的值为目标URL。
HTTP/1.1 302 Temporary Redirect
Location: https://www-temp.example.org/
Max-Forwards 用来限定网关或者代理的层数,也就是最大转发次数。HTTP每经过一个网关或者代理层,Max-Forwards值就要减1。如果nginx接收到前端请求的时候Max-Forwards已经等于0,那么它就不应该再将请求转发到upstream指定的服务节点上。
Pragma 这个头是比较常见的,在前端开发模式下经常会加上这个头部。
当网关收到一个带有这样请求的头部时,即使内部存在该请求资源的缓存并且有效也不可以直接发送给客户端,而必须转发给后面的upstream进行处理。 不过如果真的所有的网关都遵循这个协议的话,攻击是很容易构造的,所以它一般仅用于开发模式,防止静态资源修改后前端得不到即时更新。其它值的pragma值没有遇到过。
Referer Referer是非常常用的头,它表示请求的发起来源URI,也就是当前页面资源的父页面。如果你从A页面跳转到B页面,那么请求B页面的请求头里面就会有Referer信息,它的值就是A页面的访问地址。通过追踪Referer,可得出资源页面之间复杂的跳转链,它非常适合用于网页的数据分析和路径优化。
Retry-After 服务器升级时,来自客户端的请求会直接给予503(Service Unavailable)错误,通过在返回头里面加入Retry-After字段告知客户端何时服务可以恢复正常访问。Retry-After的头可以是HTTP-Date,也可以是整数,表示多少秒后服务可以恢复正常访问。浏览器在拿到这个值之后可以考虑增加一个定时器在未来的某个时间进行重试。
Server 用于返回服务器相关的软件信息,来告知客户端当前的HTTP服务是由某某软件提供的,可以看成是一种软件广告。 RFC协议里对这个头信息做了警告:暴露出服务器信息可能会导致黑客更易于攻击你的服务,建议谨慎使用。
User-Agent 携带当前的用户代理信息,一般包含浏览器、浏览器内核和操作系统的版本型号信息。它和Server头是对应的,一个是表达服务器信息,一个是表达客户端信息。服务器可以根据用户代理信息统计出网页服务的浏览器、操作系统的使用占比情况,服务器也可以根据UA的信息来定制不一样的内容。
Transfer-Encoding 传送Body信息时需要对Body数据采取何种变换。当HTTP对Body进行分块传送时,需要增加下面的头部信息才可以进行分块传送。其它类型目前没有遇到过。
Transfer-Encoding: chunked
Upgrade 服务器建议客户端升级传输协议。比如当客户端使用HTTP/1.0发送请求时,服务器就可以建议客户端升级到HTTP/1.1。 这个时候就可以使用Upgrade头。客户端收到这个Upgrade后就会将后续请求转成HTTP/1.1格式继续进行交流。可以支持多个参数,使用逗号分割即可。
当客户端要和服务器进行Websocket进行通讯时,在握手阶段服务器也会向客户端发送Upgrade头部信息,提示客户端将协议切换到Websocket。
Vary 该头部用于缓存控制。对于一些缓存服务器,我们在请求里加入Vary参数可以告知缓存服务器对不同的Vary参数的响应使用不同的缓存单元。比如Vary参数里放入编码参数,那么不同编码的网页就会有不同的缓存。Vary的值可以有多个,只要任意一个值不一样就会有不同的缓存。 比如下面的这个例子告知缓存服务器对不同语言和不同编码的网页响应使用不同的缓存单元。
Vary: Accept-Encoding,Accept-Language
Via 该字段用来标识一个请求经过的网关路由节点。如果这个请求经过了多个代理层,Via头部就会有多个网关信息。
Warning 用于在响应中添加一些附加的警告信息,警告信息包含一个错误码和错误说明。通用的一些错误码在RFC协议中有具体规定。比如111号错误码表示缓存服务器的缓存项目已经过期,并且尝试reload资源,但是reload失败了,所以只好返回了旧的已经过期的内容,这个时候就需要通过warning头反馈客户端。
Warning: 111 Revalidation failed
WWW-Authenticate WWW-Authenticate是401 Unauthorized错误码返回时必须携带的头,该头会携带一个问题Challenge给客户端,告知客户端需要携带这个问题的答案来请求服务器才可以继续访问目标资源。这种问题Challenge可以自定义,比较常见的是Basic认证。
WWW-Authenticate: Basic realm=xxx
Basic指代base64加密算法(不安全),realm指代认证范围/场合/情景名称。
Authorization 对于某些需要特殊权限才能访问的资源需要客户端在请求里提供用户名密码的认证信息。它是对WWW-Authenticate的应答。
# value = base64(user_name:password)
Authorization: Basic YWRtaW46YWRtaW4xMjM=
Proxy-Authenticate 同WWW-Authorization头部,用于代理服务器认证。
Proxy-Authorization 同Authorization头部,用于代理服务器认证。
ETag vs Last-Modified vs Expires ETag一般携带的是资源的版本号,协议没有具体规定版本号是什么。它可以是资源的md5校验码,也可以是uuid,甚至可以是自增的数字,也可以是资源的修改时间。它的匹配方式是相等/不相等。因为服务器需要维护版本号,取决的版本号是什么,这可能是一个存储和计算的负担。
Last-Modified携带的资源的修改时间。它的匹配方式是大于/小于。如果是静态资源文件,一般就是操作系统记录的文件修改时间。
Expires是服务器告知客户端资源的过期时间。客户端缓存的资源在这个时间之后自动过期,而不需要非得向服务器确认一下是不是304 Not Modified才认为没过期。
1、no-cache 如果no-cache没有指定值,那就表示不允许缓存。对于请求来说,服务器不得使用缓存内容直接返回。对于响应来说,客户端不得缓存响应的资源内容。如果no-cache指定了值,那就表示值对应的头信息不得使用缓存,其它的信息还是可以缓存的。告知对方我只要新鲜刚出浴的数据。 2、no-store 告知对方不要持久化请求/响应数据到其它地方,这种信息是敏感的,要保持它的易失性。告知对方记在心里(memory)就行, 别写在纸上(disk)。 3、no-transform 告知对方不要转换数据。比如客户端上传了raw图像数据,服务器一般都会选择性压缩图像数据进行存储。no-transform告知对方保留原始数据信息,不要进行任何转换。告知对方不要乱动我发过来的东西。 4、only-if-cached 用于请求头,告知服务器只要那些已经缓存的内容,不要去reload。如果没有缓存内容就返回504 Gateway Timeout错误。表示客户端不想太麻烦服务器,有就给,没就算了。 5、、max-age 用于请求头。限制缓存内容的年龄,如果超过max-age年龄的,需要服务器去reload内容资源。这叫客户端的年龄歧视。 6、max-stale 用于请求头。客户端允许服务器返回缓存已过期的资源内容,但是限定了最大过期时间。表示客户端虽然很宽容,那是也是有限度的。 7、min-fresh 用于请求头。客户端限制服务器不要那些即将过期的资源内容。就好比我们去超市买牛奶, 如果牛奶快过期了虽然还在保质期内咱们也就不会考虑。 8、public 用于响应头。表示允许客户端缓存响应信息,并可以给别人使用。比如代理服务器缓存静态资源供所有代理用户使用。 9、private 用于响应头。表示仅允许客户端缓存响应信息给自己使用,不得分享给别人。这样是为了禁止代理服务器进行缓存, 而允许客户端自己缓存资源内容。意思是你个人留着用就行,别借给别人用。 ---------------------------------- ---------------------------------- ---------------------------------- ---------------------------------- ---------------------------------- ----------------------------------
41. 如何写shell脚本?尝试自己编写一个简单脚本。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。shell script是一种解释型语言,必须由解释器来执行这些脚本,执行时,
解释器将脚本一行一行地转换为代码。
这个解释器就是Shell,它是一个用 C 语言编写的程序。常见的Shell有Bourne Shell(/usr/bin/sh或/bin/sh)和Bourne Again Shell(/bin/bash),
sh由Steve Bourne开发,是Unix 标准默认的shell,bash由Brian Fox和Chet Ramey共同开发完成,是Linux标准默认的shell。
shell 是一种脚本语言
脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)
shell 既是应用程序 又是一种脚本语言(应用程序 解析 脚本语言)
shell命令解析器:
系统提供 shell命令解析器: sh ash bash
查看自己linux系统的默认解析:echo $SHELL
一个简单的脚本示例:
#!/bin/bash # This is our first script. echo 'Hello World!
收获:以上
明天计划:总结完成任务二的深度思考
评论