【2023大厂面试】网络和安全机制 含 参考答案

1.网络框架对比和源码分析

blog.csdn.net/github_3713…

Volley

特点:

  • 基于 HttpURLConnection
  • 封装Url图片加载框架,支持图片加载
  • 有缓存
  • Activity和生命周期的联动,Activity结束时取消在此Activity中调用的所有网络请求

场景:

  • 适合传输量小,数据请求频繁的的场景
  • 不能进行大量数据操作,如上传下载,因为Volley的Request和Response放到byte[]中

OkHttp

特点:

  • 基于 NIO 和 Okio,请求处理速度更快
  • IO 是阻塞式;NIO是非阻塞式;Okio (Square)基于二者的更高效的数据流库

IO 面向流 Steam,NIO 面向缓冲区 Buffer IO 阻塞,NIO 非阻塞

NIO情况下,一个线程可以处理多个通道的读取和写入,更充分的利用线程资源。

适用场景

  • IO适合于链接数量不大,但是每个链接需要发送/接收的数据量很大,需要长时间连续处理;

  • NIO更适合于同时存在海量链接,但是每个链接单次发送/接收的数据量较小的情形.比如聊天服务器.海量链接但是单个链接单次数据较小

“Accept-Encoding”,“gzip” “Content-Encoding”,“gzip”

Content-Encoding: gzip:表明body是gzip过的数据
Content-Length:117:表示body gzip压缩后的数据大小,便于客户端使用。
Transfer-Encoding: chunked:分块传输编码

Retrofit

特点:

  • 基于OkHttp
  • 通过注解配置请求
  • 性能最好,处理最快
  • 解析数据需要使用统一的Convert
  • 易与其他框架RxJava联合使用

场景:

  • 优先使用,项目中由 RxJava ,后台 API 遵循 Restful 风格

2.自己去设计网络请求框架,怎么做?

github.com/sucese/andr…

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .build();
Request request = new Request.Builder()
        .url(url)
        .build();
okHttpClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {

    }
});

  • 网络配置层 重定向 Header拼接层 Http缓存层 链接层 数据响应层
  • OkHttpClient Call Request RequsetBody Response ResponseBody Interceptor StreamAllocation RouteSelector RouteDatabase

Dispatcher是一个任务调度器,它内部维护了三个双端队列:

readyAsyncCalls:准备运行的异步请求
runningAsyncCalls:正在运行的异步请求
runningSyncCalls:正在运行的同步请求

Interceptor将网络请求、缓存、透明压缩等功能统一了起来,它的实现采用责任链模式,各司其职, 每个功能都是一个Interceptor,上一级处理完成以后传递给下一级,它们最后连接成了一个Interceptor.Chain。它们的功能如下:

RetryAndFollowUpInterceptor:负责重定向。
BridgeInterceptor:负责把用户构造的请求转换为发送给服务器的请求,把服务器返回的响应转换为对用户友好的响应。
CacheInterceptor:负责读取缓存以及更新缓存。
ConnectInterceptor:负责与服务器建立连接。
CallServerInterceptor:负责从服务器读取响应的数据。

BridgeInterceptor方法主要是针对Header做了一些处理,这里主要提一下"Accept-Encoding", “gzip”,关于它有以下几点需要注意:

开发者没有添加Accept-Encoding时,自动添加Accept-Encoding: gzip
自动添加Accept-Encoding,会对request,response进行自动解压
手动添加Accept-Encoding,不负责解压缩
自动解压时移除Content-Length,所以上层Java代码想要contentLength时为-1
自动解压时移除Content-Encoding
自动解压时,如果是分块传输编码,Transfer-Encoding: chunked不受影响。

CacheInterceptor

读取候选缓存,具体如何读取的我们下面会讲。
创建缓存策略,强制缓存、对比缓存等,关于缓存策略我们下面也会讲。
根据策略,不使用网络,又没有缓存的直接报错,并返回错误码504。
根据策略,不使用网络,有缓存的直接返回。
前面两个都没有返回,继续执行下一个Interceptor,即ConnectInterceptor。
接收到网络结果,如果响应code式304,则使用缓存,返回缓存结果。
读取网络结果。
对数据进行缓存。
返回网络读取的结果。

