网络通信相关知识详解(二)

        2019年即将结束,作为移动端开发,我们常常需要与后台进行网络数据的通信,在我们开发的过程中,常常只是通过一个url+参数,然后就等待网路返回各种类型的数据,那么我们有没有更加深入的了解过网络通信在底层的具体实现呢。

       下面我就帮大家梳理一下网络通信相关的知识点,里面有些不太重要的可能就一笔带过,个人认为比较重要的就会详细的解析相关知识点,由于内容比较多,我把内容分为三篇文章分享出来,希望大家喜欢。

        前面的文章:网络通信相关知识详解(一)已经总结了前六个部分的内容,这篇文章是本系列三篇文章的第二篇。


相关知识点汇总:

一、手机与外界通信的手段

二、描述一次网络请求的流程

三、网络七层模型介绍

四、网络相关设备详解(路由器,交换机,网桥,网关)

五、TCP/IP协议族与相关知识(三次握手,四次挥手,流量控制,拥塞控制)

六、cookie,sessionId与token的区别

七、网络数据传输类型的处理(文字,图片,实时音频流,实时视频流,文件)

八、数据指纹,数据签名,数字证书的概念

九、Base64、对称加密算法、非对称加密算法、数据摘要的概念

十、Http与Https知识点详解

十一、基于TCP的Socket与基于UDP的Socket通信

十二、常见网络攻击手段与防护(重放攻击,中间人攻击,流量劫持)

十三、HttpClient,HttpUriConnection与Okhttp的区别

十四、Http 1.0,Http 1.1,Http 2.0,SPDY,Http 3.0的区别

十五、网络请求框架对比:AndroidAsync-httpClient,Volley,Okhttp,Retrofit

十六、Bio,Nio,Aio的区别

十七、网络性能优化

十八、扩展阅读


七、网络数据传输类型的处理(文字,图片,音频流,视频流,文件)

第一种:文字类型(XML、JSON、Protobuf)

概念:什么是 XML?

XML 指可扩展标记语言(EXtensible Markup Language)

XML 是一种标记语言,很类似 HTML

XML 的设计宗旨是传输数据,而非显示数据

XML 标签没有被预定义。您需要自行定义标签。

XML 被设计为具有自我描述性。

XML 是 W3C 的推荐标准

附加:XML 被设计用来传输和存储数据。

XML文档内容如下:

 

   1

   Google maps

   1.0

 

 

    2

    chrome

    2.1

 

 

    3

    google play

    3.1

 

Android 提供了三种解析XML的方式:

第一种:SAX

介绍:SAX解析器是一种基于事件的解析器,事件驱动的流式解析方式是,从文件的开始顺序解析到文档的结束,不可暂停或倒退。

优点:解析速度快,占用内存少。非常适合在Android移动设备中使用。

缺点:不会记录标签的关系,而要让你的应用程序自己处理,这样就增加了你程序的负担。

