文章目录
- 网络协议
- 协议分层
- OSI七层模型
- TCP/IP五层(或四层)模型
- 同局域网的两台主机通信
- 数据包封装和解包分用(数据段,数据报,数据帧)
- 网络中的地址管理
网络协议
协议分层
网络协议栈设计成层状结构,其目的就是为了将层与层之间进行解耦,保证代码的可维护性和可扩展性。
OSI七层模型
- OSI(Open System Interconnection,开放系统互联)七层网络模型称为开方式系统互联参考模型,是一个逻辑上的定义和规范。
- OSI把网络从逻辑上分为了七层,每一层都有相关的、相对应的物理设备,比如路由器,交换机。
- OSI七层模型是一种框架性的设计方法,其最主要的功能就是帮助不同类型的主机实现数据传输,比如手机和电视之间数据的传输。
- OSI七层模型最大的优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。
- 但是,OSI七层模型既复杂又不实用,所以后来在具体实现的时候就对其进行了调整,于是就有了我们现在看到的TCP/IP四层协议
OSI七层模型:
应用层:针对特定应用的协议
表示层 :设备固有数据格式和网络标准数据格式的转换
会话层 :通信管理、负责建立和断开通信连接(数据流动的逻辑通路)、管理传输层以下的分层
传输层 :管理两个节点之间的数据传输、负责可靠性传输(确保数据被可靠地传送到目标地址)
网络层 :地址管理与路由选择
数据链路层 :互联设备之间传送和识别数据帧
物理层 :以0/1代表电压的高低以及灯光的闪灭、界定连接器和网线的规格
TCP/IP五层(或四层)模型
TCP/IP是一组协议的代名词,它还包括许多协议,共同组成了TCP/IP协议簇。TCP/IP通讯协议采用了五层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
- 物理层: 负责光/电信号的传递方式。比如现在以太网通用的网线(双绞线)、早期以太网采用的同轴电缆(现在主要用于有线电视)、光纤,现在的WiFi无线网使用的电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)就是工作在物理层的。
- 数据链路层: 负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。数据链路层底层的网络通信标准有很多,如以太网、令牌环网、无线LAN等。交换机(Switch)就是工作在数据链路层的。
- 网络层: 负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间数据传输的线路(路由)。路由器(Router)就是工作在网络层的。
- 传输层: 负责两台主机之间的数据传输。例如传输控制协议(TCP),能够确保数据可靠的从源主机发送到目标主机。
- 应用层: 负责应用程序间沟通。比如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层的
操作系统对应的是传输层和网络层,数据链路层和物理层都是对应在驱动层的,而TCP/IP协议当中的应用层就对应到OSI七层协议当中的应用层、表示层和会话层
一般而言,对于一台主机,它的操作系统内核实现了从传输层到物理层的内容。对于一台路由器,它实现了从网络层到物理层的内容。对于一台交换机,它实现了从数据链路层到物理层的内容。
对于集线器,它只实现了物理层的内容
同局域网的两台主机通信
报文=报头+有效载荷
- 有效载荷:每一层的协议实际上只关心数据中与当前层对应的报头信息,而剩下信息的具体内容根本不必关心,有效载荷就是数据中除当前层的报头以外的数据
几乎任何层的协议,都要提供一种能力,将报头和有效载荷分离的能力
数据封装,实际就是不断给数据加上各种对应的报头,这些报头里面填充的就是对应的各种协议细节。
数据解包,实际就是不断从数据中提取对应的报头,并对提取出来的报头进行数据分析
同一个局域网内的主机是能够直接进行通信的
用户要将文件传输给另一台主机前,该文件数据需要先通过网络协议栈进行封装
文件数据先交给应用层,应用层添加上对应应用层协议的报头信息后,将数据再交给传输层。
传输层收到数据后,再添加上对应传输层协议的报头信息,并将数据继续向下进行交付。
网络层收到数据后,再添加上对应网络层协议的报头信息,接着将数据再交给链路层。
链路层收到数据后,最后再添加上对应链路层协议的报头信息,至此数据封装完毕
数据封装完毕后就可以通过局域网将其发送给对端主机了,而当对端主机收到数据后,对应也需要通过网络协议栈对该数据进行解包与分用:
- 链路层收到数据后,先将数据中对应链路层协议的报头信息提取出来,然后将剩下的数据交给网络层。
- 网络层收到该数据后,再将数据中对应网络层协议的报头信息提取出来,然后将剩下的数据继续向上进行交付。
- 传输层收到该数据后,再将数据中对应传输层协议的报头信息提取出来,然后将剩下的数据再交付给应用层。
- 应用层收到数据后,最后将数据中对应应用层协议的报头信息提取出来,至此便完成了数据的解包与分用
当对端主机收到数据后,需要自底向上贯穿协议栈,依次进行数据的解包与分用。在这个解包的过程中,每一层的协议只需要提取出数据中对应的报头,然后对该报头进行分析处理,而剩下的数据则直接交付给上层就行了。
上层协议在数据封装时添加的报头信息,在下层协议进行数据解包时看来就是有效载荷。
比如数据封装时应用层添加的报头信息,在对端主机进行数据解包时,在对端主机的传输层、网络层以及链路层看来,该应用层曾经添加的报头信息就是有效载荷
屏蔽底层的差异
IP协议屏蔽了底层网络的差异化,靠的就是工作在IP层的路由器,对于通信主机双方的IP层及其往上的协议来说,它们并不需要关心底层采用的是以太网还是令牌环网,它们认为只要填写了源IP地址和目的IP地址就能够将数据发送出去,因此现在主流的网络也叫做“IP网络”
当数据要从client发送到server时,路由器收到client的数据后,会先将以太网对应的报头进行解包,然后将剩下的数据向上交付给网络层,在网络层进行一系列数据分析后,再将数据向下交付给链路层,此时在链路层当中就会给该数据添加上令牌环对应的报头信息,然后再将该数据发送到server当中,此时该数据就能够在令牌环网当中传输了
数据包封装和解包分用(数据段,数据报,数据帧)
在传输层一般将数据包叫做数据段(数据包),网络层叫数据报,数据链路层叫数据帧,应用层叫请求与响应。
数据在向下经过协议栈封装成帧之后会通过传输介质网线(很多种类)发送到目标主机,目标主机会剥离层层协议的报头,根据报头的信息再将有效载荷发送到上层指定的协议进行处理
网络中的地址管理
IP地址 ,尤其是目的IP,一般都是不会改变的,协助我们进行路径选择
- IP地址是在IP协议中,用来标识网络中不同主机的地址。
- 对于IPv4来说,IP地址是一个4字节,32位的整数。
- 我们通常也使用“点分十进制”的字符串表示IP地址,例如192.168.0.1,用点分割的每一个数字表示一个字节,范围是0-255
IP协议有两个版本,分别是IPv4和IPv6。IPv4用32个比特位来标识IP地址,而IPv6用128个比特位来标识IP地址
MAC地址,出局域网之后,源头和目地都要被丢弃,让路由器重新封装
- MAC地址用来识别数据链路层中相连的节点。
- 长度为48位,及6个字节,一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)。
- 在网卡出厂时就确定了,不能修改。MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突,也有些网卡支持用户配置MAC地址)
在Linux中查看自己的MAC地址
ifconfig,查看当前主机所对应的网卡信息。
[cxq@iZwz9fjj2ssnshikw14avaZ ~]$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 172.17.56.73 netmask 255.255.192.0 broadcast 172.17.63.255ether 00:16:3e:0c:21:98 txqueuelen 1000 (Ethernet)RX packets 4808835 bytes 1758533559 (1.6 GiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 4300083 bytes 1089470563 (1.0 GiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0loop txqueuelen 1000 (Local Loopback)RX packets 3117128 bytes 696545821 (664.2 MiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 3117128 bytes 696545821 (664.2 MiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
用到的大部分局域网都是以太网标准,其中ether对应就有”以太“的意思,而ether后面的这个地址就是当前云服务器所对应的MAC地址。但实际云服务器上的MAC地址可能不是真正的MAC地址,该MAC地址可能模拟出来的。