ConnectInterceptor用来完成连接。而真正的连接在RealConnect中实现,连接由连接池ConnectPool来管理,连接池最多保 持5个地址的连接keep-alive,每个keep-alive时长为5分钟,并有异步线程清理无效的连接。

整个流程如下:

查找是否有完整的连接可用:
    Socket没有关闭
    输入流没有关闭
    输出流没有关闭
    Http2连接没有关闭
连接池中是否有可用的连接,如果有则可用。
如果没有可用连接,则自己创建一个。
开始TCP连接以及TLS握手操作。
将新创建的连接加入连接池。

cleanup()整个方法的流程如下所示:

查询此连接内部的StreanAllocation的引用数量。
标记空闲连接。
如果空闲连接超过5个或者keepalive时间大于5分钟,则将该连接清理掉。
返回此连接的到期时间,供下次进行清理。
全部都是活跃连接,5分钟时候再进行清理。
没有任何连接,跳出循环。
关闭连接,返回时间0,立即再次进行清理。

Expires Http 1.0 绝对过期时间

Cache-Control Http 1.1 相对过期时间

If-Modified-Since 请求 header

Last-Modified 响应 header 作为下次的 If-Modified-Since

If-None-Match 请求 header

ETag 响应 header 作为下次的 If-None-Match

3.网络请求缓存处理,okhttp如何处理网络缓存的

CacheInterceptor

OKHttp3(支持Retrofit)的网络数据缓存Interceptor拦截器

读取候选缓存,具体如何读取的我们下面会讲。
创建缓存策略,强制缓存、对比缓存等,关于缓存策略我们下面也会讲。
根据策略,不使用网络,又没有缓存的直接报错,并返回错误码504。
根据策略,不使用网络,有缓存的直接返回。
前面两个都没有返回,继续执行下一个Interceptor,即ConnectInterceptor。
接收到网络结果,如果响应code式304,则使用缓存,返回缓存结果。
读取网络结果。
对数据进行缓存。
返回网络读取的结果。

4.从网络加载一个10M的图片,说下注意事项

blog.csdn.net/github_3713…

Bitmap.Options inJustDecodeBounds inSampleSize

ARGB_4444 RGB_565

补图

分块加载

使用LruCache

sizeOf()、entryRemoved()

手势处理

ScaleGestureDetector GestureDetector

前者用于处理缩放手势,后者用于处理其余手势,如移动,快速滑动,点击,双击,长按等。

ScaleGestureDetector专门处理缩放手势,其比较重要的方法是onScale(ScaleGestureDetector detector),当缩放时会不停地回调这个方法,需要注意的一点是detector.getScaleFactor()获取到的缩放比例是相对上一次的

5.TCP的3次握手和四次挥手

blog.csdn.net/whuslei/art…

SYN–SYN ACK-ACK

SYN=1 seq=client_isn
SYN=1 seq=server_isn ack=client_isn+1
SYN=0 seq=client_isn+1 ack=server_isn+1

seq 为自身序列 ack 为对方序列+1

FIN–ACK–FIN-ACK

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

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

6.TCP与UDP的区别

blog.fundebug.com/2019/03/22/…

UDPTCP
是否连接无连接面向连接
是否可靠不可靠传输,不使用流量控制和拥塞控制可靠传输,使用流量控制和拥塞控制
连接对象个数支持一对一,一对多,多对一和多对多交互通信只能是一对一通信
传输方式面向报文面向字节流
首部开销首部开销小,仅8字节首部最小20字节,最大60字节
适用场景适用于实时应用(IP电话、视频会议、直播等)适用于要求可靠传输的应用,例如文件传输

7.TCP与UDP的应用

blog.csdn.net/leewccc/art… www.cnblogs.com/liangyc/p/1…

TCP Transmission Contral Protocol UDP User Datagram Protocol

www.cnblogs.com/liangyc/p/1…

区别

面向连接VS无连接

TCP建立一个连接需要3次握手IP数据包,断开连接需要4次握手。 另外断开连接时发起方可能进入TIME_WAIT状态长达数分钟(视系统设置,windows一般为120秒),在此状态下连接(端口)无法被释放。 UDP不需要建立连接,可以直接发起。