工作原理:对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档 (document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

第二种:PULL

介绍:PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中返回的是数字,且我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。

优点:PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器,Android官方推荐开发者们使用Pull解析技术。

第三种:DOM

介绍:DOM,即对象文档模型,它是将整个XML文档载入内存(所以效率较低,不推荐使用),每一个节点当做一个对象,结合代码分析。

优点:由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。

缺点:但是对于特别大的文档,解析和加载整个文档将会很耗资源。 当然,如果XML文件的内容比较小,采用DOM是可行的。

工作原理:使用DOM对XML文件进行操作时,首先要解析文件,将文件分为独立的元素、属性和注释等,然后以节点树的形式在内存中对XML文件进行表示,就可以通过节点树访问文档的内容,并根据需要修改文档。

总结:DOM方式最直观和容易理解,但是只适合XML文档较小的时候使用,而SAX方式更适合在移动终端系统中使用,因为相比DOM占用内存少,适合处理比较大的XML文档,最后的Pull方式使用场合和SAX类似,但是更适合需要提前结束XML文档解析的场合。


JSON数据格式:

概念:JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

JSON 语法规则:在 JS 语言中,一切都是对象。因此,任何支持的类型都可以通过JSON 来表示,例如字符串、数字、对象、数组等。

常见数据类型:

{

"people":[

{

"firstName": "Brett",

"lastName":"McLaughlin"      

},

{

"firstName":"Jason",

"lastName":"Hunter"

}

]

}

解析json数据的开源框架:

1、Gson(https://github.com/google/gson)

2、fastjson(https://github.com/alibaba/fastjson)


Protobuf:是一种灵活高效可序列化的数据协议,相于XML,具有更快、更简单、更轻量级等特性。支持多种语言,只需定义好数据结构,利用Protobuf框架生成源代码,就可很轻松地实现数据结构的序列化和反序列化。一旦需求有变,可以更新数据结构,而不会影响已部署程序。(谷歌推出)

优点:Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。

Protocol Buffer总结:

Android网络请求框架汇总:

备注:RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。

       后续会详细区分不同框架的区别,这里简单看下图就好。


第二种:图片类型(webP、jpeg、png,git动态图)

框架一:Universal-Image-Loader

优点:

1、支持下载进度监听;

2、可以在 View 滚动中暂停图片加载;

3、默认实现多种内存缓存算法这几个图片缓存都可以配置缓存算法,不过 ImageLoader 默认实现了较多缓存算法,如 Size 最大先删除、使用最少先删除、最近最少使用、先进先删除、时间最长先删除等;

4、支持本地缓存文件名规则定义;

缺点:

1、不支持GIF图片加载,缓存机制没有和http的缓存很好的结合,完全是自己的一套缓存机制。


框架二:Picasso

优点:

1、自带统计监控功能,支持图片缓存使用的监控,包括缓存命中率、已使用内存大小、节省的流量等。

2、支持优先级处理

3、支持延迟到图片尺寸计算完成加载

4、支持飞行模式、并发线程数根据网络类型而变,手机切换到飞行模式或网络类型变换时会自动调整线程池最大并发数。

5、“无”本地缓存。Picasso 自己没有实现本地缓存,而由okhttp 去实现,这样的好处是可以通过请求 Response Header 中的 Cache-Control 及 Expired 控制图片的过期时间。

缺点:

1、不支持GIF,默认使用ARGB_8888格式缓存图片,缓存体积大。


框架三:Glide(官方推荐)

优点:

1、图片缓存->媒体缓存 ,支持 Gif、WebP、缩略图。甚至是 Video。

2、支持优先级处理

3、与 Activity/Fragment 生命周期一致,支持 trimMemory

4、支持 okhttp、Volley。Glide 默认通过 UrlConnection 获取数据,可以配合 okhttp 或是 Volley 使用。实际 ImageLoader、Picasso 也都支持 okhttp、Volley。

5、内存友好,内存缓存更小图片,图片默认使用默认 RGB565 而不是 ARGB888

缺点:

1、清晰度差。


框架四:Fresco

优点:

1、图片存储在安卓系统的匿名共享内存,而不是虚拟机的堆内存中,所以不会因为图片加载而导致oom,同时也减少垃圾回收器频繁调用回收Bitmap导致的界面卡顿,性能更高。

2、渐进式加载JPEG图片, 支持图片从模糊到清晰加载。

3、图片可以以任意的中心点显示在ImageView, 而不仅仅是图片的中心。

4、JPEG图片改变大小也是在native进行的, 不是在虚拟机的堆内存, 同样减少OOM。

5、很好的支持GIF图片的显示。

缺点:

6、框架较大, 影响Apk体积,使用较繁琐


第三种:音频流与视频流

一个实时音视频应用共包括几个环节:

        播放声音可以使用 MediaPlayer 和 AudioTrack,两者都提供 Java API 给应用开发者使用。两者的差别在于:MediaPlayer 可以播放多种格式的音源,如 mp3、flac、wma、ogg、wav 等,而 AudioTrack 只能播放解码后的 PCM 数据流。从上面 Android 音频系统架构图来看:MediaPlayer 在 Native 层会创建对应的音频解码器和一个 AudioTrack,解码后的数据交由 AudioTrack 输出。所以 MediaPlayer 的应用场景更广,一般情况下使用它也更方便;只有一些对声音时延要求非常苛刻的应用场景才需要用到 AudioTrack。

AudioTrack 播放音频时会有两种方式:

1、MODE_STATIC:应用进程将回放数据一次性付给 AudioTrack,适用于数据量小、时延要求高的场景

2、MODE_STREAM:用进程需要持续调用 write() 写数据到 FIFO,写数据时有可能遭遇阻塞(等待 AudioFlinger::PlaybackThread 消费之前的数据),基本适用所有的音频场景。

视频流:

       视频编解码的作用:就是在设备的摄像头采集画面和前处理后,将图像进行压缩,进行数字编码,用于传输。编解码器的优劣基本在于:压缩效率的高低,速度和功耗。

       主流的视频编码器分为3个系列:VPx(VP8,VP9),H.26x(H.264,H.265),AVS(AVS1.0,AVS2.0)。VPx系列是由Google开源的视频编解码标准。在保证相同质量情况下,VP9相比VP8码率减少约50%。H.26x系列在硬件支持上比较广泛,H.265的编码效率能比上一代提高了30-50%,但是复杂度和功耗会比上一代大很多,所以纯软件编码实现的话有一定瓶颈,现有的技术下,还是需要依靠硬件编解码为主。

开源项目:

1、Vitamio:https://github.com/yixia/VitamioBundle(视频播放框架)

2、JieCaoVideoPlayer:https://github.com/lipangit/JieCaoVideoPlayer(播放器控件)

3、GSYVideoPlayer:https://github.com/CarGuo/GSYVideoPlayer(播放器控件)


第四种:文件类型

单线程下载:(系统默认)

Android中的文件下载——DownLoadManager

多线程下载:

FileDownloader:https://github.com/lingochamp/FileDownloader


八、数据指纹,数据签名,数据证书的概念

数据指纹:采用某种摘要算法,将明文转化为固定长度的字符,摘要也被称为指纹,相同的文件内容和文件名具有相同的指纹。

数据签名:就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明,数字签名是非对称密钥加密技术与数字摘要技术的应用。

使用:对非对称加密技术与数字摘要技术的综合运用,将信息先用摘要算法生成摘要信息,然后用私钥加密,然后将密文和原文一起发送,然后接受方用公钥获得摘要信息,使用相同的摘要算法对原文产生摘要,然后对比两者,如果相同说明内容是完整的。

数字签名的作用:

1、保证信息是由签名者自己签名发送的,签名者不能否认或难以否认。

2、接收方可以验证信息自签发后到收到为止未曾做过任何修改,签发的文件是真实文件。

数字证书:数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在Internet上验证通信实体身份的方式,数字证书不是数字身份证,而是身份认证机构盖在数字身份证上的一个章或印(或者说加在数字身份证上的一个签名)。它是由权威机构——CA机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。

使用:以数字证书为核心的加密技术(加密传输、数字签名、数字信封等安全技术)可以对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的机密性、完整性及交易的不可抵赖性。使用了数字证书,即使您发送的信息在网上被他人截获,甚至您丢失了个人的账户、密码等信息,仍可以保证您的账户、资金安全。

数据证书的组成:

1、证书的发布机构(Issuer)

2、证书的有效期(Validity)

3、消息发送方的公钥

4、证书所有者(Subject)

作用:主要是用来解决公钥的安全发放问题,也称为电子证书,类似于日常生活中的身份证,也是一种形式的身份认证,用于标识网络中的用户身份。

如何验证证书的合法性?

CA认证中心:CA认证中心是负责签发,管理,认证数字证书的机构,是基于国际互联网平台建立的一个公正,权威,可信赖的第三方组织机构。

验证方法:

       既然是合法性的问题,服务器和客户端俩个当事人谁说了都不算,由数字证书认证机构(CA,Certificate Authority)和其相关机构颁发的公开密钥证书说了算。

       证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名;

签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA 的私钥对信息摘要进行加密,密文即签名;

       客户端在对服务器say hello之后,服务器将公开密钥证书发送给客户端,注意这个证书里面包含了公钥+各种信息+签名(私钥对各种信息加密后生成签名),客户端收到公开密钥证书后,相当于收到了一个包裹里面有公钥+各种信息+签名,那么怎么样使用这三个数据来校验呢,很简单,公钥加密,私钥解密,私钥加密公钥也可以解,只要利用公钥对签名进行解密,然后就和各种信息做比较就可以校验出证书的合法性。

解决问题:(SSL/TLS协议运行机制)

1、所有信息都是加密传播,第三方无法窃听。

2、具有校验机制,一旦被篡改,通信双方会立刻发现。

3、配备身份证书,防止身份被冒充。


九、Base64、对称加密算法、非对称加密算法、数据摘要的概念

Base64:由于某些系统中只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法,而且base64特别适合在http,mime协议下快速传输数据。(数据兼容)

对称加密算法:数据发送方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,生成复杂的加密密文进行发送,数据接收方收到密文后,若想读取原文,则需要使用加密使用的密钥及相同算法的逆算法对加密的密文进行解密,才能使其恢复成可读明文加密和解密的密钥相同,前提是双方都知道密钥。

图解:

常见对称加密算法:

AES:强安全性、高性能、高效率、易用和灵活等优点,设计有三个密钥长度:128,192,256位,比DES算法的加密强度更高,更为安全。

DES,3DES:明文按64位进行分组,密钥长64位,但事实上只有56位参与,原版DES容易被暴力破解,演变出了3DES算法,使用3条56位的密钥对数据进行三次加密。

RC4:是密钥长度可变的流加密算法簇。RC4算法是一种在电子信息领域加密的技术手段,用于无线通信网络,是一种电子密码,只有经过授权(缴纳相应费用)的用户才能享受该服务。

对称加密算法对比:

非对称加密算法:非对称加密算法本身是一种加密算法,但由于RSA本身加解密的性能在现在的计算机硬件条件下存在一定瓶颈,同时对加密数据的“安全长度”也有限制,被加密数据的长度一般要求不超过公钥的长度。所以RSA更多的是被用来商量一个密钥,如果密钥是安全的,那么后续的通信都可以使用上面提到的AES来完成,AES在性能上不存在瓶颈。

使用:公钥与私钥需要配对使用,如果用公钥对数据进行加密,只有用对应的私钥才能进行解密,而如果使用私钥对数据进行加密,那么只有用对应的公钥才能进行解密。甲方将公钥公开,乙方使用甲方的公钥对信息加密,甲方再用私钥解密。

图解:

RSA:基于一个十分简单的数论事实:将两个大素数相乘十分容易,但反过来想要对其乘积进行因式分解却极其困难, 因此可以将乘积公开作为加密密钥。

使用:因为RSA算法是目前最流行的公开密钥算法,既能用于加密,也能用户数字签名。不仅在加密货币领域使用,在传统互联网领域的应用也很广泛。从被提出到现在20多年,经历了各种考验,被普遍认为是目前最优秀的公钥方案之一。比特币所使用的Sha256算法,也是在其基础之上建立的。

DSA:是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。RSA算法却做不到。

ECC:RSA有另一个竞争者ECC,ECC现在使用也越来越广泛。二者在安全性上都不存在问题。不过ECC额外的优势,公钥私钥的生成速度快于RSA,在需要大量生产密钥对的业务场景下ECC会是更好的选择。ECC的最短安全公钥也比RSA要短的多,224bits的ECC公钥就已经足够安全,而同等级别的RSA公钥需要长达2048bits。RSA由于实现简单,出现较早,可以预见在很长一段时间内都将和ECC共存。


十、Http与Https知识点详解

Http请求报文:

描述:一个HTTP请求报文由四个部分组成:请求行、请求头部、空行、请求数据。

图解:

请求行:请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。比如 GET /data/info.html HTTP/1.1。

请求头部:HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者 POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说 Content-Length必须出现。

空行:它的作用是通过一个空行,告诉服务器请求头部到此为止。

请求数据:若方法字段是GET,则此项为空,没有数据,若方法字段是POST,则通常来说此处放置的就是要提交的数据,比如:要使用POST方法提交一个表单,其中有user字段中数据为“admin”, password字段为123456,那么这里的请求数据就是 user=admin&password=123456,使用&来连接各个字段。


Http响应报文:

图解:

响应行:响应行一般由协议版本、状态码及其描述组成 比如 HTTP/1.1 200 OK。

其中协议版本HTTP/1.1或者HTTP/1.0,200就是它的状态码,OK则为它的描述。

常见状态码:

100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。

200~299:表示成功接收请求并已完成整个处理过程。常用200

300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(意味着你请求我,我让你去找别人),307和304(我不给你这个资源,自己拿缓存)

400~499:客户端的请求有错误,常用404(意味着你请求的资源在web服务器中没有)403(服务器拒绝访问,权限不够)

500~599:服务器端出现错误,常用500

响应头:用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。

       设置HTTP响应头往往和状态码结合起来。例如,有好几个表示“文档位置已经改变”的状态代码都伴随着一个Location头,而401(Unauthorized)状态代码则必须伴随一个WWW-Authenticate头。然而,即使在没有设置特殊含义的状态代码时,指定应答头也是很有用的。

响应体:响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类,在Android开发中,常常分为三个部分:ResultMessage,ResultCode,data。


HTTPS详解

描述:HTTPS是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。


Http与Https的区别:

1、https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。

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

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

4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全(HTTPS其实是有两部分组成:HTTP + SSL / TLS)


Https流程图:

流程图步骤详解:

步骤一:客户端发起一个https的请求,把自身支持的一系列Cipher Suite(密钥算法套件,简称Cipher)发送给服务端。

步骤二:服务端,接收到客户端所有的Cipher后与自身支持的对比,如果不支持则连接断开,反之则会从中选出一种加密算法和HASH算法,以证书的形式返回给客户端,证书中还包含了公钥 颁证机构 网址 失效日期等等。

步骤三:客户端收到服务端响应后会做以下几件事。

3.1、验证证书的合法性   

    颁发证书的机构是否合法与是否过期,证书中包含的网站地址是否与正在访问的地址一致等,证书验证通过后,在浏览器的地址栏会加上一把小锁(每家浏览器验证通过后的提示不一样 不做讨论)

3.2、生成随机密码

         如果证书验证通过,或者用户接受了不授信的证书,此时浏览器会生成一串随机数,然后用证书中的公钥加密。

3.3、HASH握手信息

        用最开始约定好的HASH方式,把握手消息取HASH值,然后用随机数加密 “握手消息+握手消息HASH值(签名)” 并一起发送给服务端

        在这里之所以要取握手消息的HASH值,主要是把握手消息做一个签名,用于验证握手消息在传输过程中没有被篡改过。

步骤四:服务端拿到客户端传来的密文,用自己的私钥来解密握手消息取出随机数密码,再用随机数密码解密握手消息与HASH值,并与传过来的HASH值做对比确认是否一致,然后用随机密码加密一段握手消息(握手消息+握手消息的HASH值 )给客户端

步骤五:客户端用随机数解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。

        因为这串密钥只有客户端和服务端知道,所以即使中间请求被拦截也是没法解密数据的,以此保证了通信的安全。 

附加:

1、非对称加密算法:RSA,DSA/DSS,在客户端与服务端相互验证的过程中用的是非对称加密。

2、对称加密算法:AES,RC4,3DES,客户端与服务端相互验证通过后,以随机数作为密钥时,就是对称加密。

3、HASH算法:MD5,SHA1,SHA256,在确认握手消息没有被篡改时。

开源框架:https://github.com/hongyangAndroid/okhttputils


十一、基于TCP的Socket与基于UDP的Socket通信

描述:Android与服务器的通信方式主要有两种:

第一种:Http通信,第二种:Socket通信。两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。

       而Socket通信中基于TCP/IP协议的通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端向服务器发送请求。而UDP则是提供无连接的数据报服务,UDP在发送数据报前不需建立连接,不对数据报进行检查即可发送数据包。

什么是socket?

       Socket(套接字)是用来描述IP地址和端口,是通信链的句柄,应用程序可以通过Sokcet向网络发送请求或者应答网络请求,Socket是支持TCP/IP协议的网络通信的基本操作单元,是对网络通信过程中端点的抽象表示,包含了进行网络通信所必须的五种信息:连接所使用的协议,本地主机的IP地址,本地远程的协议端口,远地主机的IP地址以及远地的协议端口。

Socket通信模型:

Socket通信实现步骤解析:

Step 1:创建ServerSocket和Socket。

Step 2:打开连接到的Socket的输入/输出流。

Step 3:按照协议对Socket进行读/写操作。

Step 4:关闭输入输出流,以及Socket。


基于TCP的Socket编程:

发送:

Socket m_socket = new Socket();

m_socket.connect(new InetSocketAddress(rc_ip, TcpAgreementHelp.port_2), 2000);

OutputStream m_out = m_socket.getOutputStream();

m_out.write(SendMessageFormat.aboutConversation(704, rId, opType, 0));

m_out.flush();

接收:

static private ServerSocket server_socket_18022 = null;

//静态,只有一个实例,以后做后台重启的时候避免重复监听相同端口

static private Socket socket_18022 = null;

server_socket_18022 = new ServerSocket(port_1);

socket_18022 = server_socket_18022.accept();

InputStream in = socket_18022.getInputStream();

byte[] headByte = new byte[20];   

//保证先把数据头给接下来,所以其他终端的数据头一定要同一个数据包发,或者这里强行接收20个字节。      

in.read(headByte);

基于UDP的编程:

hostSocket = new DatagramSocket();

sendPacket = new DatagramPacket(SendMessageFormat.arpData(rId,0), 21, broadIp, UDP_PORT_DISCOVER);

hostSocket.setBroadcast(true);    //这是用于发送广播用的

hostSocket.send(sendPacket);

hostSocket.close();

hostSocket = null;


TCP和UDP最大的区别:

描述:区别在于是否需要客户端与服务端建立连接后才能进行数据传输。

TCP:传输前先开服务端,accept,等客户端接入,然后获得客户端socket然后进行IO操作,而UDP则不用。

UDP:以数据报作为数据的传输载体,在进行传输时首先要把传输的数据定义成数据报(Datagram),在数据报中指明数据要到达的Socket(主机地址 和端口号),然后再将数据以数据报的形式发送出去。

Socket图例:

客户端与服务器socket图解:

问题:Socket通信是否属于TCP/IP协议族,Socket通信相关知识点与常见使用场景?

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

        是一种抽象层,应用程序通过它来发送和接收数据,使用Socket可以将应用程序添加到网络中,与处于同一网络中的其他应用程序进行通信。简单来说,Socket提供了程序内部与外界通信的端口并为通信双方的提供了数据传输通道。

        那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信。通过建立socket连接,可为通信双方的数据传输传提供通道。socket的主要特点有数据丢失率低,使用简单且易于移植。

        今天这篇文章就先说这么多,后续还有一篇文章在把剩余的内容给补充上。


十八:扩展阅读

1、https://www.cnblogs.com/guolingyun/p/6148462.html

(Android中XML的三种解析方式)

2、https://blog.csdn.net/langtop/article/details/77972855

(HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比,如何选择)

3、https://www.cnblogs.com/index-html/p/traffic-hijack.html(流量劫持是如何产生的)

4、https://server.zzidc.com/fwqcjwt/2557.html(如何防止中间人攻击)

5、https://blog.csdn.net/sd19871122/article/details/79399441(Android4种网络连接

方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比)

6、https://www.cnblogs.com/heluan/p/8620312.html(HTTP1.0、HTTP1.1和HTTP2.0的区别)

7、https://www.jianshu.com/p/bb3eeb36b479(QUIC协议浅析与HTTP/3.0)

8、https://www.cnblogs.com/chenjinxinlove/p/10104854.html(HTTP3.0(QUIC的实现机制))

9、https://www.jianshu.com/p/050c6db5af5a(Android开源:主流网络请求库对比(Android-Async-Http、Volley、OkHttp、Retrofit))

10、https://blog.csdn.net/u014756827/article/details/78870365(BIO与NIO、AIO的区别(这个容易理解))

11、https://github.com/jeanboydev/Android-ReadTheFuckingSourceCode/blob/master/article/android/performance/05_network.md(网络性能优化那些事)

12、https://blog.csdn.net/qq_41727218/article/details/82461089(IP协议详解)

你可能感兴趣的:(网络通信相关知识详解(二))