Android 网络协议与网络编程

一、TCP/IP协议

Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联 协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP 协议组成。协议采用了4层的层级结构。然而在很多情况下,它是利用 IP 进行通信时所必须用到的 协议群的统称。

Android 网络协议与网络编程_第1张图片

对于TCP/IP四层模型我们可以简单的理解为:

网络接入层:将需要互相连接的节点接入网络中,从而为数据传输提供条件。
网际互联层:找到要传输数据的目标节点。(IP协议)
传输层:实际传输数据。(TCP、UDP协议)
应用层:使用接受到的数据(HTTP、HTTPS、DNS协议)

Android 网络协议与网络编程_第2张图片

二、TCP与UDP协议

1、TCP协议

Transmission Control Protocol,传输控制协议,是一种传输层通信协议。

特点:

面向连接、面向字节流、全双工通信、可靠

面向连接:指的是要使用TCP传输数据,必须先建立TCP连接,传输完成后释放连接,就像打电话一样必须先拨号建立一条连接,打完后挂机释放连接。

全双工通信:即一旦建立了TCP连接,通信双方可以在任何时候都能发送数据。

可靠的:指的是通过TCP连接传送的数据,无差错,不丢失,不重复,并且按序到达。

面向字节流:流,指的是流入到进程或从进程流出的字符序列。简单来说,虽然有时候要传输的数据流太大,TCP报文长度有限制,不能一次传输完,要把它分为好几个数据块,
但是由于可靠性保证,接收方可以按顺序接收数据块然后重新组成分块之前的数据流,所以TCP看起来就像直接互相传输字节流一样,面向字节流。

TCP建立连接:

必须进行三次握手:若A要与B进行连接,则必须 :
 
第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认。即A发送信息给B;

第二次握手:服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认。即B收到连接信息后向A返回确认信息;

第三次握手:客户端收到服务器的(SYN+ACK)报文段,并向服务器发送ACK报文段。即A收到确认信息后再次向B返回确认连接信息(此时,A告诉自己上层连接建立;B收到连接信息后告诉上层连接建立。)

这样就完成TCP三次握手 = 一条TCP连接建立完成 = 可以开始发送数据

Android 网络协议与网络编程_第3张图片

为什么TCP建立连接需要三次握手?

防止服务器端因为接收了早已失效的连接请求报文从而一直等待客户端请求,从而浪费资源。

TCP释放连接四次挥手

现在假设A主动释放连接:(数据传输结束后,通信的双方都可释放连接),其释放TCP连接的过程如下:

第一次握手: A发送释放信息到B;(发出去之后,A->B发送数据这条路径就断了)

第二次握手: B收到A的释放信息之后,回复确认释放的信息:我同意你的释放连接请求;

第三次握手: B发送“请求释放连接“信息给A;

第四次握手: A收到B发送的信息后向B发送确认释放信息:我同意你的释放连接请求。

首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。 

Android 网络协议与网络编程_第4张图片 

为什么TCP释放连接需要四次挥手?

为了保证双方都能通知对方“需要释放连接”,即在释放连接后都无法接收或发送消息给对方。

需要明确的是:TCP是全双工模式,这意味着是双向都可以发送、接收的;

释放连接的定义是:双方都无法接收或发送消息给对方,是双向的;

当主机1发出“释放连接请求”(FIN报文段)时,只是表示主机1已经没有数据要发送 / 数据已经全部发送完毕; 但是,这个时候主机1还是可以接受来自主机2的数据。

当主机2返回“确认释放连接”信息(ACK报文段)时,表示它已经知道主机1没有数据发送了,但此时主机2还是可以发送数据给主机1;

当主机2也发送了FIN报文段时,即告诉主机1我也没有数据要发送了,此时,主机1和2已经无法进行通信:主机1无法发送数据给主机2,主机2也无法发送数据给主机1,此时,TCP的连接才算释放。

2、UDP协议

User Data Protocol 用户数据报协议,是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!

特点:

无连接的、不可靠的、面向报文、没有拥塞控制

无连接的:和TCP要建立连接不同,UDP传输数据不需要建立连接,就像写信,在信封写上收信人名称、地址就可以交给邮局发送了,至于能不能送到,就要看邮局的送信能力和送信过程的困难程度了。

不可靠的:因为UDP发出去的数据包发出去就不管了,不管它会不会到达,所以很可能会出现丢包现象,使传输的数据出错。

面向报文:数据报文,就相当于一个数据包,应用层交给UDP多大的数据包,UDP就照样发送,不会像TCP那样拆分。

没有拥塞控制:拥塞,是指到达通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象,就像交通堵塞一样。TCP建立连接后如果发送的数据因为信道质量的原因不能到达目的地,它会不断重发,有可能导致越来越塞,所以需要一个复杂的原理来控制拥塞。而UDP就没有这个烦恼,发出去就不管了。

3、TCP与UDP区别总结:

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接;

2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保   证可靠交付;

3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等);

4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信;

5、TCP首部开销20字节;UDP的首部开销小,只有8个字节;

6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。

三、Http与Https协议 