可靠VS不可靠

TCP利用握手、ACK和重传机制,udp没有。
1,校验和(校验数据是否损坏);
2,定时器(分组丢失则重传);
3,序列号(用于检测丢失的分组和重复的分组);
4,确认应答ACK(接收方告知发送方正确接收分组以及期望的下一个分组);
5,否定确认(接收方通知发送方未被正确接收的分组);
6,窗口和流水线(用于增加信道的吞吐量)。(窗口大小:无需等待确认应答而可以继续发送数据的最大值)

有序性

TCP利用seq序列号对包进行排序,udp没有。

面向字节流vs面向报文

面向报文
    面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。
    因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片。
    UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
    这也就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。(一个upd的最大报文长度2^16-1-20-8,20是ip报文头,8是udp报文头)
面向字节流
    面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。
    TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。
    如果应用程序一次只发送一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。

tcp有流量控制,udp没有

tcp的头部比20bytes,udp8byres

TCP应用场景:

效率要求相对低,但对准确性要求相对高的场景。因为传输中需要对数据确认、重发、排序等操作,相比之下效率没有UDP高。
举几个例子:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录。

UDP应用场景:

效率要求相对高,对准确性要求相对低的场景。
举几个例子:QQ聊天、在线视频、网络语音电话(即时通讯,速度要求高,但是出现偶尔断续不是太大问题,并且此处完全不可以使用重发机制)、广播通信(广播、多播)。

8.HTTP协议

hit-alibaba.github.io/interview/b…

juejin.cn/post/684490…

9.HTTP1.0与2.0的区别

juejin.cn/post/684490…

http 0.9 1991
http 1.0 1996
http 1.1 1999
http 2.0 2015

带宽:出视频应用以外,带宽基本不是问题

延迟: 浏览器阻塞 HOL Blocking DNS查询 DNS Lookup 建立连接 Initial Connection

Http1.0 & 1.1

缓存处理
    HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准
    HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match
    
带宽优化及网络连接的使用
    1.1 支持 range 206 Partial Content

错误通知的管理
    1.1 新增 24 个错误码,409 Conflict 410 Gone

Host头处理

长连接
    长连接 PersistentConnection
    流水线 Pipelining

2012 google SPDY

降低延迟 多路复用 multiplexing 通过多个请求stream共享一个tcp链接
请求优先级 request prioritization
header压缩
基于https的加密传输
服务端推送 server push

HTTP 2.0 性能惊人

http2.akamai.com/demo

大约 4 倍

HTTP2.0和SPDY的区别:

HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS

HTTP2.0 消息头的压缩算法采用 HPACK http://http2.github.io/http2-spec/compression.html,
而非 SPDY 采用的 DEFLATE http://zh.wikipedia.org/wiki/DEFLATE

10.HTTP报文结构

zhuanlan.zhihu.com/p/44938050

11.HTTP与HTTPS的区别以及如何实现安全性

blog.fundebug.com/2019/04/26/…

方法1. 对称加密

没有密钥就无法对密码解密,反过来说,任何人只要持有密钥就能解密了。

方法2. 非对称加密

私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。

方法3. 对称加密+非对称加密(HTTPS采用这种方式)

在交换密钥环节使用非对称加密方式,之后的建立通信交换报文阶段则使用对称加密方式。
发送密文的一方使用对方的公钥进行加密处理“对称的密钥”,然后对方用自己的私钥解密拿到“对称的密钥”,
这样可以确保交换的密钥是安全的前提下,使用对称加密方式进行通信。

12.如何验证证书的合法性?

yiqingfeng.github.io/2019/04/01/…

证书的安全性

  • 证书存在的目的就是避免中间人攻击,避免发生经典的传令兵问题
  • 由CA组织认可的根证书Root签发的
  • DV Digital Verification、OV Organization Verification、EV Extended Verification
  • 证书是需要预装的,特别是根证书。

