本文从开发者的角度,从底层往上层进行五层模型的概述。文章底部附一张x-mind结构图,从上层往底层进行概述。
网络通信概述
网络通信的实质就是:交换网络数据包。
数据包的结构:以太网标头-IP标头-TCP标头-应用层数据包
数据包能正常交换条件:本端及对端的MAC地址和IP地址
上网设置必要条件:
- 本机IP地址
- 子网掩码
- 网关IP地址
- DNS的IP地址
因为MAC有局限性,若不是在同个子网环境,无法知道对方的MAC地址,就需要网关转发
- 同一子网络,需要知道对方的MAC地址及对方的IP地址
- 非同一子网络,需要知道本端的网关MAC地址及对方的IP地址
物理层(实体层)
物理层是把电脑连接起来的物理手段,主要规定了网络的一些电气特性。基于电气特性发送高低电压(电信号),高电压对应数字“1”,低电压对应数字“0”
常见物理设备有:中继线、双绞线、集线器。
数据链路层
定义电信号“0”,“1”的分组方式,每组电信号是什么意思
常见物理设备
网卡、网桥
以太网协议
一组电信号构成一个数据包,叫做“帧”,每一帧分成两个部分:标头(Head)和数据(Data)。
“标头”包含数据包的一些说明项,例如发送者及源地址、接受者及目标地址、数据类型等。“数据”则是数据包的具体内容
"标头"长度固定18字节,“数据”长度最低46字节。最长1500字节。
所以,整个“帧”最低64字节。最长1518字节。如果数据很长,必须分割成多个帧进行发送(因为分帧后,多个被分割的数据包能不能按序号重新排序拼接,组成完成的原信息,后续会介绍到TCP和UDP协议)
MAC地址
以太网规定,连入网络的所有设备都必须具有“网卡”接口,数据包必须从一块网卡,传送到另一块网卡,网卡的地址就是数据包的发送地址和接收地址,即MAC地址
每块网卡出厂时,都有一个独一无二的MAC地址,长度是48个二进制位,通常用12个十六进制数表示
举个栗子: 00-B0-D0-86-BB-F7
前6个十六进制数是厂商编号,后六个是该厂商的网卡流水号
广播(同一广播域内)
接下来又有几个问题:
1.一块网卡怎么知道另外一块网卡的MAC地址?
2.系统怎么才能吧数据包准确送到接送方?
首先通过ARP协议,可以知道另一块网卡的MAC地址(不详细说明)
其次,因为数据包的Head中含有接收方的MAC地址,所有以太网采用很原始的方式:向本网络内所有 计算机发送数据包,让每台计算机自己判断,自己是否是接收方。这种发送方式就是“广播”。
网络层
由上述的“广播”方式可知,以太网采用广播方式发送数据包,不仅效率低。而且局限在发送者所在的子网络。
所以接下来要区分哪些MAC地址属于同个子网络,那些不是。
如果是同个子网络采用广播方式发送,否则就采用“路由”方式发送。
这就导致了“网络层”的诞生。他的作用是引进一套新的地址,使我们能区分不同的计算机是否属于同个子网络,这套地址就是“网络地址”,简称“网址”。
网络层的功能即建立主机到主机通信
常见物理设备
路由器、三层交换机
IP协议
规定网络地址的协议,即IP协议。他所定义的地址,被称为IP地址。
作用:1. 为每台计算机分配IP地址;2. 确定哪些地址属于同个网络。
目前广泛采用的是IP协议第四版,简称IPv4。IPv4规定网络地址由32个二进制位组成,习惯用四段十进制表示IP地址,从0.0.0.0 到255.255.255.255。
互联网上每台计算机会被分配到一个IP地址。地址分为两部分,前部分代表网络,后部分代表主机。那么如果从IP地址,判断两台计算机是否属于同一子网络?这时候需要另外一个参数子网掩码。
子网掩码:表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.254.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
知道"子网掩码",我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。
举个栗子:已知IP地址172.16.254.1和172.16.254.233的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?
两者与子网掩码分别进行AND运算,结果都是172.16.254.0,因此它们在同一个子网络。
IP数据包
根据IP协议发送的数据就叫IP数据包。IP数据包分为“标头”和“数据”两个部分
IP数据包的“标头”长度为20 ~ 60字节,整个数据包做大为65535字节。
如何在以太网协议中传递IP数据包?
把IP数据包把IP数据包直接放在以太网数据包的“数据”部分,无需修改以太网的规格。数据结构就变为:
以太网标头-IP标头-数据
传输层
由网络层协议可知,互联网上任意两台主机可以建立通信,但是同个主机上运行了多个程序,当一个数据包从互联网上发来时,怎么知道这个数据包对应是哪个程序上使用?
这时候必须引入端口,它实际是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。
端口是0 ~ 65535之间的整数,0 ~1023的端口被系统占用,用户只能使用>1023的端口。
当启用某个应用程序时,若没有指定某个固定端口(例如NodeJs可以指定常用端口),程序会随机随机选用一个端口,然后和服务器对应端口联系。
所以传输层的功能:网络中的数据包发到接收方对应的哪个程序中,即端口到端口的通信
常见物理设备
四层交换机、四层路由器
UDP协议 和 TCP协议
数据包中加入端口信息,就需要新的协议
UDP协议
UDP数据包由“标头”和“数据”两部分组成,“标头”部分包含接收端口和发出端口,“数据”部分就是具体的内容。
UDP标头一共8个字节,总长度不超过65535字节,正好放进一个IP数据包。
把整个UDP包放入IP数据包的“数据”部分。整个IP数据包又放在以太网数据包的“数据”部分,最后形成的数据包格式:以太网标头-IP标头-UDP标头-数据
特点:网路中UDP数据包一旦发出,无法知道对方是否收到,不进行确定。容易实现但是网络可靠性低
TCP协议
TCP协议可近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包
特点:能够确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。
TCP数据包和UDP数据包一样,都是内嵌在IP数据包的"数据"部分。TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
TCP报文:
TCP三次握手四次挥手
应用层
规定应用程序的数据格式,以太网数据包:(以太网标头-IP标头-TCP标头-应用层数据包)
举个栗子:TCP协议可以为各种程序传递数据,比如网页、FTP、Email数据,应用程序接收到传输层的数据,需要对其进行解读,那么,必须要有不同的协议规定网页、FTP、Email各自不同的格式。这些应用程序协议就构成了应用层。
文末加个X-mind结构图
本文参考博客:
http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html
http://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html