1、Http协议

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网 (WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。是应用层协议,在TCP/IP协议接收到数据之后通过HTTP协议来解析才可以使用。 

Android 网络协议与网络编程_第5张图片

Http的请求过程 :

1、域名解析 

2、发起TCP的3次握手 

3、建立TCP连接后发起Http请求 

4、服务器端响应Http请求,并回传数据 

5、客户端获取数据并解析展示在前端界面

6、关闭 TCP 连接

Http的特点:

HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

HTTP的缺点:

HTTP虽然使用极为广泛, 但是却存在不小的安全缺陷,主要有以下3点:

1)明文传送。HTTP协议无法加密数据,所有通信数据都在网络中明文“裸奔”。通过网络的嗅探设备及一些技术手段,就可以窃取http的内容。

2)无法证明报文的完整性。HTTP在传输客户端请求和服务端响应时, 唯一的数据完整性检验就是在报文头部包含了本次传输数据的长度, 而对内容是否被篡改不作确认。因此攻击者可以轻易的发动中间人攻击, 修改客户端和服务端传输的数据, 甚至在传输数据中插入恶意代码, 导致客户端被引导至恶意网站被植入木马。

3)不验证通信方的身份。黑客可以伪装他人身份进通信。HTTP协议中的请求和响应不会对通信方进行确认。在HTTP协议通信时,由于不存在确认通信方的处理步骤,任何人都可以发起请求。另外,服务器只要接收到请求,不管对方是谁都会返回一个响应。

2、Https协议

Https是一种Http加密安全版的协议,在Http连接的基础上,对数据采用SSL的加密方式,使得在没有密钥的情况下,根本无法破解其中的数据,保证了其中的安全性。它仍然使用的http进行数据的传输,不同的是https传输的数据都是经过tcp和http之间的ssl层进行加密的。

在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性,所谓的 HTTPS,就是HTTP + SSL/TLS。HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP之间)。这个系统提供了身份验证与加密通讯方法。

3、SSL协议

Secure Sockets Layer 安全套接字协议,及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。

4、对称加密

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。

所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。

因此加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题,因为任何人只要持有密钥就能解密了。

5、非对称加密

非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将公钥公开,需要向甲方发送信息的其他角色(乙方)使用该密钥(甲方的公钥)对机密信息进行加密后再发送给甲方;

甲方再用自己私钥对加密后的信息进行解密。甲方想要回复乙方时正好相反,使用乙方的公钥对数据进行加密,同理,乙方使用自己的私钥来进行解密。

另一方面,甲方可以使用自己的私钥对机密信息进行签名后再发送给乙方;乙方再用甲方的公钥对甲方发送回来的数据进行验签。

甲方只能用其私钥解密由其公钥加密后的任何信息。非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要。

私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。

利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。

这种方式有以下缺点:

1)公钥是公开的,所以针对私钥加密的信息,黑客截获后可以使用公钥进行解密,获取其中的内容。

2)公钥并不包含服务器的信息,使用非对称加密算法无法确保服务器身份的合法性,存在中间人攻击的风险,服务器发送给客户端的公钥可能在传送过程中被中间人截获并篡改;

3)非对称加密的加解密效率是非常低的,而 http 的应用场景中通常端与端之间存在大量的交互,非对称加密的效率是无法接受的。

在 HTTPS 的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以 HTTPS 中内容传输加密采取的是对称加密,而不是非对称加密。

6、HTTPS请求流程:

HTTPS就把对称加密和非对称加密结合起来,在证书验证阶段使用非对称加密,在数据传输阶段使用对称加密。

1)客户端发起https请求,将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器。

2)服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的SSL证书发送给客户端;该证书还包含了用于认证目的的服务器标识,如:证书的发布机构CA、证书的有效期、证书所有者、签名等,服务器同时还提供了一个用作产生密钥的随机数。

3)客户端对服务器的证书进行验证:
    a. 首先浏览器读取证书中的证书所有者、有效期等信息进行逐个校验;
    b. 浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发;
    c. 如果找到,那么浏览器就会从操作系统中取出颁发者CA 的公钥,然后对服务器发来的证书里面的签名进行解密;如果找不到,浏览器就会显示警告信息,说明服务器发来的证书是不可信任的,让用户选择;

4)抽取服务器的公用密钥,然后再产生一个随机密码串,并使用服务器的公用密钥对其进行加密(非对称加 / 解密),并将加密后的信息发送给服务器。

5)服务器用私钥对随机密码串进行解密,并且结合随机数值构造对称加密算法。

6)客户端通过对称加密密钥对请求内容进行加密发送给服务器。

7)服务器通过对称密钥对客户端发送的内容进行解密,然后将响应内容通过对称密钥返回给客户端。

7、HTTPS 的工作原理:

我们都知道 HTTPS 能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用 HTTPS 协议。

1)客户端发起 HTTPS 请求:

用户在浏览器里输入一个 https 网址,然后连接到 server 的 443 端口。

2)服务端的配置:

采用 HTTPS 协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。

3)传送证书:

这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。

4)客户端解析证书:

这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。

5)传送加密信息:

这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。

6)服务端解密信息:

服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。

7)传输加密后的信息:

这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。

8)客户端解密信息:

客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。

8、Http与Https差异比较

1)https协议需要到ca申请证书,一般免费证书很少,需要交费。 

2)http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。 

3)http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。 

4)http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

5)HTTPS基于传输层,HTTP基于应用层。

你可能感兴趣的:(网络编程,android,网络,网络协议)