互联网协议知多少

[TOC]

这是我参与更文挑战的第 6 天,活动详情查看: 更文挑战

互联网协议知多少#

互联网协议是啥呢?#

在解释这个问题前,我们来了解一下,什么是网络通信,没有网络通信,这个协议都没得玩了

  • 网络

用物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到资源共享和通信的目的

  • 通信

人与人之间通过某种媒体进行的信息交流与传递

那么网络通信就不难理解了吧

网络通信 就是 通过网络将各个孤立的设备进行连接,通过信息交换实现人与人,人与计算机,计算机与计算机之间的通信。

局域网中最常用的有三个网络协议,我们在使用协议的时候,应根据需要来选择合适的网络协议

  • NETBEUI 协议

NetBios Enhanced User InterfaceNetBios 增强用户接口,它是 NetBIOS 协议的增强版本

它不需要附加的网络地址和网络层头尾,可以很快有效且适用于只有单个网络或整个环境都桥接起来的小工作组环境

  • IPX/SPX

Internetwork Packet Exchange/Sequences Packet Exchange

具有强大的路由功能,在复杂环境下具有很强的适应性,合于大型网络使用

  • TCP/IP 协议

Transmission Control Protocol/Internet Protocol,

网络层的 IP 协议和传输层的 TCP 协议组成,他是能够在多个不同网络间实现信息传输的协议簇,是 Internet 最基本的协议

什么叫做协议?#

字面上理解,协议,就是我和你约定好规则,我们按照规则办事情,互联网协议是啥意思呢

互联网协议又是个啥

互联网协议(Internet Protocol)是用于分组交换数据网络的一种协议,其任务仅仅是根据源主机和目的主机的地址来传送数据。互联网协议定义了寻址方法和数据报的封装结构。第一个架构的主要版本为 IPv4,目前仍然是广泛使用的互联网协议。

一言蔽之互联网协议就是在互联网上传输数据的规则

有没有发现,现在各大互联网厂商的 APP,已经是支持 IPv6 了

互联网协议,有一系列的协议组成,我们理解了这些协议,就理解了互联网的原理。互联网协议太过庞大和复杂,一下子讲清楚我的功力还达不到,在此分享一些我们开发中常用的一些协议

互联网协议就是定义了大家共用的标准,我们都按照标准来开发和使用,这大大提高了我们的开发效率和沟通成本

在网络的各层中存在着许多协议,接收方和发送方同层的协议必须一致否则一方将无法识别另一方发出的信息,那么这就乱套了是不。网络协议使网络上各种设备能够相互交换信息。

例如,小 A 自定义了一个 A 协议,小 B 自定义了一个 B 协议,这个时候,如果要将 A 协议和 B 协议做对接,那么就需要将 2 个协议做一个融合和取舍,甚至是其他的方式 , 且这大大的增加了沟通成本和风险因素

那么若小 A 和小 B 都遵守通用的共有协议,例如传输层的 TCP 协议,是不是只需要按照标准来开发就好了呢

这也是为什么每一个行业都需要相应的标准的原因之一,统一了标准,大家行事就方便多了

互联网协议能干啥?#

网络协议是网络上所有设备(网络服务器、计算机及交换机、路由器、防火墙等)之间通信规则的集合

它定义了通信时信息必须采用的格式和这些格式的意义。

大多数网络都采用分层的体系结构,每一层都建立在它的下层之上,向它的上一层提供一定的服务,而把如何实现这一服务的细节对上一层加以屏蔽

平时我们说的,二层交换机协议,三层协议等等都是啥意思呢?

例如一台设备上的第 X 层与另一台设备上的第 X层 进行通信的规则就是第 X层 协议。

说到层级,我们分享一下互联网的分层模型

分层模型#

互联网的逻辑实现被分成了很多层,每一层都有自己特有的功能,就像建房子,或者搭积木一样

需要一层一层的搭建,万丈高楼平地起,每一层都靠下一层支持。

平时作为用户,基本上接触到的只是最上面的那一层,也就是应用层,不知道或许是根本感受不到还有其他的层次

但是作为一个开发,我们还是要尽可能多的去详细了解每一层的原理,这样才能有效的指导我们的具体实践

开始放图~

就上图而言,互联网按照不同的模型划分会有不同的分层

但是不论按照什么模型去划分,我们都要明白,越往上的层越靠近用户,越往下的层越靠近硬件。

在软件开发中我们使用最多的是这张图中将互联网划分为五个分层的模型,也就是这张图中的中间这一列

  • 物理层
  • 数据链路层
  • 网络层
  • 传输层
  • 应用层

那我们就从下往上来一一看一看,每一层都是

  • 做些啥
  • 主要作用是啥
  • 数据包又是如何封装和传输的吧

物理层#

简单来看,这一层基本上是用双绞线、光纤、无线电波的方式来实现物理层,也叫做 实物理层

