1、Java学习手册:Java基础知识点
2、Java学习手册:Java面向对象面试问题
3、Java学习手册:Java集合、泛型面试问题
4、Java学习手册:Java并发与多线程面试问题
5、Java学习手册:Java虚拟机面试问题
6、Java学习手册:Java IO面试问题
7、Java学习手册:Java反射机制面试问题
8、Java学习手册:Java网络编程面试问题
9、Java学习手册:Java异常面试问题
10、Java学习手册:Java设计模式面试问题
11、Java学习手册:Java数据库面试问题
Java学习手册:TCP与UDP
Java学习手册:Java Socket
Java学习手册:Java NIO
Java学习手册:XML
HTTP响应由三个部分组成:
状态码(Status Code):描述了响应的状态。可以⽤来检查是否成功的完成了请求。请求失败的情况下,状态码可⽤来找出失败的原因。如果Servlet没有返回状态码,默认会返回成功的状态码HttpServletResponse.SC_OK。
HTTP头部(HTTP Header): 它们包含了更多关于响应的信息。⽐如:头部可以指定认为响应过期的过期⽇期,或者是指定⽤来给⽤⼾安全的传输实体内容的编码格式。
主体(Body):它包含了响应的内容。它可以包含HTML代码,图⽚,等等。主体是由传输在HTTP消息中紧跟在头部后⾯的数据字节组成的。
cookie是Web服务器发送给浏览器的⼀块信息。浏览器会在本地⽂件中给每⼀个Web服务器存储cookie。以后浏览器在给特定的Web服务器发请求的时候,同时会发送所有为该服务器存储的cookie。下⾯列出了session和cookie的区别:
HTTP隧道是⼀种利⽤HTTP或者是HTTPS把多种⽹络协议封装起来进⾏通信的技术。因此,HTTP协议扮演了⼀个打通⽤于通信的⽹络协议的管道的包装器的⻆⾊。把其他协议的请求掩盖成HTTP的请求就是HTTP隧道。
sendRedirect()⽅法会创建⼀个新的请求,⽽forward()⽅法只是把请求转发到⼀个新的⽬标上。重定向(redirect)以后,之前请求作⽤域范围以内的对象就失效了,因为会产⽣⼀个新的请求,⽽转发(forwarding)以后,之前请求作⽤域范围以内的对象还是能访问的。⼀般认为sendRedirect()⽐forward()要慢。
URL编码是负责把URL⾥⾯的空格和其他的特殊字符替换成对应的⼗六进制表⽰,反之就是解码。
Http是应用层的协议,底层基于TCP/IP协议,所以本质上,get和post请求都是TCP请求。所以二者的区别都是体现在应用层上(HTTP的规定和浏览器/服务器的限制):
1、参数的传输方式:GET参数通过URL传递,POST放在Request body中。
2、GET请求在URL中传送的参数是有长度限制的,而POST没有。
3、对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。不过要注意,并不是所有浏览器都会在POST中发送两次包,比如火狐。
4、对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
5、GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
6、GET请求只能进行url编码,而POST支持多种编码方式。
7、GET在浏览器回退时是无害的,而POST会再次提交请求。
8、GET产生的URL地址可以被Bookmark,而POST不可以。
9、GET请求会被浏览器主动cache,而POST不会,除非手动设置。
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。HTTP是应用层协议,位于HTTP协议之下是传输协议TCP。TCP负责传输,HTTP则定义了数据如何进行包装,在HTTP跟TCP中间加多了一层加密层TLS/SSL,SSL是个加密套件,负责对HTTP的数据进行加密。TLS是SSL的升级版。现在提到HTTPS,加密套件基本指的是TLS。
传输加密的流程:http是应用层将数据直接给到TCP进行传输,Https是应用层将数据给到TLS/SSL,将数据加密后,再给到TCP进行传输。
HTTPS加密数据的过程一般来说,分为对称加密、非对称加密。
(1)对称加密
对称加密的意思就是,加密数据用的密钥,跟解密数据用的密钥是一样的。
对称加密的优点在于加密、解密效率通常比较高。缺点在于,数据发送方、数据接收方需要协商、共享同一把密钥,并确保密钥不泄露给其他人。传输过程中容易被截获。
(2)非对称加密
非对称加密的意思就是,加密数据用的密钥(公钥),跟解密数据用的密钥(私钥)是不一样的。
(1)Data Encryption Standard(DES)
DES 是一种典型的块加密方法:将固定长度的明文通过一系列复杂的操作变成同样长度的密文,块的长度为64位。同时,DES 使用的密钥来自定义变换过程,因此算法认为只有持有加密所用的密钥的用户才能解密密文。 DES 的密钥表面上是64位的,实际有效密钥长度为56位,其余8位可以用于奇偶校验。
DES 现在已经不被视为一种安全的加密算法,主要原因是它使用的56位密钥过短。
为了提供实用所需的安全性,可以使用 DES 的派生算法 3DES 来进行加密 (虽然3DES 也存在理论上的攻击方法)。
(2)Advanced Encryption Standard(AES)
AES 在密码学中又称 Rijndael 加密法,用来替代原先的 DES,已经被多方分析且广泛使用。
(3)DES与AES的对比
自DES 算法公诸于世以来,学术界围绕它的安全性等方面进行了研究并展开了激烈的争论。在技术上,对DES的批评主要集中在以下几个方面:
1、作为分组密码,DES 的加密单位仅有64 位二进制,这对于数据传输来说太小,因为每个分组仅含8个字符,而且其中某些位还要用于奇偶校验或其他通讯开销。
2、DES 的密钥的位数太短,只有56 比特,而且各次迭代中使用的密钥是递推产生的,这种相关必然降低密码体制的安全性,在现有技术下用穷举法寻找密钥已趋于可行。
3、DES 不能对抗差分和线性密码分析。
4、DES 用户实际使用的密钥长度为56bit,理论上最大加密强度为256。DES 算法要提高加密强度(例如增加密钥长度),则系统开销呈指数增长。除采用提高硬件功能和增加并行处理功能外,从算法本身和软件技术方面都无法提高DES 算法的加密强度。
(1)RSA
1977年由 MIT 的 Ron Rivest、Adi Shamir 和 Leonard Adleman 一起提出,以他们三人姓氏开头字母命名,是一种获得广泛使用的非对称加密算法。
对极大整数做因数分解的难度 (The Factoring Problem) 决定了 RSA 算法的可靠性。换言之,对一个极大整数做因数分解愈困难,RSA 算法就愈可靠。假如有人找到一种快速因数分解的算法的话,那么用 RSA 加密的信息的可靠性就肯定会极度下降。目前看来找到这样的算法的可能性非常小。
(2)DES与RSA的比较
RSA算法的密钥很长,具有较好的安全性,但加密的计算量很大,加密速度较慢限制了其应用范围。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。
采用DES与RSA相结合的应用,使它们的优缺点正好互补,即DES加密速度快,适合加密较长的报文,可用其加密明文;RSA加密速度慢,安全性好,应用于DES 密钥的加密,可解决DES 密钥分配的问题。
目前这种RSA和DES结合的方法已成为EMAIL保密通信标准。
(1)HTTP(超文本传输协议)
HTTP协议不适合传输一些敏感信息,比如:信用卡号,密码等支付信息。
(2)HTTPS(安全套接字层超文本传输协议)
HTTPS在HTTP基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
(3)区别
HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求
处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。
HTTP 1.1则支持持久连接Persistent Connection,并且默认使用persistent connection。在同一个TCP的连接中可以传送多个
HTTP请求和响应。多个请求和响应可以重叠,多个请求和响应可以同时进行更加多的请求头和响应头(比如HTTP1.0没有
host的字段)。
注:
HTTP 1.1的持续连接,也需要增加新的请求头来帮助实现,例如,Connection请求头的值为Keep-Alive时,客户端通知服
务器返回本次请求结果后保持连接;Connection请求头的值为close时,客户端通知服务器返回本次请求结果后关闭连接。
HTTP 1.1还提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随
着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP
地址。
HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad
Request)。此外,服务器应该接受以绝对路径标记的资源请求。
HTTP/1.1加入了一个新的状态码100(Continue)。客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请
求,就回送响应码401(Unauthorized);如果服务器接收此请求就回送响应码100,客户端就可以继续发送带实体的完整
请求了。100 (Continue) 状态代码的使用,允许客户端在发request消息body之前先用request header试探一下server,看
server要不要接收request body,再决定要不要发request body。
发送方将消息分割成若干个任意大小的数据块,每个数据块在发送时都会附上块的长度,最后用一个零长度的块作为消息结束的标志。这种方法允许发送方只缓冲消息的一个片段,避免缓冲整个消息带来的过载。
当缓存对象的Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象,而是与源服务器进行重新激活(revalidation)。
GET和POST本质都是TCP连接。不过GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200 OK(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 OK(返回数据)。
注:GET参数的长度、类型均有限制。
Session原理:浏览器第一次访问服务器时,服务器会响应一个cookie给浏览器。这个cookie记录的就是sessionId,之后每次访问携带着这个sessionId,服务器里查询该sessionId,便可以识别并跟踪特定的用户了。(服务端要为特定的用户创建特定的Session,用于标识这个用户,并且跟踪用户。)
Cookie原理:第一次访问服务器,服务器响应时,要求浏览器记住一个信息。之后浏览器每次访问服务器时候,携带第一次记住的信息访问。相当于服务器识别客户端的一个通行证。Cookie不可跨域,浏览览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie,换句话说Google只能操作Google的Cookie。
网络层是针对主机与主机之间的服务。而传输层针对的是不同主机进程之间的通信。传输层协议将应用进程的消息传送到网络层,但是它并不涉及消息是怎么在网络层之间传送(这部分是由网络层的路由选择完成的)。网络层真正负责将数据包从源IP地址转发到目标IP地址,而传输层负责将数据包再递交给主机中对应端口的进程。
可靠传输是指:
TCP如何实现可靠传输:
序号和确认号是实现可靠传输的关键。
通信双方通过序号和确认号,来判断数据是否丢失、是否按顺序到达、是否冗余等,以此决定要不要进行重传丢失的分组或丢弃冗余的分组。换句话说,因为有了序号、确认号和重传机制,保证了数据不丢失、不重复、有序到达。
当在浏览器输入网址www.baidu.com并敲下回车后:
HTTP协议是基于TCP协议的,客户端向服务端发送一个HTTP请求时,需要先与服务端建立TCP连接(三次握手),握手成功以后才能进行数据交互。
HTTP请求的报文格式:
HTTP响应的报文格式:
常见的状态码有: