一层层了解网络通信协议

6,522 阅读26分钟

一、理论五层模型

互联网的实现,分为好几层,每一层都有自己特有的功能,而且每一层都靠下一层支持。用户接触到的,只是最上面的一层,我们称为应用层,要理解互联网,必须从最下层开始,自下而上的理解每一层的功能。

我们常见的网络模型,有以下三种:

  • OSI七层模型

  • 理论五层模型

  • TCP/IP四层模型

它们之间的关系如下图所示 三种模型间的关系

其中,理论五层模型是综合OSI七层TCP/IP四层的优点,采用的一种原理体系结构。我们接下来的探讨也是基于理论五层模型来展开的。

理论五层模型的结构如下图 理论五层模型

各层的作用如下:

  • 应用层
    • 直接为用户的应用进程提供服务
    • 常见的协议有HTTP、HTTPS、SMTP、TELNET
  • 传输层
    • 传输层任务是为应用层进行通信的两个进程之间提供一个可靠的端到端服务,使它们看不到传输层以下的数据通信的细节。
    • 端到端意思是数据来自某个端口,再传送给指定的端口
    • 端口:一个0到65535间的整数,用来指定特定应用程序
    • 常见的协议有TCP、UDP
  • 网络层
    • 网路层的任务是选择合适的路由,使分组能够准确的按照地址找到目的地,并交付给目的地的传输层。
    • 网络层协议为IP协议
  • 数据链路层
    • 数据链路层是将数据组合为一个个的,确定电信号的数据包格式。
    • 数据链路层的协议为以太网协议
  • 物理层
    • 物理层定义了把电脑之间连接起来所用设备的标准,在网络中的网络信号都是通过0和1的电信号进行传输的。

简单说,越下面的层,越靠近硬件;越上面的层,越靠近用户。

协议是什么

每一层都是为了完成某一种功能。为了实现这些功能,需要遵守一些共同的规则,这些规则就是协议(protocol)

互联网的每一层,都定义了很多协议。这些协议的总称,叫做互联网协议(Internet Protocol Suite),它们是互联网的核心。

下面的内容中,我们通过每一层的功能的介绍,对每一层中的主要协议所起作用进行讲解。

二、物理层

电脑要进行联网,需要把电脑通过各种设备连接进网络,设备有光缆、电缆、双绞线、无限电波等方式。 这就是物理层,它就是把电脑连接起来的物理手段,它主要规定了网络的一些电气特性,作用是传输0和1的电信号。

三、数据链路层

1.定义

物理层是用于传输信号的介质,它传输的是0和1的电信号。但是关于电信号如何分组,每个信号位有何意义并没有规定。

这就是数据链路层的功能,它在物理层的上方,确定了0和1的分组方式,用于两个设备(同一种数据链路结点)之间进行信息传递。

2.以太网协议

早期的时候,每家公司都有自己的电信号分组方式。逐渐地,一种叫做以太网(Ethernet)的协议,占据了主导地位。

以太网规定,一组电信号构成一个数据包,叫做帧(frame),每一帧分为两个部分:标头(Head)数据(Data)以太网协议帧结构

  • 标头和数据
    • 标头包含数据包的一些说明项,比如发送者、接收者、数据类型等;数据则是数据包具体内容。
  • 标头和数据的限制
    • 标头的长度,固定为18字节数据的长度,最短为46字节,最长为1500字节。因此,整个最短为64字节,最长为1518字节。如果数据很长,就必须分割成多个帧发送。

MTU(最大传输单元)

MTU是链路层对物理层的限制。

  • 以太网帧数据段长度规定为46-1500字节,这个最大值1500字节称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。
  • 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU,则需要对数据包进行分片。

MTU对IP协议的影响

由于链路层存在MTU的限制,导致网络层的报文如果超过1500字节,就必要要对其进行分片发送。

  • 将较大的IP包分成多个小包,并给每个小包打上标签,每个小包IP协议头的16位标识(id)都是相同的,这样在重组的时候就知道这个小包来自于哪个报文。
  • 每个小包的IP协议头3位标志字段中, 第2位MF置为0, 表示允许分片, 第3位DF来表示结束标记(当前是否是后一个小包, 是的话置为1, 否则置为0)。
  • 到达对端时再将这些小包按顺序重组, 拼装到一起返回给传输层。一旦这些小包中任意一个小包丢失,接收端的重组就会失败,但是IP层不会负责重新传输数据。

MTU对UDP协议的影响

  • 只要UDP报文中携带的数据超过过1472(1500 - 20(IP首部) - 8(UDP首部)),那么就会在网络层分成多个IP数据报
  • 这些IP数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加。
  • 局域网环境下,建议UDP数据控制在1472字节以下;在Internet环境下,建议将UDP数据控制在548字节以下

MTU对TCP协议的影响

  • TCP报文的长度不能无限大,依然要受制于MTU, TCP的单个数据报的最大消息长度称为MSS(Max Segment Size)
  • TCP在建立连接时,首先会和对方协商MSS的大小(也只能在三次握手时协商,否则就是默认值536字节)。理想的情况下,MSS的值正好是在IP不会被分片处理的大长度(这个长度仍然是受制于数据链路层的MTU)
  • 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。然后双方得知对方的MSS值之后选择较小的作为最终的MSS。MSS的值就是在TCP首部的40字节变长选项中(kind=2)。
  • MSS = MTU - TCP首部 - IP首部,既TCP报文的数据长度。

3.MAC地址

上面我们提到,以太网数据包的标头,包含了发送者和接受者的信息。那么,发送者和接受者是如何标识呢?

以太网规定,连入网络的所有设备,都必须具有网卡接口。数据包必须是从一块网卡,传送到另一块网卡。网卡的地址,就是数据包的发送地址和接收地址,这叫做MAC地址

网卡

每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是48个二进制位,通常用12个十六进制数表示。

MAC地址

前6个十六进制数是厂商编号,后6个十六进制数是该厂商的网卡流水号。有了MAC地址,就可以定位网卡和数据包的路径了。

4.广播

定义地址只是第一步,后面还有更多的步骤:

  • 1)首先:一块网卡怎么会知道另一块网卡的MAC地址?

    回答是有一种ARP协议,可以解决这个问题。这个在本文网络层中介绍,这里只需要知道,以太网数据包必须知道接收方的MAC地址,然后才能发送。

  • 2)其次:就算有了MAC地址,系统怎样才能把数据包准确送到接收方?

    回答是以太网采用了一种很原始的方式,它不是把数据包准确送到接收方,而是向本网络内所有计算机发送,让每台计算机自己判断,是否为接收方。

广播

上图中,5号计算机向3号计算机发送一个数据包,同一个子网络的1号、2号、3号、4号、6号计算机都会收到这个包。它们读取这个包的标头,找到接收方的MAC地址,然后与自身的MAC地址相比较,如果两者相同,就接收这个包,做进一步处理,否则就丢弃这个包。这种发送方式就叫做广播(broadcasting)。

有了数据包的定义、网卡的MAC地址、广播的发送方式,"链接层"就可以在多台计算机之间传送数据了。

四、网络层

1.网络层的由来

以太网协议,依靠MAC地址发送数据。理论上,单单依靠MAC地址,成都的网卡就可以找到休斯顿的网卡了,技术上是可以实现的。

但是,这样做有一个重大的缺点。以太网采用广播方式发送数据包,所有成员人手一包,不仅效率低,而且局限在发送者所在的子网络。也就是说,如果两台计算机不在同一个子网络,广播是传不过去的。这种设计是合理的,否则互联网上每一台计算机都会收到所有包,那会引起灾难。

互联网是无数子网络共同组成的一个巨型网络,很像想象成都和休斯顿的电脑会在同一个子网络,这几乎是不可能的。

子网络

因此,必须找到一种方法,能够区分哪些MAC地址属于同一个子网络,哪些不是。如果是同一个子网络,就采用广播方式发送,否则就采用路由方式发送。(路由的意思,就是指如何向不同的子网络分发数据包,这是一个很大的主题,本文不涉及。)遗憾的是,MAC地址本身无法做到这一点。它只与厂商有关,与所处网络无关。

这就导致了网络层的诞生。它的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做网络地址,简称网址

于是,网络层出现以后,每台计算机有了两种地址,一种是MAC地址,另一种是网络地址。两种地址之间没有任何联系,MAC地址是绑定在网卡上的,网络地址则是管理员分配的,它们只是随机组合在一起。

网络地址帮助我们确定计算机所在的子网络,MAC地址则将数据包送到该子网络中的目标网卡。因此,从逻辑上可以推断,必定是先处理网络地址,然后再处理MAC地址。

2.IP协议

规定网络地址的协议,叫做IP协议。它所定义的地址,就被称为IP地址。目前,广泛采用的是IP协议的第四版和第六版,分别称为IPv4和IPv6。

