内容
TCP/IP协议,是一个有层次的协议栈,一直都有听说过,四层负载均衡,七层负载均衡,二层转发,三层路由...那这些层次的含义是什么?
TCP/IP网络分层模型
TCP/IP当初的设计者,创造性地提出了分层的概念,把复杂的网络通信划分出多个层次,再给每一个层次分配不同的职责,层次内只专心做自己的事情就好,用“分而治之”的思想,把一个大麻烦拆分成了数个小麻烦,从而解决了网络通信的难题。
层次顺序,从下往上,所以从最下面一层开始慢慢解释。
链接层(Link Layer)
负责在以太网、WiFi这样的底层网络上发送原始数据包,工作在网卡这个层次,使用MAC地址来标记网络上的设备,所以有时候也叫MAC层。
网际层 / 网络互联层(Internet Layer)
IP协议就处在这一层。因为IP协议定义了“IP地址”的概念,所以就可以在链接层的基础上,用IP地址取代MAC地址,把许许多多的局域网、广域网连接成一个虚拟的巨大网络,在这个网络里找设备时,只要把IP地址,再翻译成MAC地址就可以了。
传输层(Transport Layer)
这个层次协议的职责是保证数据在IP地址标记的两点之间 “可靠”地传输,是TCP协议工作的层次,另外还有一个是UDP。
TCP是一个有状态的协议,需要先与对方建立连接,然后才能发送数据,而且保证数据不丢失不重复。而UDP比较简单,他是无状态,不用事先建立连接就可以任意发送数据,但不保证数据一定会发到对方。两个协议的另一个重要区别在于数据的形式。TCP数据是连续的“字节流”,有先后顺序。而UDP,则是分散的小数据包,是顺序发,乱序收。
应用层
由于下面的三层把基础打得非常好,所以在这一层,想干嘛就干嘛了,有各种面向具体应用的协议。例如,Telnet、SSH、FTP、SMTP,还有HTTP
小结
MAC层传输单位是帧(frame),IP层的传输单位是包(packet),TCP层的传输单位是段(Segment),HTTP的传输单位是消息或报文(message)。这些名词,都可以统称为数据包。
OSI网络分层模型
OSI,开放式系统互联通信参考模型(Open System Interconnection Reference Model)。70年代,网络协议频出,ISO感觉野路子太多了,就想来个大一统。于是,设计出了一个新的网络分层模型,想用这个框架来统一既存的各种网络协议。就是这个OSI
主要分成了七层,部分层次与TCP/IP很像:
- 第一层:物理层,网络的物理形式,例如电缆、光纤、网卡、集线器等等
- 第二层:数据链路层,相当于TCP/IP的链接层;
- 第三层:网络层,相当于TCP/IP的网际层;
- 第四层:传输层,相当于TCP/IP的传输层;
- 第五层:会话层,维护网络中的连接状态,即保持会话和同步;
- 第六层:表示层,把数据转换为合适、可理解的语法和语义;
- 第七层:应用层,面向具体的应用传输数据
不过ISO很清楚,TCP/IP协议才是主导,OSI分层模型在发布的时候,就明确地表明是一个参考,不是强制标准。但是OSI模型也是有优点的,对比一下就可以看出,TCP/IP是一个纯软件的栈,没有网络应用的最根基的电缆、网卡等物理设备的位置。而OSI补足了这个缺失,在理论层面上描述网络更加完整。
还有一个重要的形式上的有点:OSI为每一层标记了明确了编号,最底层是一层,最上层是七层。而TCP/IP的层次只有名字,没有编号。所以,比较好叫。这些只是理论上的,没有与现实完全对应。
两个分层模型的映射关系
现在我们有了两个网络分层模型:TCP/IP和OSI,那这两个模型是怎么去做互相映射或者说,互相解释的?(OSI在设计之初,就有参考了TCP/IP等多个协议)
- 第一层:物理层,TCP/IP里无对应;
- 第二层:数据链路层,对应TCP/IP的链接层;
- 第三层:网络层,对应TCP/IP的网际层;
- 第四层:传输层,对应TCP/IP的传输层;
- 第五、六、七层:统一对应到TCP/IP的应用层。
这就是“理想与现实”之间的矛盾,理想很美好,有七层,但现实很残酷,只有四层,多余的五六层就此消失。
实际原因:
OSI的分层模型,在四层以上分得太细,而TCP/IP实际应用时的会话管理、编码转换、压缩等具体应用经常联系得很紧密,很难分开。例如,HTTP协议就同时包含了连接管理和数据格式定义。
所以,当我们在说:
四层负载均衡,是指工作在传输层上,基于TCP/IP协议的特性,例如IP地址、端口号等实现对后端服务器的负载均衡。
七层负载均衡,是指工作在应用层上,看到的是HTTP协议,解析HTTP报文里的URI、主机名、资源类型等数据,再用适当的策略转发给后端服务器。
TCP/IP协议栈的工作方式
我们可以把HTTP利用TCP/IP协议栈传输数据,想象成一个发快递的过程。
假设内容:
- 假设你想把一个毛绒玩具送给朋友,但你要先拿个塑料袋套一下,这件玩具就相当于HTTP协议里要传输的内容,比如HTML,然后HTTP协议为他加一个HTTP专用附加数据。塑料袋相当于HTTP头。
- 你把玩具交给快递小哥,为了保护货物,他又加了层包装再贴了个标签,相当于TCP层给数据再次打包,加上了TCP头。
- 接着快递小哥下楼,把包裹放进了三轮车里,运到集散点,然后再装进更大的卡车里,相当于IP层、MAC层对TCP数据包加上了IP头、MAC头
- 之后经过漫长的运输,包裹到达目的地,要卸货再放进另一位快递员的三轮车,就是在IP层、MAC层传输后拆包。
- 快递员到了你朋友的家门口,撕掉标签,去除了TCP层的头,你朋友再拆掉塑料袋包装,也就是HTTP头,最后就拿到了玩具,也就是真正的HTML页面。
这个比喻里,省略了很多TCP/IP协议里的细节,比如建连、路由、数据切分与重组、错误检查等,但核心的数据传输过程是差不多的。HTTP协议的传输过程,就是这样通过协议栈逐层向下,每一层都添加本层的专有数据,层层打包,然后通过下层发送出去。接收则是相反的操作,从下往上穿过协议栈,逐层拆包,每层去掉本层的专有头,上层就会拿到自己的数据。
但下层的传输过程对于上层完全是“透明”的,上层也不需要关系下层的具体实现细节,所以就HTTP层次来看,它不管下层是不是TCP/IP协议,看到的只是一个可靠的传输链路,只要把数据加上自己的头,对方就能原样收到。
小结
- TCP/IP分为四层,核心是二层的IP和三层的TCP,HTTP在第四层;
- OSI分为七层,基本对应TCP/IP,TCP在第四层,HTTP在第七层;
- OSI可以映射到TCP/IP,但这期间一、五、六层消失了;
- 日常交流的时候,我们通常使用OSI模型,用四层、七层等术语;
- HTTP利用TCP/IP协议栈逐层打包再拆包,实现了数据传输,但下面的细节并不可见。
辨认四层+七层(不绝对,基于OSI):
- 凡是由操作系统负责处理的,就是四层或四层以下
- 否则,凡是需要由应用程序(也就是自己写的代码)负责处理的,就是七层
额外
MAC地址(Media Access Control Address),也叫做局域网地址,可以唯一地标识一个网卡,也就同时标识了此网卡所属的设备
在TCP/IP之外,还有一些协议位于OSI五层和六层的,比如,UNIX域套接字,就可以认为是在五层
二层转发:设备工作在链路层,帧在经过交换机设备时,检查帧的头部信息,拿到目标mac地址,进行本地转发和广播
三层路由:设备工作在ip层,报文经过有路由功能的设备时,设备分析报文中的头部信息,拿到ip地址,根据网段范围,进行本地转发或选择下一个网关(转发包)
总:
首先这里的二层和三层指的都是 OSI 中的对应的层级;
1)二层转发就意味着是在数据链路层(Data Link Layer)做的转发,基于 MAC 地址,通常指的是交换机;
2)三层路由意味着是在网络层(Network Layer)做的转发,通常指的是路由器(当然也有路由功能的交换机);
3)当数据传输到网络层,路由器会检查目的 IP 是否与自己处于同一网段,是则进行二层转发即请求目的主机的 MAC 地址,否则进行三层转发即进入路由的递归查找。DNS: 属于应用层,其本身并不负责传输、网际的实际操作,只是将域名解析为 IP,方便下一层的使用
CDN: 也应当属于应用层,类似于 DNS 他们都是针对传输后的数据内容的操作,而非实际去处理传输等操作。