证书的校验

  • 证书是否为值得信任的有效证书。是否为信任根(浏览器内置有信任的根证书)或信任根的二级证书机构颁发的。是否为信任根(浏览器内置有信任的根证书)或信任根的二级证书机构颁发的。
  • 对方是否持有证书对应的私钥。验证方式有两种:
    • 对方签名,浏览器用证书对签名进行验证。
    • 使用证书作为信封,判断对方是否能够解开。

校验证书是否已被吊销需要和 CA 关联,其他均可由浏览器完成。验证证书是否吊销可以采用CRL黑名单方式或者OCSP方式。

CRL黑名单就是定期从CA下载一个名单列表,里面有吊销的证书序列号,自己在本地比对一下就行。
优点是效率高。缺点是不实时。
OCSP是实时连接CA去验证,优点是实时,缺点是效率不高。

www.google.com 为例:

  • 浏览器发现协议为 https,握手拿到 google 的证书,先从系统(window)或浏览器内置(Firefox)检查证书链是否正确。
  • 如果验证失败则会拦截。
  • 浏览器尝试查CRL(证书吊销列表)和OCSP(在线证书检查)。 注意:
    • CA不会直接暴露到外网的,如果需要访问CA服务器需要使用硬件Token并且多人在场录像,且只能远程访问。OCSP相当于证书数据库的备份而已是直接暴露在外网的可以通过HTTP或者HTTPS访问。
    • OCSP是一种新技术。部分客户端可能不支持,仅支持 CRL。
  • 如果发现证书并没有被吊销或者过期则浏览器对EV证书会显示为绿色,对OV证书则是通过放行。否则弹出通知,该网站不可信。

检查流程:

  • 客户端发送信息,带上支持的SSL或者TLS版本(不同浏览器支持程* * 度不同)。
  • 服务器返回确认使用的加密通信协议版本以及加密随机数和CA证书。
  • 浏览器验证证书(存在双向验证和单项验证) -> OCSP或者CRL * 结合自带truststore。
  • 检查CA证书的根证书颁发机构是否受浏览器信任。
  • 检查CA证书中的证书吊销列表,检查证书是否被吊销。
  • 检查CA证书是否在有效期内。
  • 检查部署CA证书的网站域名与证书颁发的域名是否一致。
  • 浏览器核对该网站是否存在于欺诈网站数据库中。

13.https中哪里用了对称加密,哪里用了非对称加密,对加密法(如RSA)等是否有了解?

www.cnblogs.com/xishuai/p/h…

segmentfault.com/a/119000001…

DES Data Encryption Standard
3DES Triple DES
AES Advanced Encryption Standard

我国国密局也制定了自己的对称加密算法,叫国密算法,SM1(相当于AES),和SM4(相当于3DES)。

RSA RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。
DSA Digital Signture Algorithm
ECC Elliptic Curves Cryptography

MD5 Message-Digest 5 1992
SHA1 NISTNSA 设计,SHA-1是由美国标准技术局(NIST)颁布的国家标准,是一种应用最为广泛的Hash函数算法
HMAC Hash-based Message Authentication Code

AES加密算法的详细介绍与实现

AES的基本结构

AES为分组密码,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:

AES密钥长度(32位比特字)分组长度(32位比特字)加密轮数
AES-1284410
AES-1926412
AES-2568414

AES的加密公式为C = E(K,P)

一、字节代换

AES定义了一个S盒和一个逆S盒。
1.字节代换操作
2.字节代换逆操作

二、行移位

1.行移位操作 2.行移位的逆变换

三、列混合 1.列混合操作 2.列混合逆运算

四、轮密钥加

一文搞懂 RSA 算法

第一步:生成密钥对,即公钥和私钥

  • 两个随机质数 P Q,数越大越安全
比如 P = 67 ,Q = 71。计算他们的乘积 n = P * Q = 4757 ,转化为二进为 1001010010101,该加密算法即为 13 位,
实际算法是 1024 位 或 2048 位,位数越长,算法越难被破解。

  • 计算 n 的欧拉函数 φ(n)