再简单来看,这一层就是把各个网络设备连接起来,让其可以传输 0 1 0 1 的电信号

数据链路层#

这一层处于” 物理层” 的上方,确定了物理层传输的 0 和 1 的分组方式及代表的意义

该层主要是以太网

以太网规定,一组 电信号构成一个数据包,叫做” 帧”(Frame)。

每一帧分成两个部分:包头(Head)和数据(Data)。其中” 包头” 包含数据包的一些说明项,比如发送者、接受者、数据类型等等;” 数据” 则是数据包的具体内容。” 包头” 的长度,固定为 18 字节。” 数据” 的长度,最短为 46 字节,最长为 1500 字节。因此,整个” 帧” 最短为 64 字节,最长为 1518 字节。如果数据很长,就必须分割成多个帧进行发送。

有没有想过,我们咋标识是谁发的,或者该数据包是要发给谁,如何指定?在哪里指定?如何实现?

以太网规定,连入网络的所有设备都必须具有网卡接口

数据包必须是从一块网卡,传送到另一块网卡。网卡的地址,就是数据包的发送地址和接收地址,这叫做 MAC 地址。

每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,因此,很多软件校验设备唯一性的时候,大多会通过校验 MAC 地址来判断

MAC 地址是啥样子的?

如上图,MAC 地址通常用 12 个十六进制数表示,也就是说长度是 48 个二进制位

  • 前 6 个十六进制数是厂商编号
  • 后 6 个是该厂商的网卡流水号

有了 MAC 地址,你就可以上天了吗?到底咋传输?

我们一般会使用 ARP 协议来获取接受方的 MAC 地址,向本网络内所有计算机都发送(以广播的方式),让每台计算机读取这个包的” 包头”,找到接收方的 MAC 地址,每台计算机读取包头中接收方 MAC 地址后,与自身的 MAC 地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。

如图,一个包源 MAC 是 AA:BB:CC:DD:EE:FF,目的 MAC 是 FF:EE:DD:CC:BB:AA,那么,这个包会发到同局域网的所有朋友,每一个朋友都会读取这个包的数据,判断目的 MAC 地址和自己的 MAC 地址是否一致,

  • 若一致则处理
  • 若不一致,则丢弃

ARP 协议来获取接受方的 MAC 地址,有了 MAC 地址之后,如何把数据准确的发送给接收方呢?其实这里以太网采用了一种很” 原始” 的方式,它不是把数据包准确送到接收方,而是向本网络内所有计算机都发送,让每台计算机读取这个包的” 标头”,找到接收方的 MAC 地址,然后与自身的 MAC 地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。这种发送方式就叫做” 广播”(broadcasting)。

网络层#

上面讲到包数据中写好源 MAC,目的 MAC,就可以在同一个局域网中找到接受方,可是如果是源机器和目的机器不在同一个网段的话咋整?

理论上依靠 MAC 地址,你电脑的网卡就可以找到身在世界另一个角落的某台电脑的网卡了,但是这种做法有一个重大缺陷就是以太网采用广播方式发送数据包,所有小伙伴都要去读你的这个包,效率低,且发送的数据只能局限在发送者所在的子网络

如果两台计算机不在同一个子网络,广播是传不过去的。

用咱们的小脑袋想一下,如果你发送的一个消息,世界上的每一个机器都能收到,那么网络得多拥堵啊

还是有办法解决滴

那就判断是不是在同一个子网嘛,

  • 如果是同一个子网络,就采用广播方式发送
  • 不是在同一个子网 , 那就采用路由方式发送

这个时候,就有了网络层

网络层引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络

这套地址就叫做网络地址,简称网址

那么网络层具体是咋传输数据的咧?

我们要知道如下几个点

  • 每台计算机有了两种地址,一种是 MAC 地址,另一种是网络地址

  • 两种地址之间没有任何联系,MAC 地址是绑定在网卡上的,网络地址则是网络管理员分配的

  • 网络地址帮助我们确定计算机所在的子网络,MAC 地址则将数据包送到该子网络中的目标网卡

因此,我们从上述描述就可以知道,我们在处理网络数据包的时候,肯定要先处理网络地址,再处理 MAC 地址,这也就是后面会说到的数据包的传输流程

数据链路层,用 MAC地址,协议用 ARP协议

那么,网络层,现在我知道了用网络地址,那么是用啥协议?

使用网络地址协议,叫做 IP协议

协议所它所定义的地址,就被称为 IP 地址

现在广泛采用 IPv4IPv4 这个版本规定,

  • 网络地址由 32 个二进制位组成
  • 通常用分成四段的十进制数表示 IP 地址,从 0.0.0.0 一直到 255.255.255.255

img

通过 IP协议发送的数据,就叫做 IP数据包

