网络编程 硬核知识点(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个问题:三次握手,每一次都做了什么事情?
答: TCP/IP是基于CS架构的,
就好比你想撩你的女神?你是客户端,女神是服务端
第一次握手:你对女神发微信:在吗?
第二次握手,女神回复你,嗯..
第三次握手,你再给女神发:周末有时间吗?

就像上面这样,一次完整的连接需要3个步骤,第一次看看女神在不在线,第二次,女神告诉你她在线,第三次,你才能向女神提要求。
就这么简单?当然不是,上面只是比喻,下面的才是完整版:

三次握手.png

完整版解读如下:
起初,客户端服务端的连接都处于关闭状态,
流程开始,(图中的大写单词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开发,以上知识,精通很难,但是不能一脸懵逼一无所知。


你可能感兴趣的:(网络编程 硬核知识点(1))