φ(n) 表示在小于等于 n 的正整数之中,与 n 构成互质关系的数的个数。
例如:在 1 到 8 之中,与 8 形成互质关系的是1、3、5、7,所以 φ(n) = 4。 
如果 n = P * Q,P 与 Q 均为质数,则 φ(n) = φ(P * Q) = φ(P - 1)φ(Q - 1) = (P - 1)(Q - 1) 。 
本例中 φ(n) = 66 * 70 = 4620,这里记为 m, m = φ(n) = 4620

  • 随机选一个整数 e ,条件是 1 < e < m ,且 e 与 m 互质
公约数只有 1 的两个整数,叫做互质整数,这里我们随机选择 e = 101 
请注意不要选择 4619,如果选这个,则公钥和私钥将变得相同。

  • 有一个整数d,可以使得 e * d 除以 m 的余数为 1
即找一个整数 d,使得 (e * d ) % m = 1。 等价于 e * d + 1 = y * m ( y 为整数) 找到 d ,实质就是对下面二元一次方程求解。 
e * x - m * y = 1 ,其中 e = 101,m = 4620,101x - 4620y = 1 这个方程可以用"扩展欧几里得算法"求解,此处省略具体过程。

总之算出一组整数解(x,y) = (1601,35),即 d = 1601。 到此密钥对生成完毕。
不同的 e 生成不同的 d,因此可以生成多个密钥对。

本例中公钥为 (n,e) = (4757 , 101),私钥为 (n,d) = (4757 ,1601) ,仅 (n,e) = (4757 , 101) 是公开的,其余数字均不公开。
可以想像如果只有 n 和 e,如何推导出 d,目前只能靠暴力破解,位数越长,暴力破解的时间越长。

第二步:加密生成密文

比如甲向乙发送汉字“中”,就要使用乙的公钥加密汉字 "中", 以 utf-8 方式编码为 [e4 b8 ad],转为 10 进制为 [228,184,173]。
要想使用公钥(n,e) = (4757 , 101)加密,要求被加密的数字必须小于 n,被加密的数字必须是整数,字符串可以取 ascii 值或unicode值,
因此将“中”字折为三个字节 [228,184,173],分别对三个字节加密。 
假设 a 为明文,b 为密文,则按下列公式计算出 b

  • a ^ e % n = b

    计算 [228,184,173]的密文:

    228^101 % 4757 = 4296

    184^101 % 4757 = 2458

    173^101 % 4757 = 3263

    即 [228,184,173]加密后得到密文 [4296,2458,3263] ,如果没有私钥 d ,神仙也无法从 [4296,2458,3263]中恢复 [228,184,173]。

解密生成明文。

乙收到密文 [4296,2458,3263],并用自己的私钥 (n,d) = (4757 ,1601) 解密。解密公式如下: 假设 a 为明文,b 为密文,则按下列公式计算出 a

  • a ^ d % n = b

    密文 [4296,2458,3263]的明文如下:

    4296^1601% 4757 = 228

    2458^1601% 4757 = 184

    3263^1601% 4757 = 173

    即密文 [4296,2458,3263] 解密后得到 [228,184,173] 将[228,184,173] 再按 utf-8 解码为汉字 “中”,至此解密完毕。

目前已经破解的最大整数:

1230186684530117755130494958384962720772853569595334792197322452151726400507263657518745202199786469389956474942774063845925192557326303453731548268507917026122142913461670429214311602221240479274737794080665351419597459856902143413
=
33478071698956898786044169848212690817704794983713768568912431388982883793878002287614711652531743087737814467999489
x
36746043666799590428244633799627952632279158164343087642676032283815739666511279233373417143396810270092798736308917

即(232个十进制位,768个二进制位),目前被破解的最长RSA密钥就是768位。实际应用中 RSA 的密钥长度为 1024 位,重要场合 2048 位,未来半个世纪不可能破解。 (完)

漫画:什么是MD5算法?

MD5算法底层原理

处理原文,

原文长度(bit)对512求余的结果,如果不等于448,就需要填充原文到等于448。
填充的方法是第一位填充1,其余位填充0。

用剩余的位置(512-448=64位)记录原文的真正长度,把长度的二进制值补在最后。
这样处理后的信息长度就是512*(N+1)。

设置初始值,

MD5的哈希结果长度为128位,按每32位分成一组共4组。
这4组结果是由4个初始值A、B、C、D经过不断演变得到。
MD5的官方实现中,A、B、C、D的初始值如下(16进制):