IP数据包也分为” 包头” 和” 数据” 两个部分:

  • ” 包头” 部分主要包括版本、长度、IP地址等信息,
  • ” 数据” 部分则是 IP数据包的具体内容
  • IP数据包的” 包头” 部分的长度为 20 到 60 字节,整个数据包的总长度最大为 65535 字节

顺带提一下 IPv6

随着互联网的发展,现在 IPv6 也逐渐使用的慢慢变多,

IPv6 不仅能解决网络地址资源数量的问题,而且还解决了多种接入设备连入互联网的障碍问题,并且具有更大的地址空间和更高的安全性。

IPv6 有 3 种表示方法:

  • 冒分十六进制表示法

X:X:X:X:X:X:X:X , 每一个 X 代表着一个 4 位的十六进制数 , 如 EBCD:CF01:2345:1789:ABCD:EF01:2385:3789

  • 0 位压缩表示法

一个 IPv6 地址中间可能包含很长的一段 0,可以把连续的一段 0 压缩为:: , 但为保证地址解析的唯一性,地址中:: 只能出现一次

例如:

0:0:0:0:0:0:0:1 → 表示为 ::1
0:0:0:0:0:0:0:0 → 表示为 ::
  • 内嵌 IPv4地址表示法

IPv4 地址会嵌入 IPv6 地址中,X:X:X:X:X:X:a.a.a.a,前 96bit位采用冒分十六进制表示,而最后 32bit位地址则使用 IPv4 的点分十进制表示

例如:

::192.168.0.1
::FFFF:192.168.0.1   // :: 代表多个0

传输层#

看到这里,小伙伴肯定知道,数据包传送的过程中,肯定不止 MAC 地址和网络地址那么简单,要不然就不会有传输层和应用层了。

经过上面说到的 网络地址MAC 地址 我们已经可以在互联网上任意两台主机上建立通信

可是基于网络和应用的复杂性,问题又来了

同一个设备上的多个应用程序都需要收发信息,我们咋区分哪一个数据包是给哪个程序的,又咋区分哪个数据包是哪个程序发出去的?这个咋整?

比如说,同样是数据包,我们电脑上的 WX 数据包,和 QQ 数据包,是咋区分出来的?

想一想,基于现有的协议肯定不够玩了,那就加码吧

添加一个参数,表示这个数据包到底供哪个程序(进程)使用。

此时,端口 Port 就出现了,

  • 它就是每一个使用网卡的程序的编号

  • 每一个端口号,标志一个可执行程序

  • 端口号是,0 到 65535 之间的一个整数,正好 16 个二进制位

  • 0 - 1023 的端口被系统占用,用户只能选用大于 1023 的端口

现在,万事俱备了,用 IP + 端口,我们就能实现唯一确定互联网上一个程序,进而实现网络间的程序通信了

那么把这个端口号加入到数据包中,又催生出了一些协议,那就是传输层的协议

  • TCP 协议
  • UDP 协议

UDP 协议,就是在数据前面加上端口号

UDP 数据包,也是由” 包头” 和” 数据” 两部分组成:

  • ” 包头” 部分主要定义了发出端口和接收端口,一共只有 8 个字节
  • ” 数据” 部分就是具体的内容。总长度不超过 65,535 字节,正好放进一个 IP 数据包。

UDP 协议的优点

  • 比较简单,容易实现

缺点

  • 可靠性较差,一旦数据包发出,无法知道对方是否收到

基于以上缺点,就有了 TCP 协议,来提高网络的可靠性

TCP 协议优点

  • 能够确保数据不会遗失
  • 安全,可靠的传输

缺点

  • 过程复杂
  • 实现困难
  • 消耗较多的资源

TCP 数据包没有长度限制,理论上可以无限长,可是为了保证网络的效率,通常 TCP数据包的长度不会超过 IP数据包的长度,也就是小于 65,535字节,这也确保单个 TCP数据包不必再分割。

关于 TCP 为什么可靠,什么措施来保证可靠的,TCP 会涉及到哪些原理,我们后续的文章再详细分享

应用层#

来到了应用层,万里长征慢慢的看到了希望

应用层的作用就是规定应用程序使用的用语规范,应用层的协议包括哪些呢?举个例子

  • 用于 Web 浏览的 HTTP 协议
  • 用于传输文件的 FTP 协议
  • 用于邮件的的 SMTP
  • … 等等

这些协议就组成了互联网协议的应用层

如下图所示,发送方的 HTTP请求的源数据经过互联网的传输过程中会依次添加各个层级对应协议包头信息

接收方收到数据包之后再依次根据层级协议依次解包得到源数据

总结#

  • 简单介绍了网络通信,互联网协议
  • 介绍了网络五层模型的每个层级的产生原因,每一层对应的协议是如何出现的
  • 数据包在每个层级的封装过程

欢迎点赞,关注,收藏#

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里,下一次 分享 GO 的网络编程

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~

本作品采用《CC 协议》,转载必须注明作者和本文链接
关注微信公众号:阿兵云原生