- TCP/IP协议族是什么?
- 他是一大堆网络分层模型,并不是tcp、ip这么两个东西。
为什么要分层呢?
- 网络为什么要分层?
- 看一下这个模型,从客户端到服务器可能会很多中间节点,这些节点之间可能绕来绕去的。
- 按照一个完美的、理想化的模型,我怎么传呢?
- 我只用http就够了。
- 比如我要传一个什么报文,一条路传过去。
- 那为什么要分层?分层,就是因为网络的不稳定。
- 假如我在传输的路上,某个节点坏掉了,而不是整个瘫痪了,比如传的过程中,某个节点的路由器被人给炸掉了,那么我这个消息是不是丢了?
- 接下来我需要把这个消息再发一次。通过别的路由器,比如通过下面的路由器传。
- 那么我怎么知道这个东西没有收到呢?我可能有超时什么的,我会知道这个消息他传送失败,那么我再传一次,然后成功了。
- 这是一种很常见的网络模型,不可能要求这个网络是绝对稳定的,比如停电了怎么办?网线插头被拔了怎么办?被踢掉了怎么办?
- 各种问题,不可能稳定,因为网络不可能稳定。重传这个事是一定会发生的。这是百分之百的。
- 但是提到重传就有另外一个问题了。我们的数据不一定是很小很小的。我要传一个大数据,我可能需要传很多次,可能我花了两秒钟才传完。
- 这只是一个例子,实际过程中会出现各种各样的问题。那么网络就会很差很差。网络利用性,网速什么的都会影响,就是因为我们的网络不够稳定,而且数据可能会比较大。
- 那就只有一个办法,那就是把你的东西切成块来传,本来你的东西很大是吧?我把他切成五块,然后这五快分别传,传起来就会比较方便。
传输层由来
- 比如我有一个数据叫abcdefghijklmnopqrst ,把他切成四块,然后做一个标记,这个时候我还是这么传,
- 假如分块传输:
- 我第一次传1,收到了,
- 第二次传2,收到了,
- 第三次传3,没收到,
- 第三次传4,收到了。
- 那么过一会我就会发现,怎么三号没给我回应啊?
- 那么我再传一次3吧,传过去了。
- 一共传了5次,大概多传了25%这么多。
- 如果我们把他们放到一起传
- 第一次可能直接失败,我再传一次,可能还会失败,
- 那么分块就会把这个问题解决了。这个是分块传输他的好处。那么由于有分块传输,我就需要分层了。
传输层作用
- 因为上层应用层协议并不只http自己,还有别的,还有传文件的ftp,发邮件的smtp,他们都有这种需求,都有这种需求,我们做编程就知道,怎么做?
- 把这个功能给抽出来,拿一个接口出来,抽出来一层,让这一层只做包的分发(紫色层)
- 然后每次发消息的时候,我不管是发什么消息,不管是发正常的,还是更长的,更短的,我都在应用层切成块,发给分发层
- 你把他帮我传过去,哪一块丢失了,紫色的这一层会帮我们再传一次。紫色的这一层就叫TCP,TCP叫传输层。
- 为什么我有http,还要拉一层来传呢?就是这个作用。他能够保证网络的稳定传输。
网络层的出现
- 讲了两层了,讲了TCP为什么还要分层呢?
- 你看我是分块的是吧?但是不是所有数据都需要重传的。
- 比如你打游戏,你玩吃鸡,他有什么特点呢?你玩的时候,我的网络卡了,忽然我动不了了,然后我在两秒钟之后才恢复,那么我在卡的过程中,我的数据别人看不到是吧,发送方可能也知道数据没收到,但是,我有必要重传吗?不需要的,我现在网络断了,别人只需要知道我现在在哪?他没有必要知道这个过程我经历了什么。大家都需要最新的信息。
- 这种需求还是比较常见的。吃鸡游戏就是其中一个例子。他们可能并不需要重传。你扔出去就不用管了。这种叫做UDP。
- 我们的网络并不都是像tcp数据完整性要求这么严,但是他们都需要网络,都需要按照这个路上一步一步走过来,都需要这个主机找到那个主机去。那么这个功能怎么办?
- TCP怎么出现的?他有统一需求,多个应用层都有这个需求,那么抽出来,抽个TCP。
- 那么tcp和udp都有这种网络的需求,怎么办?
- 再抽一层。这一层又把网络传输往下降了。tcp我也不传了,我只是把功能抽一抽,把他切成四块,他第一块给下面,第二块给下面…
- 新抽出来的这一层就只负责蒙头传。
- 我不知道你给我的这四块之间有连续关系
- 传到没?我不管。
- 传的是啥?我不管。
- 互相有联系没?我不管。
- 我只负责帮你往目标地址去传。到了没?我也不管。这一层就是IP层,网络层。
- 那么到这个时候,整个网络结构,关系是怎么样的呢?
- http需要发东西是吧?他不传,告诉tcp我要传这个数据,快点给我传去;
- 然后tcp说好的,tcp也不传,他把数据拆成块,给ip,请你给我传这块。
- 都没有什么你先传后传的,不管。就跟他说你传这块,传那块,
- 他tcp负责编号,负责看顺序,负责检测是否到了。
- 然后传过去,一号,传到对面的ip层,
- 往上移交,tcp收到以后,对ip层说,请帮我发这个消息回去,发什么呢?
- 一个确认信息。然后左边tcp层会知道,一号到了。
- 同时,未必是先后关系,这个二号传过去,然后也会确认。
- 三号传过去往上交,可能三号收到失败,那么他就不会往回返。
- 四号发过去,四号也收到了,
- 然后左边tcp发现三号没到,
- 然后再要ip层传一次,右边ip收到,交给tcp,tcp一看,这不三号吗?全了。
- 之后,做两件事,第一,他会给左边tcp回复,你这三号也到了,同时他也会把这个整个拼装起来,告诉http, 你收到一个消息。
- 这个时候,这个消息到达了。
- 这三层他们的出现,都是因为网络的不稳定,如果网络稳定,你所有东西都能一次性到达,那么tcp、ip都不再需要。只要所有对象的应用层就足够了。
数据链路层
- 另外,还有一层没有说,就下面的数据链路层。
- 数据链路层就是我们实际的网络,比如我们的以太网,我们的wifi网络,
- 以太网是什么呢?就是我们用网线连的这种网就叫以太网,因为现在用的以太网已经是一种事实标准了,其实,物理连线来做一个网络未必需要用以太网这种双绞线,你发明一个八绞线也可以,但是他已经成为一个事实标准了,所以好像我们就只有这一种物理网络一样,并不是的,什么叫以太网呢?用网线连的网就叫以太网。我们用的以太网、wif就是下面的数据链路层(LINK),他什么作用?他为我们网络提供现实世界中的支持。
- 这是tcp/ip他们的模型,tcp/ip族有四层模型,另外还有七层模型,七层模型因为过于复杂,在一些实际的讨论和讲授中可能会更加麻烦一点,那个把链路层也分两层,一个叫数据链路层,一个叫物理层,
- 数据链路层是我们的以太网、wifi,
- 物理层是我们的网线、交换机。
- 其实四层这种分法很直接,很容易搞明白,不过很多人不理解就是因为没有搞清楚为什么要分层,就是因为网络不稳定。不然只有两层,一层是咱们的设备,一层是上面的应用,太好理解了,为什么有tcp、ip?因为网络不稳定。
- 为什么要tcp?
- 因为我要拆包。
- 为什么要ip?
- 有的时候我不需要确认,那么我把我的传输单独分一层,ip不是用来传数据的,真正传数据靠的是数据链路层。他是用来干什么?比如我要寻址,我要找路由器。
- ip层怎么寻址呢?
- 你可以看一些介绍,总之他会找出各种路由器之间的表,他会逐渐建立起一个越来越稳定的查询网络。
长连接:
什么叫长连接?
- 长连接就是我们不释放的连接。连接都是保持的,直到我关闭,直到我忘记。长连接就是我强制不让他关闭。
- 为什么要长连接呢?
- 他是跟我们的网络有关的。
- 这是我们想象中的网络,
- 但是我们的电脑可能并不在公网上,而是在某个内网里面,比如我们的小区网关建了一个内网,然后我们的电脑是在这个网关里面,
- 他并没有公网ip,跟下面一样。网关跟外界通信,我们要跟外界通信得先跟网关通信,然后他帮我们在上面开一个小口,然后这个小口去跟外界通信。这样就导致一个什么结果呢?
- 我们的主机,他其实占用的端口是网关的端口,网关给我们开的端口。
- 实际的网络有时候会出现内网。
- 我们手机的网络就是运行在这样的网络里面的。我们手机网络全都是运行在内网里面的。都是某个运行商给我们建立的一个内网。这是我们运行的实际方式。
- 接下来说到长连接了,我们的手机他用了我们的运行商开的一个内网,而内网要给我们开这些端口,要耗费他的资源,那么他就会想着尽量省资源。
- 省资源是什么方式呢?就是这个端口你不使用一段时间后,我就把他关闭了
- 那么这就导致,当我们手机上开着一个聊天软件,他通过服务器去连,这是正常的,可是,假如我们有一段时间没有发消息,这个服务器就觉得,他原来这个端口不用了,不需要通知服务器,服务器会检测,过段时间就关了。这个时候外界再想给我发消息,他依然是发到外界网关的端口上,他不知道我是否是在内网,他只是往这发消息,他发现发不动,因为服务器把这个端口给关了,服务器根本就不搭理他,那么这个网络就被切断了,他被限时切断。这就不行了,现实场景中,我们可能随时要接收服务器推送,或者是接收一些服务器的消息,那我五分钟不聊天你就让我再也聊不成,这……那就需要突破这个限制。
- 去建立一个长连接。让这个端口不会被关闭。就是去欺骗你的网关,也就是使用心跳。
长连接实现方式:心跳
- 不管你本地是不是有消息发送给对方的对象,你每过一段时间,比如你每过一秒钟都发个消息,发个没有用的tcp消息。这个时候你的网关就会发现,这个端口一直在被占用,他就不会帮你关闭掉。这就是心跳包的本质。
- 了解这些东西的本质之后,去做具体的实现,做各种细节,或者在技术上做一些突破的时候,都会更加明白。我们android开发中用得很少,做长连接谁做呢?那些极光推送这些做推送的公司他们会做,这个技术非常难,很复杂,里面细节非常非常多,你需要对运行商对各种东西了解得非常细致。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END