A=0x01234567

B=0x89ABCDEF

C=0xFEDCBA98

D=0x76543210

循环加工,每一次循环都会让旧的ABCD产生新的ABCD,原文长度是M

主循环次数 = M / 512

每个主循环中包含 512 / 32 * 4 = 64 次 子循环。

这张图所表达的就是单次子循环的流程:

1.绿色F

图中的绿色F,代表非线性函数。官方MD5所用到的函数有四种:
F(X, Y, Z) =(X&Y) | ((~X) & Z)
G(X, Y, Z) =(X&Z) | (Y & (~Z))
H(X, Y, Z) =X^Y^Z
I(X, Y, Z)=Y^(X|(~Z))
在主循环下面64次子循环中,F、G、H、I 交替使用,第一个16次使用F,第二个16次使用G,第三个16次使用H,第四个16次使用I。

2.红色“田”字

很简单,红色的田字代表相加的意思。

4.Ki

一个常量,在64次子循环中,每一次用到的常量都是不同的。

拼接结果。

最终产生的A,B,C,D四个值拼接在一起,转换成字符串即可。

5.黄色的<<<S

左移S位,S的值也是常量。
“流水线”的最后,让计算的结果和B相加,取代原先的B。新ABCD的产生可以归纳为:

新A = 原d
新B = b+((a+F(b,c,d)+Mj+Ki)<<<'s)
新C = 原b
新D = 原c

www.cnblogs.com/foxclever/p…

juejin.cn/post/684490…

14.client如何确定自己发送的消息被server收到?

blog.csdn.net/github_3713…

增加 ack QoS

15.谈谈你对WebSocket的理解

blog.csdn.net/github_3713…

WebSocket 是类似 Socket 的 TCP 长连接的通讯模式,一旦 WebSocket 连接建立后,后续数据都以帧序列的形式传输。在客户端断开 WebSocket 连接或 Server 端断掉连接前,不需要客户端和服务端重新发起连接请求。

  1. WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息。HTTP是单向的。

  2. WebSocket是需要握手进行建立连接的。

16.WebSocket与Socket的区别

juejin.cn/post/684490…

为了解决 Web 端即时通讯的需求就出现了 WebSocket

WebSocket 与 Socket 的区别

Socket 是传输控制层的接口。用户可以通过 Socket 来操作底层 TCP/IP 协议族通信。
WebSocket 是一个完整应用层协议。
Socket 更灵活,WebSocket 更易用。
两者都能做即时通讯

www.jianshu.com/p/59b5594ff…

ARPANET(Advanced Research Projects Agency)

最早的时候一个Socket指的是一个40位的数字(RFC33中说明了此用法,但在RFC36中并没有明确地说使用40位数字来标识一个地址),其中前32为指向的地址(socket number,大致相当于IP),后8位为发送数据的源(link,大致相当于端口号)
后来(RFC433,Socket Number List)socket number被明确地定义为一个40位的数字,其中后8位被用来制定某个特定的应用使用(比如1是Telnet)。

Hixie(Ian Hickson),他是WHATWG组织的发言人,曾供职于Netscape、Opera、Google。Hixie说了一句「我看WebSocket这个名字就很适合嘛」。 mcarter(Michael Carter )在Comet Daily中发表了文章Independence Day: HTML5 WebSocket Liberates Comet From Hacks,后来随着各大浏览器对WebSocket的支持,它变成了实际的标准,IETF也沿用了这个名字

www.jianshu.com/p/0e5b94688…

Meteor

HTTP和WebSocket协议的RFC文档(RFC2616 和 RFC6455)

HTTP1.1的连接默认使用持续连接(persistent connection),持续连接指的是,有时是客户端会需要在短时间内向服务端请求大量的相关的资源,如果不是持续连接,那么每个资源都要建立一个新的连接,HTTP底层使用的是TCP,那么每次都要使用三次握手建立TCP连接,将造成极大的资源浪费。

持续连接可以带来很多的好处:

使用更少的TCP连接,对通信各方的压力更小。 可以使用管道(pipeline)来传输信息,这样请求方不需要等待结果就可以发送下一条信息,对于单个的TCP的使用更充分。 流量更小 顺序请求的延时更小。 不需要重新建立TCP连接就可以传送error,关闭连接等信息。

www.jianshu.com/p/f666da1b1…

GET /chat HTTP/1.1            //1
Host: server.example.com   //2
Upgrade: websocket            //3
Connection: Upgrade            //4
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==            //5
Origin: http://example.com            //6
Sec-WebSocket-Protocol: chat, superchat            //7
Sec-WebSocket-Version: 13            //8

帧类型 帧类型是由一个4位长的叫Opcode的值表示,任何WebSocket的通信方收到一个位置的帧类型,都要以连接失败的方式断开此连接。 RFC6455中定义的帧类型如下所示:

Opcode == 0 继续

表示此帧是一个继续帧,需要拼接在上一个收到的帧之后,来组成一个完整的消息。由于这种解析特性,非控制帧的发送和接收必须是相同的顺序。

Opcode == 1 文本帧

Opcode == 2 二进制帧

Opcode == 3 - 7 未来使用(非控制帧)

Opcode == 8 关闭连接(控制帧) 此帧可能会包含内容,以表示关闭连接的原因。 通信的某一方发送此帧来关闭WebSocket连接,收到此帧的一方如果之前没有发送此帧,则需要发送一个同样的关闭帧以确认关闭。如果双方同时发送此帧,则双方都需要发送回应的关闭帧。 理想情况服务端在确认WebSocket连接关闭后,关闭相应的TCP连接,而客户端需要等待服务端关闭此TCP连接,但客户端在某些情况下也可以关闭TCP连接。

Opcode == 9 Ping 类似于心跳,一方收到Ping,应当立即发送Pong作为响应。

Opcode == 10 Pong 如果通信一方并没有发送Ping,但是收到了Pong,并不要求它返回任何信息。Pong帧的内容应当和收到的Ping相同。可能会出现一方收到很多的Ping,但是只需要响应最近的那一次就可以了。

Opcode == 11 - 15 未来使用(控制帧)

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-------+-+-------------+-------------------------------+
 |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
 |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
 |N|V|V|V|       |S|             |   (if payload len==126/127)   |
 | |1|2|3|       |K|             |                               |
 +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
 |     Extended payload length continued, if payload len == 127  |
 + - - - - - - - - - - - - - - - +-------------------------------+
 |                               |Masking-key, if MASK set to 1  |
 +-------------------------------+-------------------------------+
 | Masking-key (continued)       |          Payload Data         |
 +-------------------------------- - - - - - - - - - - - - - - - +
 :                     Payload Data continued ...                :
 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
 |                     Payload Data continued ...                |
 +---------------------------------------------------------------+

www.cnblogs.com/jiangzhaowe…

17.谈谈你对安卓签名的理解

blog.csdn.net/github_3713…

www.jianshu.com/p/24af47abc…

  • Android 使用标准的 Java 工具 Keytool & Jarsigner 来生成数字证书,并给应用包签名
  • 使用 zipalign 优化程序

调试模式 debug.keystore 发布模式 release.keystore

1)通过命令来对APK签名。 2)使用ADT Export Wizard进行签名

18.请解释安卓为啥要加签名机制?

blog.csdn.net/github_3713…

为什么要签名

  • 发送者的身份认证:
  • 保证信息传输的完整性:
  • 防止交易中的抵赖发生:

给apk签名可以带来以下好处

  • 应用程序升级:
  • 应用程序模块化:
  • 代码或者数据共享:

签名的说明

  • 所有的应用程序都必须有数字证书:
  • Android 程序包使用的数字证书可以是自签名的:
  • 使用一个合适的私钥生成的数字证书来给程序签名:
  • 数字证书都是有有效期的:

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

朋友们如果有需要全套《网络安全入门+进阶学习资源包》,可以扫描下方二维码免费领取(如遇扫码问题,可以在评论区留言领取哦)~

网络安全面试题

绿盟护网行动

还有大家最喜欢的黑客技术

网络安全源码合集+工具包

所有资料共282G,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码免费领取(如遇扫码问题,可以在评论区留言领取哦)~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值