简单认识网络协议

隐身守侯 提交于 2020-03-06 00:54:20

简单认识网络协议

通过浅谈互联网协议,我们已经了解了TCP/IP的参考模型,对网络的分层管理有了有一个概念。我们知道计算机之间的通信,靠的就是这些互联网协议(IPS,Internet Protocol Suite)来保障的。下面我们将通过最底层数据链路层到最顶层应用层,来简单的了解一下计算机通信的背后到底是怎么样子。

0x01 数据链路层

image-20200305140118929

​ 我们的电脑如果想要上网,首先要干嘛?想必大家会吧。我们要么连接WiFi,要么插根网线。之后我们就可以在广阔的物联网上冲浪,浏览浏览新闻,刷刷B站…(打住,回归正题。)网线,WiFi,无非就是我们把电脑连接起来的方式。利用这些电气属性,我们可以发送和接受0,1信号。这样计算机之间就建立了联系。

​ 能发送0/1信号,计算机就可以进行交流了,最初的时候,各家都有各个的语言,但计算机又不像我们人类一样能学会多种语言。它有点笨,不能同时掌握多种方式的0/1信号的解读方式。

但慢慢地,一种叫做"以太网"(Ethernet)的协议出现了,并占据了主导地位。

以太网协议

​ 以太网规定了一种电信号的分组方式,一组电信号构成一个数据包,称做以太网帧 ( Frame )

../_images/97c13f044de260baf0ed8051091dd251.png

​ 以太网帧,分为 头部 ( Header )、 数据 ( Data )以及 校验和 ( Checksum )总共 3 大部分。

头部包含数据包的一些说明项,比如发送者、接受者、数据类型等等,头部固定为18个字节头部依次是一个 6 字节长的 目的地址 ,用于标记数据由哪台机器接收; 一个 6 字节长的 源地址 ,用于标记数据由哪台机器发送; 一个 2 字节长的 类型 ,用于标记数据包该如何处理, 最后**4**字节表示承载的是一个 IP 包。

数据 可以是任何需要发送的信息,长度可变, 461500 个字节。 数据还有另一个称谓, 叫做负荷 ( Payload )。

网卡

​ 每台计算机进行网线通讯,都要借助一个硬件设备,网卡,简称NICNICNetwork Interface Controller 的缩写。网卡则负责将比特流转换成电信号发送出去和将检测到的电信号转换成比特流并接收。

​ 发送数据时,内核协议栈负责封装以太网帧( 目的地址 、源地址 、类型和数据并计算校验和),并调用网卡驱动发送; 接收数据时,负责验证目的地址、校验和并取出数据部分,交由上层协议栈处理。

MAC地址

image-20200305150500888

​ 以太网数据包的头部包含了发送者和接受者的信息。那么如何标识发送者和接受者呢?这时就要用到MAC地址了。每块网卡出厂时,预先分配了一个全球唯一的 MAC地址 ,并烧进硬件。有些设备也支持更改MAC地址。以太网规定,连入网络的所有设备,都必须具有"网卡"接口。数据包必须是从一块网卡,传送到另一块网卡。而网卡的地址,就是数据包的发送地址和接收地址,就是MAC地址。所以说有了MAC地址,就可以定位网卡和数据包的路径了。

MAC 地址 6 个字节可以划分成两半部分:

  • 3 字节长的 厂商代码 ( OUI ),由国际组织分配给不同的网络设备商;
  • 3 字节长的 序列号 ( SN ),由厂商分配给其生产的网络设备,也就是流水号;

​ MAC地址采用冒分十进制来表示,比如00:1A:3F:F1:4C:C6。冒分十六进制总共需要 17 个字节。 如果算上结尾处的 \0 ,则是18个,相当于扩大了三倍。

数据广播

image-20200305154229574

​ 计算机采用广播的方式发送数据包,它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。如上图中,1号计算机2号计算机发送一个数据包,同一个子网络的3号、4号、5号计算机都会收到这个数据包。然后它们读取这个包的"头部",找到接收方的MAC地址,然后与自身的MAC地址相比较,如果两者相同,就接受这个包,做进一步处理,否则就丢弃这个包。这种发送方式就叫做**“广播”(broadcasting)**.

0x02 网络互连层

数据链路层局限性

​ 理论上,通过以太网协议,靠MAC地址可以完成任意一台计算机的通讯,但是世界范围上的计算机规模巨大。若以太网采用广播方式发送数据包,互联网上每一台计算机都会收到所有包,那会引起灾难。引发广播风暴。而且保证所有计算机在同一子网,也是一大难题。

​ 所以必须找到一种方法,能够区分哪些MAC地址属于同一个子网络,哪些不是。如果是同一个子网络,就采用广播方式发送,否则就采用路由方式发送。

​ 为了解决数据链路层的局限性,引入了新的一层,以及新的地址。也就是网络互联层 ,新的地址就是 网络层地址 。 在网络层转发数据的中间节点,称为 、网络层路由 。 网络层主要职责在于:实现全球寻址以及数据路由 。

​ 每台参与网络通讯的计算机分配一个唯一的地址,即网络层地址 。网络层地址按网络拓扑分配,保证组织内部的地址是连续的。

​ 于是网络层出现以后,每台计算机有了两种地址,一种是MAC地址,另一种是网络地址。两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一起。网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。

IP协议

