通俗地解释一波OSI七层与TCP/IL四层模型

开局一张图:
通俗地解释一波OSI七层与TCP/IL四层模型

场景一(物理层):

最初,科学家要解决的第一个问题是,两个硬件之间怎么通信。具体就是一台发些比特流,然后另一台能收到。
于是,科学家发明了物理层:
主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。

场景2(数据链路层):

现在通过电线我们就能发数据流了,但是,我们还希望通过无线电波,通过其它介质来传输。然后还要保证传输过去的比特流是正确的,要有纠错功能。
于是,发明了数据链路层:
通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。

场景3(网络层):

现在我们可以在两台计算机之间发送数据了,那么如果要在多台计算机之间发送数据呢?怎么找到我们要发的那台?或者,A要给F发信息,中间要经过B,C,D,E,但是中间还有好多节点如K.J.Z.Y。该怎么选择最佳路径?这就是路由要做的事。
于是,发明了网络层:
通过路由算法,为报文或分组通过通信子网选择最适当的路径。该层控制数据链路层与物理层之间的信息转发,建立、维持与终止网络的连接。具体的说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。一般的,数据链路层是解决统一网络内节点之间的通信,而网络层主要解决不同子网之间的通信。例如路由选择问题。

场景4(传输层):

现在我们能发正确的发比特流数据到另一台计算机了,但是当要发送大量数据时候,就会需要好长时间,例如一个视频格式的,网络会中断好多次(事实上,即使有了物理层和数据链路层,网络还是经常中断,只是中断的时间是毫秒级别的)。那么,我们还须要保证传输大量文件时的准确性。于是,我们要对发出去的数据进行封装。就像发快递一样,一个个地发。
于是,先发明了传输层:
向用户提供可靠的、端到端的差错和流量控制,保证报文的正确传输。提供建立、连接和拆除传输连接的功能。传输层在网络层基础上,提供“面向连接”和“面向无连接”两种服务。例如TCP,是用于发大量数据的,我发了1万个包出去,另一台电脑就要告诉我是否接受到了1万个包,如果缺了3个包,就告诉我是第1001,234,8888个包丢了,那我再发一次。这样,就能保证对方把这个视频完整接收了。
例如UDP,是用于发送少量数据的。我发20个包出去,一般不会丢包,所以,我不管你收到多少个。在多人互动游戏,也经常用UDP协议,因为一般都是简单的信息,而且有广播的需求。如果用TCP,效率就很低,因为它会不停地告诉主机我收到了20个包,或者我收到了18个包,再发我两个!如果同时有1万台计算机都这样做,那么用TCP反而会降低效率,还不如用UDP,主机发出去就算了,丢几个包你就卡一下,算了,下次再发包你再更新。

场景5(会话层):

现在我们已经保证给正确的计算机,发送正确的封装过后的信息了。但是用户级别的体验好不好?难道我每次都要调用TCP去打包,然后调用IP协议去找路由,自己去发?当然不行,所以我们要建立一个自动收发包,自动寻址的功能。
于是,发明了会话层:
会话层的作用就是建立和管理应用程序之间的通信。允许用户在两个实体设备之间建立、维持和终止会话,并支持它们之间的数据交换。例如提供单方向会话或双向同时会话,并管理会话中的发送顺序,以及会话所占用时间的长短。

场景6(表示层):

现在我们能保证应用程序自动收发包和寻址了。但是要用Linux给window发包,两个系统语法不一致,就像安装包一样,exe是不能在linux下用的,shell在window下也是不能直接运行的。于是需要表示层,帮我们解决不同系统之间的通信语法问题。

场景7(应用层):

到了这里,现在所有必要条件都准备好了,我们可以写个python程序,让这些程序去实现需求场景7吧。