网络编程 硬核知识点(1)
前言
android开发,只要你要向网络请求数据,那就绕不开网络编程,这部分其实有一些知识点是硬核,必须掌握的,如果概念模糊,那么像是OKHttp原理,基础socket编程,HTTPS原理这些高深的知识便不可能掌握得很牢靠.
但是,越是基础知识,学起来就越枯燥,这才是真正的
干
货,看完就忘的干
货....
可有些公司面试还是会问,怎么办?
用有趣生动形象
的记忆方式来记住核心知识
,然后在用到的时候自己去发散思考
,便能回答地八九不离十.
干货列表
OSI七层模型 以及 TCP/IP四层模型
TCP建立连接三次握手
TCP断开连接四次挥手
干货
OSI七层模型 以及 TCP/IP四层模型
先来一个比较僵硬的说法:
OSI是Open System Interconnection的缩写,意为开放式系统互联。[国际标准化组织](ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。OSI模型把[网络通信]的工作分为7层,分别是[物理层]、[数据链路层]、网络层、[传输层]、[会话层]、[表示层]和[应用层]
WHAT? OSI ? ISO?
什么玩意,七层?记不住啊亲。
其实,只要知道,OSI是大佬们制定的规则就行了,大佬们在发明网络之后,制定一个基本准则,那就是OSI七层模型,那只是一个准则而已,后人会不会完全按照这个准则,不一定。
那这个7层怎么去记?其实也简单,说上去是七层,但是还是有一定规律的。
我们知道,网络传输,离不开两个概念,软件和硬件,如果把这7层按照软硬件来划分,那就是下面这张图:
解读这张图:
OSI
七层模型,从软件到硬件,其实就三个大方面,软件
-软硬件中介
-硬件
,
软件层
从上到下,应用层,表示层,会话层,三者的作用分别是:
应用层
是提供最终的网络服务,是离用户最近的一层,那么,它这一层的规则,就必须是比较人性化的规则,但是人和机器的理解是不同的,人的规则要让机器明白,必须转化,于是就出现了表示层
用来解析 应用层的规则。 而建立了规则是不够的,网络是不是连接成功,什么时候断了,得告诉用户,于是会话层
出现了.
软硬件的中介
:不必多说,软件硬件中间是有隔阂的,需要中间人传话。
硬件层
:当网络数据到了硬件层,下一步就是通过硬件设备去传输。路由器
,交换机
,调制解调器
,都是平时很熟悉的网络设备,分别对应网络层
,数据链路层
,物理层
。
如果有人对HTTP,TCP,IP
三者之间的关系没有概念,相信这张图很清晰了。
三者分别处于 不同的层级,分别是
应用层
,传输层
和网络互联层
,加上最后的主机到网络层
,就组成了TCP/IP的四层模型。
TCP建立连接三次握手
这一块经关键的2个问题:
1.TCP/IP建立连接时的三次握手,每一次都做了什么事情。
2.为什么是三次,不是2次或者4次。
回答第1个问题:三次握手,每一次都做了什么事情?
三次握手.png
答:TCP/IP
是基于CS
架构的,
就好比你想撩你的女神?你是客户端,女神是服务端
第一次握手:你对女神发微信:在吗?
第二次握手,女神回复你,嗯..
第三次握手,你再给女神发:周末有时间吗?
就像上面这样,一次完整的连接需要3个步骤,第一次看看女神在不在线,第二次,女神告诉你她在线,第三次,你才能向女神提要求。
就这么简单?当然不是,上面只是比喻,下面的才是完整版:
完整版解读如下:
起初,客户端服务端的连接都处于关闭状态,
流程开始,(图中的大写单词SYN
,ACK
都是信号值,小写seq ack
都是序列号 )
1、客户端主动撩拨服务端,发送SYN
和随机的seq
过去(SYN是同步序列信号,seq是客户端生成的随机序列,注:这个序列号不能是固定的,假定这个值是固定的,那么在多次网络请求中,服务端就无法区分是哪一次客户端发来的请求
)
2、服务器收到了客户端的SYN和seq之后, 就会给客户端回复应答,SYN设置为1,ACK设置为1,然后携带服务端的随机序列seq
,还有回应的ack
值 为客户端seq+1(ack是响应序列,响应序列的值设定为客户端seq+1,是为了表示,这一次服务端的回应,是针对客户端的序列为seq的这次请求
),此时,客户端已经是处于established
状态,表示已连接。
3、这个时候,客户端才确认服务端已经打开,那么 将ACK
标志位 置为1,seq
值置为服务端传过来的ack
的值,ack
值 置为 上一步服务端给的seq
值+1,再回给服务端。服务端收到之后,也变成established
状态,已连接。
走完这三步,客户端才正式给服务端发数据。
第二个问题:为什么是三次?
大前提:TCP协议是全双工的,也就是说,客户端向服务器发数据的同时,服务器也可以给客户端发数据。
答:三次握手,主要是在交换双方的ISN初始序列号
(概念:由于网络上传输数据,数据包可能很大,需要分段传输,这个ISN的值就是表示数据头的序列值,举个例子,客户端要向服务端发长度为1000的数据,分10次发,那么第一次就是0-99,开始的ISN序列就是0,下一次开始的ISN序列就是100,TCP是传输层协议,这里存在一个缓冲区,网络传输本身是不可靠的,不能保证先发的一定会先到,只有当接收的数据完整以后,数据才会规整,然后传给上面的应用层 )。如果只是两次握手,只有客户端告知服务端自己的ISN的话,只能确保客户端向服务端发送数据的可靠性,。如果是四次的话,其中一次ISN交换,可以与前面的第二次握手放在一起传递。
TCP断开连接四次挥手
建立连接需要三次握手,并且建立连接的发起者都是客户端,但是断开连接的时候,发起者就不一定了。双方都有权利要求
分手
.
下面以客户端要求分手为例:
看看四次挥手每一次都做了什么事:
第一次:客户端向服务端发送请求释放连接
请求
第二次:服务端收到客户端的请求释放连接
请求之后,回复:我同意你的释放连接请求
第三次:服务端发送请求释放连接
第四次:客户端收到服务端的请求释放连接
之后,回复: 我同意你的释放连接请求
在客户端发了最后一次挥手之后,等待两个MSL(最大报文生存时间),还没有收到服务端的回复,说明连接已经断开,这时候才关闭客户端连接。
结语
作为android开发,以上知识,精通很难,但是不能一脸懵逼一无所知。