android之网络通信详解

TCP、UDP

TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户端和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

 

UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地,在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快,如聊天,发送音频视频

 

TCP: 

TCP编程的服务器端一般步骤是: 

  1、创建一个socket服务端对象:new ServerSocket(端口号 ); 

        2、监听服务器连接,通过accept方法,得到socket对象

        3、通过socket对象得到输入流,通过read方法读取到字节数组中如果写双向的,就通过socket对象得到输出流,写入数据

        4.关闭资源

 

TCP编程的客户端一般步骤是: 

  1、创建一个socket客户端:new Socket(ip,端口)

        2、通过socket对象获得输出流,写入数据如果写双向的,就通过socket对象得到输入流,通过read方法读取到字节数组中

        3、关闭资源,这里关闭socket也会关闭流

 

UDP:

与之对应的UDP编程步骤要简单许多,分别如下: 

  UDP编程的服务器端一般步骤是: 

  1、创建socket服务,指定端口号:new DatagramSocket(8080)

        2、建立数据包对象,用来接收数据,

        3、通过receive来接收数据

        4、确认不使用时关闭资源

 

UDP编程的客户端一般步骤是: 

  1、建立udp的socket服务:new DatagramSocket()

  2、将数据打包,参数一:数据的字节数组,参数二:数据长度,参数三:获取的服务端的地址 ip,参数四:服务器端口号:new DatagramPacket()

  3、发送数据,用函数send(); 

  4、关闭资源;

 

TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。

 

TCP与UDP的选择 

TCP:当数据传输的性能必须让位于数据传输的完整性、可控制性和可靠性时

UDP:当强调传输性能而不是传输的完整性时,如:音频和多媒体应用

 

TCP和UDP区别

                       TCP                                UDP

是否连接       面向连接                 面向非连接

传输可靠性    可靠                     会丢包,不可靠

应用场景      传输数据量大             传输量小

速度               慢                                     快

 

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则是不可靠信道

 

 

在日常生活中,常见使用TCP协议的应用如下:

  浏览器,用的HTTP

  ++,用的FTP

  Outlook,用的POP、SMTP 微软办公软件套装的组件之一

  Putty,用的Telnet、SSH 串行接口连接软件

  QQ文件传输

 

三次握手四次挥手

为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。

确认ACK ,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;

同步 SYN,在连接建立时用来同步序号。当SYN=1,ACK=0时,表明是连接请求报文,若同意连接,则响应报文应该SYN=1,ACK=1。

终止FIN,用来释放链接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放。

TCP 三次握手

        第一次握手:Client什么都不能确认;Server确认了对方发送正常

        第二次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己接收正常,对方发送正常

        第三次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己发送、接收正常,对方发送   接收正常

四次挥手

客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

 

服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用 进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

 

客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

 

服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

 

客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

 

服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

 

 举个例子:A和B打电话,通话即将结束后,A说“我没啥要说的了”,B回答“我知道了”,但是B可能还会有要说的话,A不能要求B跟着自己的节奏结束通话,于是B可能又巴拉巴拉说了一通,最后B说“我说完了”,A回答“知道了”,这样通话才算结束。

总结握手挥手、三次握手建立连接

  第一次握手:客户端发送了一个带有SYN(建立连接)的Tcp报文到服务器,表示客户端想要和服务端建立连接。  

  第二次握手:服务端接收到客户端的请求,返回客户端报文,这个报文带有SYN(建立连接)和ACK(确认)标志,询问客户端是否准备好。 

  第三次握手:.客户端再次响应服务端一个ACK(确认),表示我已经准备好。

 

问题1: 为什么要三次握手?

 

答:三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收机能正常。

 

问题2: 为什么TCP客户端最后还要发送一次确认呢?

 

一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

 

问题3:上图中的SYN和ACK是什么?

答:SYN是标志位,SYN=1表示请求连接;

        ACK其实就是ack后面加上的那个数,真正发送的时候不单独发ACK,只发ack,下面四次挥手的图同理

 