1) IPv4

IPv4地址

IPv4定义

  • IPv4规定,网络地址由32个二进制位组成;
  • 习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255。

子网掩码

互联网上的每一台计算机,都会分配到一个IP地址。这个地址分成两个部分前一部分代表网络,后一部分代表主机。比如,IP地址14.215.177.39,这是一个32位的地址,假定它的网络部分是前24位(14.215.177),那么主机部分就是后8位(最后的那个1)。处于同一个子网络的电脑,它们IP地址的网络部分必定是相同的,也就是说14.215.177.2应该与14.215.177.1处在同一个子网络。
但是,问题在于单单从IP地址,我们无法判断网络部分。还是以14.215.177.39为例,它的网络部分,到底是前24位,还是前16位,甚至前28位,从IP地址上是看不出来的。
那么,怎样才能从IP地址,判断两台计算机是否属于同一个子网络呢?这就要用到另一个参数子网掩码(subnet mask)

子网掩码

  • 所谓子网掩码,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.254.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
  • 知道子网掩码,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行按位与运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。

NAT

我们知道,IPv4的地址只有32位,地球上网民数量已经远远超出这个数字,那么,为啥至今还没出现地址枯竭呢?

因为我们还有一些技术,可以变相的缓解地址不足,比如NAT技术。

NAT(Network Address Translation,网络地址转换) NAT

  • 每一个小的局域网,都会使用一个网段的私网地址,在与外界连接时,再变换成公网地址。这样一来,几十个或几百个电脑,都只需要一个公网地址。
  • 甚至还可以私网套私网,NAT套NAT,一层一层套。这样一来,大大节约了公网IP地址数量。正因为如此,才让我们“续命”到了今天,不至于无法上网。
  • 但是,NAT这种方式也有很多缺点,虽然私网地址访问互联网地址方便,但互联网地址访问私网地址就困难了。很多服务,都会受到限制,你只能通过复杂的设置才能解决,也会影响网络的处理效率。

2) IPv6

IPv6地址

定义

  • IPv6地址由八组、每组四位16进制数字组成,每组之间由:分隔
  • IPv6地址支持压缩前导零的表示方法,如图中的地址可写为:2001:D12:0:0:2AA:987:FE29:9871
  • 当冒号十六进制格式中出现连续几段数值0的位段时,这些段可以压缩为双冒号(::)的表示,所以我们得到了最终的简化格式:2001:D12::2AA:987:FE29:9871
  • 注意:双冒号只能出现一次

IPv6号段划分和前缀表示法

IPv6拥有128位巨大的地址空间,对于那么大的空间,也不是随意的划分,而是使用按照bit位进行号段划分。

IPv6地址结构如下图 IPv6地址结构

例如RFC4291中定义了n=48, m=16,也就是子网和接口ID与各占64位。

IPv6没有子网掩码mask的概念,它支持的是子网前缀标识方法

使用IPv6地址/前缀长度表示方法,例如:

  • 2001:C3:0:2C6A::/64表示一个子网;
  • 而2001:C3:0:2C6A:C9B4:FF12:48BC:1A22/64表示该子网下的一个节点地址。

可以看到,一个IPv6的地址有子网前缀+接口ID构成,子网前缀由地址分配和管理机构定义和分配,而接口ID可以由各操作系统实现生成。

IPv6优点

IPv6是用来解决IPv4地址枯竭问题的,IPv4地址为32位,而IPv6地址为128位 除了地址数量以外,IPv6还有很多优点,例如:

  • IPv6使用更小的路由表。使得路由器转发数据包的速度更快;
  • IPv6增加了增强的组播支持以及对流的控制,对多媒体应用很有利,对服务质量(QoS)控制也很有利;
  • IPv6加入了对自动配置的支持。这是对DHCP协议的改进和扩展,使得网络(尤其是局域网)的管理更加方便和快捷;
  • IPv6具有更高的安全性。用户可以对网络层的数据进行加密并对IP报文进行校验,极大地增强了网络的安全性;
  • IPv6具有更好的扩容能力。如果新的技术或应用需要时,IPV6允许协议进行扩充;
  • IPv6具有更好的头部格式。IPV6使用新的头部格式,就简化和加速了路由选择过程,提高了效率;
  • ……

3) IPv4和IPv6的区别

  • 报文中,IPv6数据链路层的type字段标识为0x86ddIPv4数据链路层的type字段标识为:0x0800
  • IPv6报文头部固定为40字节IPv4报文头部是20到60字节。这个意味着,写代码处理IPv6数据报文的效率会提高很多
  • IPv6的报文头部取消了校验和字段,提高了路由器的转发效率。不过,值得一提的是,在IPv6协议下,传输层协议UDP、TCP是强制需要进行校验和的(IPv4是可选的)
  • 当IPv6数据报文承载的是上层协议ICMPv6、TCP、UDP等的时候,Next Header的值分别为58、6、17,这个时候和IPv4报文头部中的Protocol字段很类似
  • 当不是以上3种协议类型的时候,IPv6报文头部紧接的是扩展头部。扩展头部是IPv6引入的一个新的概念,每个IPv6的数据报文可以承载0个或多个扩展头部,扩展头部通过链表的形式组织起来。当IPv6数据报文承载着扩展头部的时候,Next Header的数值为扩展头部的类型值。为什么要引入扩展头部这个概念,这里也是IPv6对IPv4改进的一个方面,用扩展头部取代了IPv4的可选项信息,精简了IPv6的头部,增强了IPv6的扩展性。当发送一个分片IPv6数据报文的时候,IPv6使用的是扩展头部的形式组织各个分片的信息,如图IPv6报文头部Next Header字段值为44表示存在扩展头部,扩展头部是IPv6分片数据信息。对比IPv4,分片信息是记录在IPv4报文头部分片字段中。

4) IP协议简单总结

如上所述,IP协议的作用主要有两个:

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

3.IP数据包

根据IP协议发送的数据,就叫做IP数据包。我们直接把IP数据包直接放进以太网数据包的"数据"部分,不用修改以太网的规格。这就是互联网分层结构的好处:上层的变动完全不涉及下层的结构

具体来说,IP数据包也分为标头数据两个部分: 其中,标头范围为20-60字节(IPv6固定为40字节),整个数据包的总长度最大为65535字节。因此,理论上,一个IP数据包的数据部分最长为65515字节

IP数据报文格式

如图所示,标头中20字节是固定不变的,它包含了版本、长度、IP地址等信息,另外还有可变部分的标头可选。而数据则是IP数据包的具体内容。

将它放入以太网数据包后,以太网数据包就变成了下面这样:

在以太网协议中,以太网数据包的数据部分,最长只有1500字节。因此,如果IP数据包超过了1500字节,它就需要分割成几个以太网数据包,分开发送了

4.ARP协议

关于网络层,还有最后一点需要说明。因为IP数据包是放在以太网数据包里发送的,所以我们必须同时知道两个地址,一个是对方的MAC地址,另一个是对方的IP地址。通常情况下,对方的IP地址是已知的,但是我们不知道它的MAC地址

所以,我们需要一种机制,能够从IP地址得到MAC地址。

这里又可以分成两种情况:

  • 1)第一种情况:如果两台主机不在同一个子网络,那么事实上没有办法得到对方的MAC地址,只能把数据包传送到两个子网络连接处的网关(gateway),让网关去处理;
  • 2)第二种情况:如果两台主机在同一个子网络,那么我们可以用ARP协议,得到对方的MAC地址。ARP协议也是发出一个数据包(包含在以太网数据包中),其中包含它所要查询主机的IP地址,在对方的MAC地址这一栏,填的是FF:FF:FF:FF:FF:FF,表示这是一个广播地址。它所在子网络的每一台主机,都会收到这个数据包,从中取出IP地址与自身的IP地址进行比较。如果两者相同,都做出回复,向对方报告自己的MAC地址否则就丢弃这个包。

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

ARP攻击

ARP攻击是利用ARP协议设计时缺乏安全验证漏洞来实现的,通过伪造ARP数据包来窃取合法用户的通信数据,造成影响网络传输速率和盗取用户隐私信息等严重危害。

ARP攻击主要是存在于局域网网络中,局域网中若有一台计算机感染ARP木马,则感染该ARP木马的系统将会试图通过“ARP欺骗”手段截获所在网络内其它计算机的通信信息,并因此造成网内其它计算机的通信故障。

局域网中比较常见的ARP攻击包括:上网时断时续,拷贝文件无法完成,局域网内的ARP包激增。出现不正常的MAC地址,MAC地址对应多个IP地址,网络数据发不出去了,网上发送信息被窃取,个人PC中毒局域网内MAC地址泛洪使MAC地址缓存表溢出等问题。据包的协议地址不匹配,从而在网络中产生大量的ARP。
在局域网环境中,ARP攻击是主要的安全威胁,在传统网络中主要是通过静态绑定的方式来解决,但是这种方式限制了网络扩展的易用性。