IP(Internet Protocol , 互联网协议)主要用于互联网通信。IP协议用于将多个包交换网络连接起来,他在原地址和目的地址之间传输数据包,还提供对数据大小的重新组装功能,以适应不同网络的要求。

IP协议的作用主要有两个:

  • 一个是为每一台计算机分配IP地址
  • 另一个是确定哪些地址在同一个子网络。

IP 地址

image-20200305164918951

规定网络地址的协议,叫做IP协议。它所定义的地址,就被称为IP地址。

一个IP地址由两部分组成:

  1. 网络号:识别该地址所属的网络,它由Internet权力机构分配。
  2. 主机号:指明网络内的主机,它由各个网络的管理员统一分配。

编址方案:

  1. IPv4编址方案

    • 由4个字节(十进制表示)组成的二进制值进行识别,中间用圆点分开,这种方法叫做点分十进制表示法。
  2. IPv6编址方案

    • 每个IP地址有16个字节(128位二进制数),其完整格式用8段16进制表示,各段之间用冒号分隔。

习惯上,我们用分成四段的十进制数表示IPV4地址,从0.0.0.0一直到255.255.255.255。

子网掩码

子网掩码用于屏蔽IP地址的一部分以区别网络标识和主机标识。子网掩码把所有的网络位(二进制)用1来标识,主机位用0来标识

  • 例如:如果将子网掩码设置为255.255.255.0,则对于IP地址192.168.1.X,其网络标示部分为192.168.1;主机标示为:X

可以利用子网掩码判断两台计算机是否在同一子网内.

  • 将其IP地址和子网掩码做按位与运算,如果得到结果相同即在同一个子网内。

IP数据包

​ 网络层的数据包结构,包含 地址数据 以及 类型 等信息。 网络层包 承载在 数据链路层包 之上,换句话讲,数据链路层包 数据负载 就是一个 网络层包

../_images/bed8aacc992dc152c1bf79ff7c5a9033.png
  • 版本 ( Version ),用于标识 协议版本 ,在协议发展迭代的同时保持高度可兼容性。
  • 首部长度 ( Internet Header Length 或 IHL ),由于 IP 头部长度一定为 4 的整数倍, 这个字段以 4 字节为单位。典型的 IP 报文首部为 2L0 字节, IHL=5
  • 总长度 ( Total Length ),即 IP 报文总长度,字段长度为 16 位,因此 IP 报文最大长度为 216=65535216=65535 。
  • 源地址 ( Source Address ),据此接收方可以获悉发送源。
  • 目的地址 ( Destination Address ),中间节点据此转发报文。
  • 可选选项 ( Options ),通过 首部长度 可以判断报文是否带可选选项。

IP数据包的头部部分的长度为20到60字节,整个数据包的总长度最大为65535字节。因此,理论上,一个IP数据包的"数据"部分,最长为65,515字节。前面说过,以太网数据包的"数据"部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,就需要分割成几个以太网数据包,分开发送。

ARP协议

​ 如果两台主机在同一台子网中,可以用ARP协议,得到对方的MAC地址。ARP协议主要是发出一个数据包(包含在以太网数据包中),其中填写所要查询主机的IP地址,在对方的MAC地址这一栏,填写FF:FF:FF:FF:FF:FF,表示这是一个广播地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址,与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址,否则就丢弃这个包。

​ 总之,有了ARP协议之后,我们就可以得到同一个子网络内的主机MAC地址,可以把数据包发送到任意一台主机之上了。

0x03 传输层

端口

image-20200301230615579
  • 物理上的端口。如ADSL Modem、集线器的接口。
  • 逻辑意义上的端口,即进程标识
    • 端口号的范围从0到65535
    • 1000以内的端口号大多被标准协议所占用,所以应用程序中可以自由使用的端口号一般都使用大于1000的值。如宝塔面板的8888端口。

"传输层"的功能,就是建立"端口到端口"的通信。相比之下,"网络层"的功能是建立"主机到主机"的通信。只要确定主机和端口,我们就能实现程序之间的交流。

​ 有句话这样说IP地址决定主机,而端口决定进程。Unix系统把主机+端口,叫做**“套接字”(socket)**。有了它,就可以进行网络应用程序开发了。

UDP协议

在数据包中加入端口信息,这就需要新的协议。所以就有了UDP协议。

UDP数据包,也是由**“头部"和"数据”**两部分组成。

"头部"部分主要定义了发出端口和接收端口,**“数据”**部分就是具体的内容。然后,把整个UDP数据包放入IP数据包的"数据"部分。

​ UDP数据包**“头部”**一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。

TCP协议

​ UDP协议虽然比较简单,但是数据容易丢失。为了提高网络可靠性,TCP协议就诞生了。

​ TCP数据包和UDP数据包一样,都是内嵌在IP数据包的"数据"部分。TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。

0x04 应用层

​ 应用程序收到"传输层"的数据,接下来就要进行解读。**“应用层"的作用,就是规定应用程序的数据格式。**以便方便解读。如TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了"应用层”。

下图则表示了数据包的添加过程,

img

0x05 参考资料

[1] 《HTTP权威指南 (图灵程序设计丛书)》.[美]David Gourley Brian Totty Marjorie Sayer Sailu Reddy Aushu Aggarwal

[2] 互联网协议入门(一)

[3] 网络传输协议

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!