前言

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网络协议栈的一致性测试。


计算机网络:从入门到放弃相关推荐

  1. 计算机网络从入门到放弃,自由讨论 | KBQA从入门到放弃—入门篇

    ➊ KBQA 的定义/概念/应用前景是什么? 知识库问答(knowledge base question answering, KB-QA)即给定自然语言问题,通过对问题进行语义理解和解析,进而利用知 ...

  2. Lwip从入门到放弃之(一)---基础网络知识扫盲

    Lwip从入门到放弃之-基础网络知识扫盲(一) 由于工作中用到了有关Lwip的有关知识,本人作为一个网络通信协议的门外汉,打算系统的学习一下以太网通讯的有关知识.而Lwip作为一款开源的轻量级TCP/ ...

  3. AI从入门到放弃2:CNN的导火索,用MLP做图像分类识别?

    来源 | 腾讯知乎专栏 作者 | AIoys(腾讯员工,后台工程师) 项目文档和代码在此:github项目地址: https://github.com/zsysuper/AI_Notes ▌一.前言 ...

  4. AOP埋点从入门到放弃(二)

    其实人最大悲哀莫过于知道自己想要什么,却不知道怎么坚持!最近迷恋上了死侍 其实和我平时的状态差不多,以一个混子的心态去做任何事情,往往成功的概率会更大!!! 一张图片镇楼!!! 上文说到了Aspect ...

  5. 入门到放弃node系列之网络模块(二)

    为什么80%的码农都做不了架构师?>>>    前言 本文首发[一名打字员] 上一节我们刚刚介绍完node的HTTP和HTTPS模块,相信我们也对nodejs有了更深层次的理解,接下 ...

  6. webpack - vue Component 从入门到放弃(三)

    离上一篇已经一个星期了,人的拖延症是没法救的,今晚趁着蒙蒙春雨,来抒发抒发情感. 上一篇简单介绍了webpack的配置,这里稍微再做一一下延伸 插件 插件可以完成更多 loader 不能完成的功能.插 ...

  7. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

    前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...

  8. python ** 运算符_Python从入门到放弃运算符(2)

    摘要:上一篇Python从入门到放弃-运算符(1),讲了Python的运算符中的算术运算符.赋值运算符.比较(关系)运算符,这篇继续讲Python的运算符. 逻辑运算符 逻辑运算符是对真和假两种布尔值 ...

  9. python从入门到放弃系列恶搞短片-太惨!学Python方法用错,直接从入门到放弃!...

    原标题:太惨!学Python方法用错,直接从入门到放弃! 从你开始学习编程的那一刻起,就注定了以后所要走的路-从编程学习者开始,依次经历实习生.程序员.软件工程师.架构师.CTO等职位的磨砺:当你站在 ...

  10. 为什么叫python编程-月薪上万的Python编程,为什么你还没入门就放弃了?

    "大家都是怎么学Python 的?我学了一个月,感觉自己怎么学都学不进去啊,还是一脸懵--学习前我有做过规划,现在连入门都不算,我应该怎么办啊!!!求大神给一个学习思路!求大神讲解入门要重点 ...

最新文章

  1. 一文览尽ToF深度相机技术
  2. scala之Actors
  3. Spring 更好地处理 Struts 动作
  4. ios Sqlite数据库增删改查基本操作
  5. Go语言学习教程:xorm表基本操作及高级操作
  6. codeforces1303 F. Number of Components(并查集+添_正序、删_逆序)
  7. (递归)斐波那契数列
  8. 侧边栏配置_企业微信上线“聊天侧边栏”功能,可在外部会话时快捷使用应用...
  9. 《scikit-learn》数据预处理与特征工程(二)数值转换
  10. a标签点击不跳转的几种方法
  11. 如何让你自己做的网站他人可以访问——外网访问
  12. Python-with open() as f写入
  13. 最全数据集网站汇总,绝对是一个金矿请查收!
  14. 社区版emqx安装后修改登入到dashboard密码 http://ip:18083/
  15. 超700名研究生被清退,硕博生毕业,更难了
  16. 短视频剪辑技巧,4法则创作热门视频
  17. 用java计算某年某月的天数
  18. java判断任意两数的最小公倍数和最大公约数
  19. 通信算法之九十四:4G LTE通信系统 PBCH/PCFICH/PHICH信道处理流程
  20. 如何看懂电路图之数字逻辑电路

热门文章

  1. 2015年至2017年的国产电影圈的数据分析
  2. 很舒服的几句话,心静,人就不会累了
  3. 阿里云服务器入门使用
  4. 使用python计算与你投缘与无缘的生肖
  5. 7年弹指一挥间:iOS演进史
  6. Smartbi大数据分析工具有哪些功能?
  7. 傅里叶变换F(f)与F(w)的探究——以余弦函数为例
  8. 小韦系统装工行网银U盾驱动的方法
  9. 3.4.3 区域与图像的平均灰度值
  10. 计算机太极之光,且看今朝,刚柔并济,叱咤风云