五、传输层

1.传输层的由来

有了MAC地址和IP地址,我们已经可以在互联网上任意两台主机上建立通信。

接下来的问题是,同一台主机上有许多程序都需要用到网络,比如,你一边浏览网页,一边与朋友在线聊天。当一个数据包从互联网上发来的时候,你怎么知道,它是表示网页的内容,还是表示在线聊天的内容?

也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做端口(port),它其实是每一个使用网卡的程序的编号。每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。

**端口是0到65535之间的一个整数,正好16个二进制位。0到1023的端口被系统占用,用户只能选用大于1023的端口。**不管是浏览网页还是在线聊天,应用程序会随机选用一个端口,然后与服务器的相应端口联系。

传输层的功能,就是建立端口到端口的通信。相比之下,网络层的功能是建立主机到主机的通信。只要确定主机和端口,我们就能实现程序之间的交流。因此,Unix系统就把主机+端口,叫做套接字(socket)。有了它,就可以进行网络应用程序开发了。

2.UDP协议:用户数据报协议

现在,我们必须在数据包中加入端口信息,这就需要新的协议。最简单的实现叫做UDP协议,它的格式几乎就是在数据前面,加上端口号。

UDP数据包,也是由标头和数据两部分组成: UDP结构 如图所示,UDP的标头固定为8字节,包含了16位源端口和16位目的端口,以及16位的UDP长度和16位的UDP检验和。然后,把整个UDP数据包放入IP数据包的数据部分,而前面说过,IP数据包又是放在以太网数据包之中的,所以整个以太网数据包现在变成了下面这样: 包含UDP数据包的以太网协议

UDP数据包非常简单,标头部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。

UDP中一个包的大小最大能多大

  • 局域网环境下,建议将UDP数据控制在1472字节以下

    • 以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的,这个1500字节被称为链路层的MTU(最大传输单元)。但这并不是指链路层的长度被限制在1500字节,其实这这个MTU指的是链路层的数据区,并不包括链路层的首部和尾部的18个字节。

    • 所以,事实上这个1500字节就是网络层IP数据报的长度限制。因为IP数据报的首部最小为20字节,所以IP数据报的数据区长度最大为1480字节。而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的。

    • 又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节。这个1472字节就是我们可以使用的字节数。

    • 当我们发送的UDP数据大于1472的时候会怎样呢? 这也就是说IP数据报大于1500字节,大于MTU,这个时候发送方IP层就需要分片(fragmentation)。把数据报分成若干片,使每一片都小于MTU,而接收方IP层则需要进行数据报的重组。这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方无法重组数据报,将导致丢弃整个UDP数据报。

    • 因此,在普通的局域网环境下,我建议将UDP的数据控制在1472字节以下为好。

  • Internet编程时,建议将UDP数据控制在548字节以下

    • 进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值。如果我们假定MTU为1500来发送数据,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作。

    • 鉴于Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时, 最好将UDP的数据长度控件在548字节(576-8-20)以内。

    • ps:这句话貌似有问题,unix网络编程第一卷里说:ipv4协议规定ip层的最小重组缓冲区大小为576!所以,建议udp包不要超过这个大小,而不是因为internet的标准MTU是576!

3.TCP协议:传输控制协议

UDP协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方是否收到。为了解决这个问题,提高网络可靠性,TCP协议就诞生了。这个协议非常复杂,但可以近似认为,它就是有确认机制的UDP协议,每发出一个数据包都要求确认。如果有一个数据包遗失,就收不到确认,发出方就知道有必要重发这个数据包了。

因此,TCP协议能够确保数据不会遗失。它的缺点是过程复杂、实现困难、消耗较多的资源。 TCP协议标头 如图所示,TCP标头在20-60字节之间,除了源端口号和目的端口号之外,还包含了序号、确认号等各种信息,用于保证可靠连接与数据重发。

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

包含TCP数据的以太网帧结构

六、应用层

应用程序收到传输层的数据,接下来就要进行解读。由于互联网是开放架构,数据来源五花八门,必须事先规定好格式,否则根本无法解读。应用层的作用,就是规定应用程序的数据格式。

举例来说,TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了应用层。这是最高的一层,直接面对用户。它的数据就放在TCP数据包的数据部分。

因此,现在的以太网的数据包就变成下面这样: