先来个总结:
TCP/IP的网络传输模型可以分为以下四层:应用层、传输层、IP网络层、网络接口层。
下面我们来简单介绍每一层的作用和工作原理
应用层(Application Layer)
从网络传输模型来说,应用层能说的东西不是太多,应用层指定是我们平常生活中的应用程序,比如移动端\PC网站等,他们普遍使用HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP等等已经包装好并且成熟的通信协议或者框架,在应用层我们并不需要关注传输层是怎么实现,在传输中应用层代表的是操作系统的用户态,应用层以下叫做内核态。
在我们常说的网络七层架构中,应用层其实就包含了表示层(数据的安全、压缩等),会话层(建立、管理、终止会话等)在七层架构中,
传输层(Transport Layer)
传输层一般我们指的都是TCP/UDP传输层,TCP(Transmission Control Protocol)是可靠的传输层协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,同时兼有流量控制、超时重传、拥塞控制等特性,比如HTTP、HTTP1.1、HTTP2都是使用TCP作为传输层协议,同时要注意在TCP传输中可能数据会特别大,所以会将数据切割为小块发送,在tcp中叫做TCP段,要注意的是TCP的报文是基于流,UDP是基于数据包。
UDP相对TCP来说就比较简单,它属于传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上,它只负责将数据发送往指定端口,不管成功还是失败,所以它的优点就是快,但是就不可靠,通常用于视频等大文件传输,当然我们也可以在UDP的基础上进行包装,自己组装上层的可靠协议,类似TCP。
为什么上文我们要说指定端口,而不是指定的地址了,因为在网络传输模型中,在传输层其实并不做网络传输工作,在实际网络传输中网络传输错综复杂,各类情况也层出不穷,所以根据不同模型处理不同的事情的原则,在传输层我们只会记录对应的接收应用的端口号,端口号的作用是在一台服务上区分去不同的接收应用,比如常见的3306、80等端口来区分应用。
其实我们到这里可以总结一下传输层的具体作用:传输层协议主要的作用(TCP为例)就是控制我们请求的数据是否能成功不靠谱的网络环境中将数据靠谱发送到指定的接收端,并且自动实现流量控制、超时重传、拥塞控制等功能,而我们只需要关注操作系统和应用层的开发,无需关注内核级别的实现,具体的表现如TCP的三次握手建立链接。
网络层(Internet Layer)
网络层我们通常指IP协议层,IP 协议会将传输层的报文作为数据部分,再加上 IP 包头组装成 IP 报文,如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会再次进行分片,得到一个即将发送到网络的 IP 报文(数据结构如下图,图取自 小林coding)。
网络层传输主要是作用就是让我们在庞大的网络海洋中找到我们应该连接那台机器,而IP协议主要是区分机器的编号,
我们一般用 IP 地址给设备进行编号,对于 IPv4 协议, IP 地址共 32 位,分成了四段(比如,192.168.100.1),每段是 8 位。只有一个单纯的 IP 地址虽然做到了区分设备,但是寻址起来就特别麻烦,全世界那么多台设备,难道一个一个去匹配?这显然不科学。
因此,需要将 IP 地址分成两种意义:
- 一个是网络号,负责标识该 IP 地址是属于哪个「子网」的;
- 一个是主机号,负责标识同一「子网」下的不同主机;
举个例子,比如 10.100.122.0/24,后面的
/24
表示就是255.255.255.0
子网掩码,255.255.255.0 二进制是「11111111-11111111-11111111-00000000」,,是 24 个1,为了简化子网掩码的表示,用/24代替255.255.255.0。知道了子网掩码,该怎么计算出网络地址和主机地址呢?
将 10.100.122.2 和 255.255.255.0 进行按位与运算,就可以得到网络号,如下图:
计算出对应的网络号和主机号,我们需要借助路由,路由会根据你传递的ip地址信息,在网络世界中层层传递,将数据包传递到你要传递的最终的机器上。
I
网络接口层(Link Layer)
上面我们提到了网络层的路由定向问题,比如说我们公司服务器或者办公网络都是局域网,都是使用统一的ip地址,那怎么定位到我们具体服务器了,这就要用到MAC地址,而网络接口层就是用来做这个活的,对于以太网来说,存在很多交换机、路由器,我们需要正确的定位是很难的,MAC 头部是以太网使用的头部,它包含了接收方和发送方的 MAC 地址等信息,我们可以通过 ARP 协议获取对方的 MAC 地址(个人理解,有不同解释在评论区提一下)。
在七层架构中,网络接口层包括数据链路层和物理层,对应的是网卡和芯片级别的操作,沿用上图,我们看下最终的数据请求包结构:
补充
网络分层结构可以说是将模块式思维融入的很透彻,每一层做的事情都很明确,我们平常了解的网络七层架构为什么没有成为现在的主流了,主要是因为七层架构虽然很好,但是造价太高,同时实践也证明四层架构能满足目前需求。