四次挥手取消连接

第一次握手:TCP发送一个FIN(结束),用来关闭客户到服务端的连接。

第二次握手:服务端收到这个FIN,他发回一个ACK(确认),确认收到序号为收到序号+1,和SYN一样,一个FIN将占用一个序号。

第三次握手:服务端发送一个FIN(结束)到客户端,服务端关闭客户端的连接。

第四次握手:客户端发送ACK(确认)报文确认,并将确认的序号+1,这样关闭完成。

 

思考:那么为什么是4次挥手呢? 

    可能有人会有疑问,tcp我握手的时候为何ACK(确认)和SYN(建立连接)是一起发送。挥手的时候为什么是分开的时候发送呢.

    因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭             SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

Http和Https的区别

1.http和https的基本概念

http:超文本传输协议,互联网上应用最广泛的一种协议,被用于在Web浏览器和网站服务器之间传递信息,它可以使浏览器更加高效,使网络传输减少。

https:是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。主要作用可以分为两种,建立一个信息安全通道,来保证数据传输的安全性;确认网站的真实性

2.http和https有什么区别?

HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

 

主要区别如下:

  • https需要ca申请证书,免费的较少,需要一定费用
  • http是超文本传输协议,信息是明文传输,连接很简单,是无状态的,https由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
  • http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443

3.https的工作原理

一张图就够了,解释可以不看

准备工作(对应图中prepare1234)

可以看到,在客户端向服务器发起请求前,还有一些准备工作要做,或者说是有一些工作已经做好了。

  • 从CA证书颁发机构,获取数字证书。
    • 服务器:生成一对公私钥S.pub,S.pri,私钥自己保留,用于解密和签名,不能外泄。将公钥S.pub,身份信息,传给CA(Certificate Authority)机构;
    • CA机构:也有公私钥C.pub,C.pri;由S.pub,身份信息另外附加CA签名生成数字证书(签名使用C.pri进行签名)
    • 将数字证书颁发给申请者(服务器)
  • 客户端(比如我们经常使用的浏览器),为了安全性,会内置一份CA根证书,它包含C.pri,用于对数字证书验证

 

开始通信

 

1.客户端发起请求,要求建立连接,需要tcp三次握手,可见https也是基于tcp的

2.服务器收到请求后,将证书(就是公钥)发送给客户端

3.客户端和产生一个随机值,用公钥进行加密,加密完发送给服务器

4.服务器使用私钥解密

 

详细介绍工作原理:https://www.cnblogs.com/softidea/p/6958394.html

 

4.https优缺点

优:

1.https协议可认证用户和服务器,确保数据发送到正确的客户端和服务器

2.HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。

缺:

1.HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电;

2.SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。

3.HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行,但目前来说,在国内是非常安全的

至于http优缺点,优:高效,使网络传输减少,缺:明文传输,不安全

socket、tcp、udp、http关系

先来了解TCP/IP

TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。是一个协议组

 

在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。

在传输层中有TCP协议与UDP协议。

在应用层有HTTP,FTP、TELNET、SMTP、DNS等协议。

Socket是什么呢?

       Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

这是为了实现以上的通信过程而建立成来的通信管道,其真实的代表是客户端和服务器端的一个通信进程,双方进程通过socket进行通信,而通信的规则采用指定的协议。

socket只是一种连接模式,不是协议,socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),

通过Socket,我们才能使用TCP/IP协议。tcp、udp,简单的说(虽然不准确)是两个最基本的协议,

很多其它协议都是基于这两个协议如,http就是基于tcp的,.用socket可以创建tcp连接,也可以创建udp连接,

这意味着,用socket可以创建任何协议的连接,因为其它协议都是基于此的。

socket通信原理参考文章:https://blog.csdn.net/jiajia4336/article/details/8798421

socket、udp、tcp、http关系:https://blog.csdn.net/WHB20081815/article/details/67640804#commentBox

 

 

 

 

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值