前言
1977年,英国标准化协会向国际标准化组织(ISO)提议,为了定义分布处理之间的通信基础设施,需要一个标准的体系结构。于是在1979年,ISO发布了开放系统互联模型的最终版(OSI七层模型),目的是希望不同供应商的网络能够互相协同工作
虽然ISO组织定义了OSI网络模型,但是在实际使用中,人们把会话层和表示层归入应用层,分层少,简化了结构,更具灵活性。而由于传输层的TCP协议和网络层的IP协议是网络中两个最为重要的协议,所以用TCP/IP表示整个的网络结构
OSI分层模型结构作为一种理论上的模型,起着导向的作用。TCP/IP协议才是计算机网络中使用的最广泛的协议
网络模型分层好处:
- 各层独立,封装后只需提供向上或向下的接口即可
- 结构灵活,易于维护
- 易于标准制定
提到标准制定,在Internet整个发展过程中,所有思想和着重点都以一种称为 RFC(Request For Comments)的文档格式记录。针对每一种特定的TCP/IP应用,有相应的 RFC文档。所以,如果你想学习TCP/IP,阅读RFC文档不失为一种方法
网络
很多介绍计算机网络的书籍或文章中,开篇也是像上面这样,介绍OSI七层模型,然后从下往上,分别介绍物理层、数据链路层、网络层等各层的作用和包含的协议
但是这并不符合网络通信的数据传输流程,一条完整的网络报文是从应用层开始,从发送方的TCP/IP协议层层往下,通过该网络的路径,传送到对端的主机,然后从对端的TCP/IP协议层层往上,最终到达接收方的应用层
想要回答什么是网络,我们必须要清楚网络的构成有哪些,以及这些构成元素是如何运作的,知道了这些,也就知道了什么是网络
网络构成
网络是由全世界范围内的设备互联在一起形成的一张巨大的“网”,包括传统的计算机设备(PC和服务器等)和非传统的智能设备(手机、手表、家用电器、眼镜、汽车等)。在计算机网络中,我们把这些设备称为主机或端
虽然这些主机或端设备有几十亿之多,但是它们并不是网络的全部。主机通过物理层链路和分组交换设备连接在一起。物理层链路包括:同轴电缆、光纤、无线电频谱等。分组交换设备包括:交换机和路由器
当一台主机或端设备向另一台端设备发送数据时,发送端将数据从应用层层层封装,形成完整的网络报文,从网络接口卡进入通信链路,经由交换机和路由器选择适合的路径,最终发送到接收端主机
主机、交换机和路由器作为网络通信的参与者,它们遵循最基本的协议规则。这就像是两个不同国家的人用不同的语言进行对话,由于语言不同,对话也就不通
网络运行
前面讨论了构成网络的主要元素,但是网络信息是由分布在主机系统中的应用程序发送和接收,这些应用程序处于网络模型的最上层:应用层。它们采用的协议就是应用层协议
应用程序如何才能向另一台主机上的应用发送信息呢?
在TCP/IP网络模型中,应用层往下是传输层,传输层有两个协议:TCP和UDP。应用程序在应用层形成的数据必须经过传输层,换句话说,必须使用TCP和UDP。同样地,传输层往下是网络层,网络层要么使用IPv4协议,要么使用IPv6协议,没有其他可选项
由此可以看出,应用层由于应用程序的不同,通信方式多样,具有多种协议。而且随着以后科技水平的发展,社会的进步,会出现更多繁杂的应用,制定更多符合应用程序功能的应用层协议。但是,它们只要使用TCP/IP网络模型传输数据,就会使用TCP/UDP、IPv4/IPv6…
相对于应用层协议的多样性,传输层以下(包括传输层)的协议更具确定性和标准性,我们可以把它们认为是基础协议层,它们的协议栈统称为网络协议栈
这样的话,应用层对着的就是一个标准的固定的协议栈。一般标准的固定的功能模块,既要让其他的功能能够访问,又不想在访问时影响自己的内部逻辑,通常会对外提供接口,由接口驱动调用
而TCP/IP协议栈的对外接口就是Socket套接字功能,它是由运行网络协议栈内核的系统提供,向上为应用层协议提供网络支撑
上面是主机系统中应用程序所要经过的协议层和使用的协议,当然,列举的协议并不完全,更多的细节请参考下图
数据从应用层发出,经过协议栈由网卡发送到物理层链路上后,经过交换式设备后,到达目的主机,最终报文被处理后交给接收端的应用程序,这一系列的操作如果想要实现,报文经过的设备必须使用相同的协议
网络协议
什么是协议?
如果拿人类生活中的例子比较,就像是两个人在互相说话交流,他们必须使用相同的语言才能沟通;如果是两个人书面通信,他们必须使用相同的文字
由此可见,协议是双方共同遵守的约定和规范,而为了使数据在网络上能够从源端到目的端,网络通信的参与方必须遵守相同的规则,这就是网络协议。网络协议最终体现为在网络上传输的数据包的格式和处理顺序。
掌握计算机网络领域知识的过程就是理解网络协议的构成、原理和工作方式的过程
应用层
我们说网络协议是通信的基础, 应用才是目的。如果没有应用程序,网络协议存在的意义在哪里!
应用程序的开发和人类的生活习惯息息相关,人类使用它直面它,却无法“拿走”它。作为实现在操作系统中的程序,为了标识它们,系统会给不同的程序分配唯一标识:进程id(pid)
通信中的主机为了能够把网络数据交给正确的应用程序,需要根据应用程序的进程id识别它。这就像是快递员想要把快递交给收件人,也需要问问你的名字一样
上面讨论过,应用程序所在的应用层发送数据时使用socket套接字驱动网络协议栈形成完整报文,接收端应用程序也是通过套接字接收数据,所以套接字如果想要把数据交给正确的应用程序,就必须知道进程id。套接字在创建时会绑定对应pid
socket-------------------pid
套接字作为连接应用层和协议栈的桥梁,协议栈是不是也应该知道数据要交给哪个socket?
TCP/IP协议在传输层定义了端口的概念,和网络层的IP地址还有传输层协议一起,与socket绑定,用来识别套接字
应用程序数据在网络中的处理流程如图所示
一些知名的应用层协议比如HTTP、DNS、DHCP等,在这里就不展开了。用到哪个功能,到时候针对性地学习就可以了
传输层
传输层有两协议一标志,两个协议分别是tcp和udp,一个标志是它的端口号
关于tcp和udp的区别,我们举例说明:
假设创世纪时亚当和夏娃没在一起,他们分隔两个山头,中间是一道无尽的深渊,他们经常互相投送食物,有两种方式
为了符合美国的政治正确,我们用黑人形象
- 靠谱的,tcp传输
- 不靠谱的,udp传输
可以看出:
靠谱的投送(tcp传输),在投送前(传输前),需要先打招呼确认彼此(连接确认,tcp三次握手)
在投送的食物的过程中(传输数据),对方收到后会回复收到确认(ACK确认)。如果在规定的时间内没有回复收到(未回复ACK),会重新扔一个(重发丢失的数据)
彼此食物扔完后(数据传输完毕),会通知对方,最终离开(连接断开,tcp四次挥手)
相比较而言,不靠谱的投送(udp传输),没有打招呼确认(连接确认),也不会回复收到(确认ACK),更不会互告离别(连接断开)
TCP与UDP协议的不同:
TCP协议 | UDP协议 |
提供可靠性传输 | 不可靠传输 |
需要建立连接 | 无需连接 |
单播 | 单播、广播、组播 |
一些流行的应用使用的传输层协议:
可以看出:
需要保证数据正确送达的选择tcp,强调实时性的选择udp
完整的TCP通信过程如下:
相比较TCP,UDP报文段的结构更简单,但是它们都有端口号
端口号是传输层协议tcp和udp里的一个字段,2个字节,最大值65535
网络层
网络层最重要的协议就是IPv4协议和IPv6协议,前者是目前全球主流的网络协议,采用IPv4地址格式通信。后者是未来的趋势,采用IPv6地址格式通信
IPv4
IPv4首部格式如下:
从上图可以看出,IPv4地址有32比特,共4个字节。我们习惯的写法是:每个字节用十进制表示,中间用点号分隔开
192.168.10.1
IPv4地址由网络地址和主机地址组成,网络地址表示主机位于哪个局域网内,主机地址表示主机在这个局域网内的唯一标识
有两种表达方式:
- 192.168.10.1/24
- 192.168.10.1,子网掩码:255.255.255.0
根据网络地址和主机地址划分的不同,IPv4地址分为以下几类:
IPv6
IPv6首部格式如下:
从上图可以看出,IPv4地址有128比特,共16个字节。我们习惯的写法是:每两个用16进制表示,中间用冒号分隔开
AD80:0000:0000:0000:ABAA:0000:00C2:0002
如果中间连续有多个零,为了书写方便,可以用两个冒号表示
AD80::ABAA:0000:00C2:0002
当然,除了IP地址和首部格式不同外,一些其他处理逻辑也不同,比如根据IP地址寻址MAC采用的协议,分片方式等
目前我国正在推广从IPv4到IPv6迁移
数据链路层
为了将一个数据报从源主机传输到目的主机,数据报必须通过沿端到端路径上的各段链路传输。在通过特定的链路时,传输节点将数据报封装在链路层帧中,并将该帧传送到链路中
假如我想从上海去往昆明旅游,旅行社给我制定的最便利的方案是:自己开车先去往机场,然后坐飞机飞到昆明,到昆明机场后旅行社用大巴车接我去景点
这次旅行中有三段路,每段路都是直达的,虽然它们使用了不同的交通方式,但是它们都能把我送到相邻的地点
我就好比数据报,每个路段好比一条链路,每种运输方式好比一个链路层协议,而旅行社好比一个路由选择协议
由此可以看出,数据链路层实现的是相邻地点之间的数据传输
如何实现呢?采用数据链路层里的mac地址,它是识别局域网中主机的标识
mac地址,网络接口卡的硬件地址,也叫物理地址,有6个字节,每个字节用16进制表示,中间用冒号分隔开
08:00:20:0A:8C:6D
但是如果仔细回想下,从应用层发送数据时,并没有提供对方mac地址的信息。比如说浏览网站,知道的只有对方的网址(通过dns协议解析ip地址),也就是只知道对方的ip地址,而数据链路层又是如何获取的mac地址呢?
这里就需要一个重要的协议,ARP地址解析协议
顾名思义,根据ip地址解析它的mac地址。ARP协议工作原理如下:
主机A想要知道ip地址为128.1.2.15的主机的mac地址,于是发送一条arp request报文。由于它是一条广播报文,所以同网段内的所有主机都能收到,但是只有ip地址为128.1.2.15的主机E回复arp reply报文,报文里携带自己的mac地址
以太网
以太网技术在20世纪70年代中期由Bob Metcalfe和David Boggs发明,自从以太网发明以后,经过不断的演化和发展,几乎占领着现有的有线局域网市场。 今天,以太网是到目前为止最流行的有线局域网技术,而且到可能预见的将来它可能仍保持这一位置
以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容
IEEE 802.3标准指定了统一的以太网的技术标准,不同的以太网制式有不同的名称缩写,比如:10BASE-T、10BASE-2、100BASE-T、100BASE-TX、1000BASE-LX等
- BASE前面的数字指的是以太网的最大传输速率,10、100、1000代表10Mbps,100Mbps、1000Mbps(1Gbps)
- BASE表示采用基带传输
- 符号“-”后面的部分表示传输介质,T指的是双绞线,TX表示传输介质2对高质量的双绞线
车载以太网与传统以太网的区别
在汽车网络总线中,首先要考虑的是总线的稳定、安全和抗干扰的能力。所以传统以太网如果想迁移到汽车网络架构中,首先要解决的就是以太网总线的抗干扰的问题。
传统以太网线并不具备很强的抗干扰能力,怎么办呢?于是就有了两线制以太网,通过一对双绞线,实现以太网在汽车网络拓扑中的应用。
所以,传统以太网和车载以太网最大的不同,就是物理层的不同,相比较传统以太网采用2对双绞线即4根线,车载以太网只需要两根线,即两线制。
由此也就带来了网络接口的不同,传统以太网的网络接口是RJ45,而车载以太网是两线制接口。
这从它们的命名上可以看出,传统以太网称之为100base/1000base-Tx,车载以太网称之为100base/1000base-T1,这里的Tx和T1代表的就是传统以太网和车载以太网。
当然,物理层还有些细小的差异,了解的不多,这里就不再讨论。
二层,也就是物理链路层以上,包括TCP/IP协议栈,都是一样的,如果要说差别,也有,比如说车载以太网内节点的网卡IP地址通常是固定的,而传统以太网主机的IP地址一般都是DHCP动态分配的,其他还有比如直接广播地址由于会暴露内部IP地址禁止接收响应啊等等。
既然有这些不同,那么在把TCP/IP协议栈移植到到车内节点上使用时,就需要让以太网保持一致。因此,汽车整车和供应商成立了一个联盟,致力于推广以太网在汽车中的应用,这就是OPEN组织联盟,OPEN联盟又成立了很多技术委员会TC,每个委员会负责车载以太网中不同技术标准的制定,比如TC8就负责TCP/IP网络协议栈的一致性测试。