从一个请求到互联网协议
一、什么是互联网协议
网络协议是在网络环境下运行的所有设备之间互相通信的规则的集合,它定义了设备之间通信时数据交换的格式和格式的解释。
二、分层模型
提起分层模型,一定有人会有疑问🤔️。为什么有说七层的有说五层的还有说四层的?
2.1、首先来说OSI七层模型
- 首先OSI七层模型并不是一个标准,而是一个概念。
- 其次OSI并没有得到广泛的认可
- 最后这个模型各层的名字大家不需要去死背硬记,没有意义。下面我会有例子讲到各层解决的问题。
2.2、其次是TCP/IP参考模型
- 实际上TCP/IP和OSI模型组并不能如上图所示精确的匹配
- 网络中最核心的技术就是传输层和网络层技术,所以无论是四层还是五层模型这两层都被完整保留
- TCP/IP参考模型,更加侧重的是互联网通信核心(也是就是围绕TCP/IP协议展开的一系列通信协议)的分层,因此它不去管此流程中不相关的协议;其次,之所以说他是参考模型,是因为他本身也是OSI模型中的一部分,因此参考OSI模型对其分层。
2.3、五层模型
- 五层模型是结合了OSI七层和TCP/IP四层模型为了方便学习计算机网络原理的产物。
这里下面再引用一个我认为做的还不错的网图(Google搜图搜的,如有侵权请告知。)
三、现在讲一下从设备A到设备B的数据交互
3.1、如果现在小A要和小B通信,那么从物理层讲起,最简单的是不是拿一根网线连接A->B
这一层一般是以物理形式存在的,使用双绞线、光纤等其他方式进行设备之间的连接。他可以传输0101这样的二进制电信号。
⚠️ 现在有一个问题就是他们之间可能不懂对方的0101代表什么,这个时候就需要数据链路层上场了。
3.2、数据链路层这里去定义0101的分组方式和代表的意义
该层下主要是以太网,以太网规定一组电信号构成一个数据包 叫做帧(Frame)
每一帧(Frame)由包头(Head)和数据(Data)组成。其中Head
包含该数据包的一些说明项,比如发送者、接受者、数据类型等等;Data
则是数据包的具体内容。Head
的长度,固定为18字节。Data
的长度,最短为46字节,最长为1500字节。因此,一个Frame
最短为64字节,最长为1518字节。如果数据很长,就必须分割成多个帧进行发送。
🪵 现在有个问题是数据包Head
中的发送者和接收着如何用全球唯一的名字去标识?
这个问题实际上可以类比成 你叫张三,他也叫张三。我该如何区分你们?在现实生活中我们是用身份证号作为人的唯一标识。同样以太网规定:每一个过来上网的设备都必须要有网卡
,数据包必须从一张网卡传递到另一张网卡。网卡地址就是数据包的发送和接收地址。这个网卡地址就叫做MAC地址
🧱 为什么网卡地址就可以做到唯一?
这个其实是一种规范:每块网卡在生产时都会标记上厂商的代号和该网卡的内部序列号,例如:
- 如上图,MAC地址一共6个字节,用16进制展示,一般写法是每个字节中间用:隔开。
- 前三个字节用来标识厂商代号
- 后三个字节用来标识该网卡的内部序列号
如果现在局域网中有ABCD四个设备,数据交换可以通过广播的方式将ARP包发送给每个设备,然后每个设备收到之后去匹配接收着MAC地址,如果是自己则留下,如果不是则丢弃。这样局域网内就可以进行通信了。
⚠️ 但是又有一个问题:如果此时A要找的设备E,但是设备E没有在局域网里面。这时怎么办?不可能把这个ARP包发给全球所有的设备吧😂(这里只是一个假设,实际上不同子网广播是不互通的)。这样还没开始通信就造成了全球网络瘫痪。
3.3、现在该网络层上场了
首先会判断两个通信设备有没有在同一个子网(这个后面会专门写一篇文章去介绍,就是二进制的IP地址与子网掩码进行与运算)
如果是同一个子网则用广播找设备E
,如果不在同一个子网则是用路由找设备E
。刚才说到数据链路层用MAC地址作为唯一标识,用ARP协议进行通信,而到了网络层就会是用IP地址作为唯一标识,用IP协议进行通信。
截止到现在每个设备都有了MAC地址和IP地址。
- MAC地址全球唯一,只与硬件厂商和生产序号有关系。
- 公网IP地址为全球唯一,只与网络管理员分配有关系(这一步先不讨论局域网IP)。
- IP地址用来确定设备所在子网,MAC地址用来在子网中确定某一个网卡。
IP数据包
也是由包头(Head)和数据(Data)组成,Head包含协议、源地址、目的地址等信息。
- 其中前20个字节为固定头部。必须拥有的属性。
- 一个数据包总长度最大为65535字节。
⚠️ 由目标的IP地址和MAC地址可以实现任意两个设备之间的通信,但是又出现一个新的问题:那就是如果确定这个数据包是属于哪个应用程序的?因为咱们的设备可能运行了钉钉、微信等等一大堆应用程序。
3.4、既然不能确定包所属的应用程序那就再加一个叫传输层的东西
我们的设备已经有了IP地址,如果想区分应用程序怎么办?很简单—-添加一个叫端口(Port)
的东西
- 端口是每一个用网卡设备程序的编号。
- 每一个端口下都是一个可执行程序。
- 端口号是0-65535之间的证书,其中0-1023被称为保留端口号(可以自定义程序使用,但不推荐使用)。
OK,到这个阶段通过ip+port
就可以确定一个设备中某个唯一的程序,进而实现任意两个设备间任意应用程序的通信。
继续往刚才的IP数据包中添加端口号就有了传输层协议:常见的TCP
、UDP
协议。
TCP包和UDP包的区别:
- TCP套接字是四元组标识:源IP、源端口、目的IP、目的端口
- UDP套接字是二元组标识:目的IP、目的端口
- 在TCP的传输中只要源IP或源端口任意一个不相同都会被定向到不同的进程去处理;而UDP传输中无论源IP和端口如何变化,只要目的IP和目的端口一致则会交给相同的进程去处理。
- 在通常情况下UDP可以是一对一,一对多,多对一,多对多的;而TCP总是一对一的。
OK,到现在为止数据包已经可以精确的从任意一个设备A的任意一个进程传输到任意一个设备E的任意一个进程。那么有一个新的问题就是:我们人类如果去使用这些数据?
3.5、用不同的应用层协议对应的软件去解析不同的数据来展示给人类
比如我们现在是在浏览HTTP的网页,那么需要使用基于HTTP协议开发的Chrome等浏览器去进行数据的解析。我们如果需要收发邮件,那么就需要使用基于POP3、SMTP等协议开发的Outlook等邮件客户端去进行操作。
四、总结
上述的过程中,凡是数据发送方
都会从最高层的应用层
依次往下添加各层的首部信息
,最终通过物理传输介质
发送出去。凡是数据接收方
都会从物理层
依次向上进行各层级的信息解析
,最终交给对应的应用层进程
进行解析展示。如下图所示: