一、了解DNS解析吗?
域名到IP地址的映射,DNS解析请求采用UDP数据报,且明文。之所以采用UDP,TCP连接的开销大,故采用UDP作为DNS的运输层协议,这也将导致只有13个根域名服务器的结果。
现在假如访问一个网站www.baidu.com
,从按下回车到百度页面显示到电脑上会经历如下几个步骤:
1、计算机会向运营商(移动、电信、联通等)发出打开www.baidu.com
的请求。
2、运营商收到请求后会到自己的DNS服务器中找www.baidu.com
这个域名所对应的服务器的IP地址(也就是百度的服务器的IP地址),这里比如是180.149.132.47
。
3、运营商用第二步得到的IP地址去找到百度的服务器请求得到数据后返回给请求端。
其中第二步就是我们所说的DNS解析过程,域名和IP地址的关系其实就是我们的身份证号和姓名的关系,都是来标记一个人或者是一个网站的,只是IP地址\身份证号只是一串没有意义的数字,辨识度低,又不好记,所以就会在IP上加上一个域名以便区分,或是做的更加个性化,但是如果真的要来准确的区分还是要靠身份证号码或者是IP的,所以DNS解析就应运而生了。
二、怎么解决DNS劫持?
先分析DNS被劫持的原因,根本原因就是以下两点:
1、恶意攻击,拦截运营商的解析过程,把自己的非法东西嵌入其中。
2、运营商为了利益或者一些其他的因素,允许一些第三方在自己的链接里打打广告之类的。
防止DNS劫持的手段:
1、httpDNS
HttpDNS
是使用HTTP
协议向DNS服务器的80端口进行请求,代替传统的DNS协议向DNS服务器的53端口进行请求,绕开了运营商的Local DNS
,从而避免了使用运营商Local DNS
造成的劫持和跨网问题。
2、长连接
三、TCP和UDP的区别
TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性;而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。
简单的说,TCP注重数据可靠性,而UDP数据传输快点,但安全性一般。
UDP特点:
1、无连接
2、尽最大努力交付
3、面向报文
TCP特点:
1、面向连接
2、可靠传输
3、面向字节流
4、流量控制
5、拥塞控制
四、HTTPS都使用了哪些加密手段?为什么?
1、连接建立过程中使用非对称加密
2、数据传输过程中使用对称加密
五、理解HTTPS
HTTPS
是以安全为目标的HTTP
通道,简单讲是HTTP
的安全版,即HTTP+SSL/TSL
。HTTPS使用端口443,而不是象`HTTP那样使用端口80来通信。SSL使用40位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。
HTTPS
的建立流程的过程:
1、客户端将自己支持的加密算法(Cipher Suite
)发送给服务器,请求服务器证书
2、服务器选取一组加密算法,并将证书返回给客户端
3、客户端校验证书合法性,生成随机密钥,用公钥加密后发送给服务器
4、服务器用私钥解密出对称密钥,返回一个响应,HTTPS
连接建立完成
5、随后双方通过这个对称密钥进行安全的数据通信。
六、详谈HTTPS通信机制,HTTPS是如何进行安全通信的?
HTTPS
是以安全为目标的HTTP
通道,简单讲是HTTP
的安全版,即HTTP+SSL/TSL
。其作用是:
1、通过证书等信息确认网站的真实性;
2、建立加密的信息通道;
3、数据内容的完整性。
这里需要弄清楚HTTPS
建立通讯的流程是什么样子?在其它问题中已经做了相关描述。
重点部分:
Charles
作为一个中间人代理,当浏览器和服务器通信时,Charles
接收服务器的证书,但动态生成一张证书发送给浏览器,也就是说Charles
作为中间代理在浏览器和服务器之间通信,所以通信的数据可以被Charles
拦截并解密。由于Charle
s更改了证书,浏览器校验不通过会给出安全警告,必须安装Charles
的证书后才能进行正常访问。
简单来说,就是Charles作为“中间人代理”,拿到了服务器证书公钥和HTTPS
连接的对称密钥,前提是客户端选择信任并安装Charles
的CA证书,否则客户端就会“报警”并中止连接。
其详细流程如下:
1、客户端向服务器发起HTTPS
请求
2、Charles
拦截客户端的请求,伪装成客户端向服务器进行请求
3、服务器向“客户端”(实际上是Charles
)返回服务器的CA证书
4、Charles
拦截服务器的响应,获取服务器证书公钥,然后自己制作一张证书,将服务器证书替换后发送给客户端。(这一步,Charles
拿到了服务器证书的公钥)
5、客户端接收到“服务器”(实际上是Charles
)的证书后,生成一个对称密钥,用Charles
的公钥加密,发送给“服务器”(Charles)
6、Charles
拦截客户端的响应,用自己的私钥解密对称密钥,然后用服务器证书公钥加密,发送给服务器。(这一步,Charles
拿到了对称密钥)
7、服务器用自己的私钥解密对称密钥,向“客户端”(Charles
)发送响应
8、Charles
拦截服务器的响应,替换成自己的证书后发送给客户端
9、连接建立,Charles
拿到了服务器证书的公钥和客户端与服务器协商的对称密钥,之后就可以解密或者修改加密的报文了。
更多详情请参考浅谈HTTPS通信机制和Charles抓包原理
七、谈谈GET和POST的区别
HTTP/HTTPS
请求方法包括GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE
。其中GET
和POST
最为常用。
从语义角度来说,GET
是从指定的资源请求数据,POST
是向指定的资源提交要被处理的数据。通俗点将,GET
是获取数据,POST是更新数据
。
具体区别可以大致总结为一下几点:
(1) GET的URL可见,POST的URL不可见;
(2) GET请求可以被缓存,POST不会被缓存;
(3) GET请求可以保留在浏览器历史记录中,POST不会;(是否引起Server端的任何状态变化)
(4) GET请求有长度限制,2048个字节,POST长度没有限制;
(5) GET请求是幂等性的,POST是非幂等性的;(同一个请求方式执行多次或一次的效果是否完全相同)
(6) GET请求的安全性没有POST高。
八、理解HTTP
著名的OSI/RM
模型(Open System Interconnection/Reference Model
)将计算机网络体系结构的通信协议划分为七层,自下而上依次为:
物理层(Physics Layer)、
数据链路层(Data Link Layer)、
网络层(Network Layer)、
传输层(Transport Layer)、
会话层(Session Layer)、
表示层(Presentation Layer)、
应用层(Application Layer)。
HTTP
通信的基本单位是报文,HTTP
报文由从客户机到服务器的请求和从服务器到客户机的响应构成,包括请求报文和响应报文。
请求报文格式如下:
请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体
响应报文格式如下:
状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体
两者的区别主要在于请求行与状态行:
请求行由方法字段、URL字段、HTTP协议版本字段和CRLF构成;
状态行由版本、状态码、短语、CRLF构成。
状态码的含义
1xx:http请求已经接受,继续处理请求
2xx:http请求已经处理完成
3xx:把请求访问的URL重定向到其它目录
4xx:客户端出现错误
5xx:服务端出现错误
更多请参考iOS开发之HTTP与HTTPS网络请求
九、理解TCP连接的建立需要通过三次握手,连接的断开需要通过四次挥手的过程。
采用三次握手是为了防止失效的连接请求报文段突然又传送到主机B,因而产生错误。
采用两次握手不行,原因就是考虑失效的连接请求的特殊情况。而在三次握手中,client
和server
都有一个发syn
和收ack
的过程,双方都是发后能收,表明通信则准备工作OK。
为什么不是四次握手呢?大家应该知道通信中著名的蓝军红军约定,这个例子说明,通信不可能100%可靠,而上面的三次握手已经做好了通信的准备工作,再增加握手,并不能显著提高可靠性,而且也没有必要。
- 三次握手:
第一次握手:建立连接时,客户端发送SYN
包(syn=j)到服务器,并进入SYN_SEND
状态,等待服务器确认;
第二次握手:服务器收到SYN
包,必须确认客户SYN
(ack=j+1),同时自己也发送一个SYN
包(syn=k),即SYN+ACK
包,此时服务器进入SYN_RECV
状态;
第三次握手:客户端收到服务器的SYN+ACK
包,向服务器发送确认包ACK
(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED
状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。
- 四次挥手:
假设客户端主动关闭,服务器被动关闭。
第一次握手:客户端发送一个FIN
(结束),用来关闭客户到服务端的连接。此时客户端不能发送数据,但还可以接受数据。
第二次握手:服务端收到这个FIN
,他发回一个ACK
(确认),确认收到序号为收到序号+1(和SYN
一样,一个FIN
将占用一个序号)。此时虽然客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT
状态持续的时间。
第三次握手:服务端发送一个FIN
(结束)到客户端,服务端关闭客户端的连接。此时服务端也将不继续发送数据。
第四次握手:客户端发送ACK
(确认)报文确认,并将确认的序号+1,这样关闭完成。
服务器只要收到了客户端发出的确认,立即进入CLOSED
状态。从整个流程来看,服务器结束TCP连接的时间要比客户端早一些。至此,完成四次挥手。
十、为什么建立连接是三次握手,关闭连接确是四次挥手呢?
建立连接的时候,服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK
和SYN
放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN
报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN
报文给对方来表示同意现在关闭连接,因此,己方ACK
和FIN
一般都会分开发送,从而导致多了一次。