TCP/IP网络分层模型

        TCP/IP的设计创造性的提出了分层的概念,把复杂的网络通信划分出多个层次,再为每一个层次分配不同的职责,层次内只专心做好自己的事情,用分而治之的思想把一个大麻烦拆分成了数个小麻烦,从而解决了网络的难题。

        TCP/IP协议总共有四层,就想搭积木一样,每一层需要下层的支持,同时又支撑着上层,任何一层被抽掉都可能会导致整个协议栈坍塌。

        第一层叫做链接层(linke layer),负责以太网、WiFi这样的底层网络上发送原始数据包,工作在网卡这个层次,使用MAC地址来标记网络上的设备,所有有时候也叫MAC层。

        第二层叫网际层或者网络互联层(Internet layer),IP协议就处在这一层。因为IP协议定了IP地址的概念,所以就可以在链接层的基础上,使用IP地址取代MAC地址,把许许多多的局域网、广域网连接成一个虚拟的巨大网络,在这个网络里找设备时只要把IP地址再翻译成MAC地址就可以了。

        第三层叫做传输层(transport layer),这个层协议的职责是保证数据在IP地址标记的两点之间可靠的传输,是TCP协议工作的层次,另外还有一个它的伙伴UDP。

        TCP协议是一个有状态的协议,需要与对方建立连接后才能发送数据,而且保证数据不丢失不重复。而UDP则比较简单,它无状态,不用事先建立连接就可以任意发送数据,但不保证数据一定会发送到对方。两个协议的另一个重要区别在于数据的形式。TCP的数据是连续的“字节流”,有先后顺序,而UDP则是分散的小数据包,是顺序发,乱序收。

        第四层叫做应用层(application layer),由于下面的三层把基础打得非常好,所以在这一层就百花齐放了,有各种面向具体应用的协议。例如Telnet、SSH、FTP、SMTP等等,当然还有HTTP。

        MAC层的传输单位是帧(frame),IP层的传输单位是包(packet),TCP层的传输单位是段(segment),HTTP的传输单位则是消息或者报文(message)。但这些名词并没有什么本质的区分,可以统称为数据包。

        OSI网络分成模型

        OSI的全称是开放式互联网通信参考模型(Open System Interconnection Reference Model)

TCP/IP发明于1970年代,当时除了它还有很多其他的网络协议,整个网络世界比较混乱。这个时候国际标准组织(ISO)注意到了这种现象,感觉野路子太多,想要来个大一统。于是 设计出了一个新的网络分层模型,想用这个新框架来统一既存的各种网络协议。

        OSI模型分了七层,部分层次和TCP/IP很像,从下到上分别是:

        1.第一层:物理层,网络的物理形似,例如电缆、光纤、网卡、集线器等等;

        2.第二层:数据链路层,它基本相当于TCP/IP的链路层;

        3.第三层:网络层,相当于TCP/IP里的网际层;

        4.第四层:传输层,相当于TCP/IP里的传输层;

        5.第五层:会话层,维护网络中的连接状态,即保持会话和同步;

        6.第六层:表示层,把数据转为合适、可理解的语法和语义;

        7.第七层:应用层,面向具体的应用传输数据。

        OSI分成模型在发布的时候就明确的表明是一个参考,不是强制标准,但OIS模型也是有优点的。对比一下就可以看出,TCP/IP是一个纯软件的栈,没有网络应用最根基的电缆、网卡等物理设备的位置。而OIS则不足了这个缺失,在理论层面上描述网络更加完整。

        还有一个更重要的形式上的优点:OSI为每一层标记了明确的编号,最底层是一层,最上层是七层,而TCP/IP的层次从来只要名字而没有编号。显然,在交流的时候说七层要比应用层更简单快捷。

        综合以上几点,在OSI模型之后,四层和七层这样的说法就逐渐流行开了。不过在实际工作中,这种说法只是理论上的层次,而不与显示完全对应。

        两个分层模型的映射关系

        TCP/IP和OSI一个是四层模型,一个是七层模型,这两者应该如何映射或者说如何解释呢?

OSI在设计之初就参考了TCP/IP等多个协议,可以比较容易但不是很精确地实现了对应关系。

4层Clos架构的网络实现_IP

        1.第一层:物理层,TCP/IP里无对应;

        2.第二层:数据链路层,对应TCP/IP的链接层;

        3.第三层:网络层,对应TCP/IP的网际层;

        4.第四层:传输层,对应TCP/IP的传输层;

        5.第五、六、七层:统一对应到TCP/IP应用层;

        OSI的分层模型在四层以上分的太细,而TCP/IP实际应用时的会话管理、编码转换、压缩等和具体应用经常联系的很紧密,很难分开。例如,HTTP协议就同时包含了连接管理和数据格式定义。所谓的四层负载均衡就是指工作在传输层上,基于TCP/IP协议的特性,例如IP地址、端口号等实现对后端服务器的负载均衡。所谓的七层负载均衡就是指工作在应用层上,看到的是HTTP协议,解析HTTP报文里的URI、主机名、资源类型等数据,再用适当的策略转发给后端服务器。

        TCP/IP协议栈的工作方式

        TCP/IP协议栈是如何工作的呢?

        你可以把HTTP利用TCP/IP协议栈传输数据想象成一个发快递的过程。假设你想把一个玩具送给你朋友,但你需要先用个塑料袋套一下,这件玩具相当于HTTP协议里要传输的内容,比如HTML,让后HTTP协议为它加一个HTTP专用附加数据。你把玩具交给快递小哥,为了保护货物,他又加了层包装再贴了个标签,相当于在TCP层给数据再次打包,加上了TCP头。接着快递小哥下楼,把包括放进了车里,运送到集散地点,然后装进大卡车里,相当于在IP层、MAC层对TCP数据包加上了IP头、MAC头。之后经过漫长的运输,包裹到达目的地,要卸货再放进另一位快递员的三轮车,就是在IP层、MAC层传输后拆包。快递员到了你朋友家门口,撕掉标签,去除了TCP层的头,你朋友再拆掉塑料袋包装,也就是HTTP头,最后拿到了玩具,也就是真正的HTML页面。

        这个比喻里省略了很多TCP/IP协议里的细节,比如建立连接、路由、数据切分与重组、错误检查等,但核心的数据传输过程差不多。

  HTTP协议的传输过程就是这样通过协议栈逐层向下,每一层都添加本层的专有数据,层层打包,然后通过下层发送出去。

接收数据则是相反的操作,从下往上穿过协议栈,逐层拆包,每层去掉本层的专有头,上层去拿到自己的数据。

        但下层的传输过程对于上层是完全透明的,上层也不需要关心下层的具体细节,所以就HTTP层次来看,它不管下层是不是TCP/IP协议,看到的只是一个可靠的传输链路,只要把数据加上自己的头,对方就能原样收到。

        

4层Clos架构的网络实现_http_02

 

        小结

        1.TCP/IP分为四层,核心是二层的IP和三层的TCP,HTTP在第四层;

        2.OSI分为七层,基本对应TCP/IP,TCP在第四层,HTTP在第七层;

        3.OSI可以映射到TCP/IP,但这期间一、五、六层消失了;

        4.日常交流的时候我们通常使用OSI模型,用四层、七层等术语;

        5.HTTP利用TCP/IP协议栈逐层打包再拆包,实现了数据传输,但下面的细节并不可见。

        有一个辨别四层和七层比较好的小窍门,两个凡是:凡是由操作系统负责处理的就是四层或四层以下,否则凡是需要由应用层序(也就是自己写的代码)负责处理的就是七层。