文章目录
- 讲在前面
- 网络层
- 网络层概述
- IP协议格式
- 网段划分
- 公有IP、私有IP、特殊IP
- 理解路由
- 数据链路层
- MAC地址以及MAC帧(以太网帧)
- MTU协议
- MTU对IP和TCP协议的影响
- ARP协议及其作用
- 涉及到的相关协议
- DNS协议(应用层)
- NAT与NAPT协议
- 总结
讲在前面
由于网络层和数据链路层息息相关,因此在讲解的时候会出现两者知识点各有穿插的情况出现,在讲解网络层时仅仅可能会涉及一些数据链路层的概念,并不会造成理解上的困扰。
网络层
网络层夹在传输层与链路层之间,真正实现了“网络”这一角色,这意味着原本只在计算机内的数据准备开始向外界传输了。为什么这么讲呢?像是应用层和传输层都是在本机上对数据进行处理,并不真正涉及到远端主机的真正意义上的精确定位,网络层正式涉及到这个根本的问题了。
网络层概述
网络层在通信中,起到定位通信双方的作用。主要是通过IP地址这个概念完成的,具体相关的IP协议将在下面讲解。IP地址能唯一标识一个主机,因此如果知晓主机A和主机B的各自的IP,那么就知道了数据的源头和目的地。这就预示着数据已经准备在硬件的层面上向外界传输了,这是数据迈向外界的第一步,但是具体的传送细节还需要数据链路层来实现。准确的说,网络层解决路线方向问题,而链路层解决底层的传输细节(这里不考虑物理层)。
IP协议格式
格式数据具体分析:
• 4位版本:指定协议的版本,目前有IPv4和IPv6,如果是IPv4就是4,是IPv6就是6。
• 4位首部长度:表示头部的长度,取值范围是[5,15],单位是4字节,那么头部的长度取值范围是[20,60]。
• 8位服务类型: 3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。总的来说,算是一种性能偏向选择。
• 16位总长度:IP数据报整体的字节数。
• 16位标识:唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。
• 3位标识: 第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为1表示禁止分片,这时候如果报文长度超过MTU(链路层细讲),IP模块就会丢弃报文。第三位表示"更多分片",如果分片了的话,最后一个分片置为1,其他是0。类似于一个结束标记。
• 13位片偏移:是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。
• 8位生存时间TTL:数据报到达目的地的最大报文跳数。一般是64。每次经过一个路由,TTL-= 1,一直减到0还没到达,那么就丢弃了。这个字段主要是用来防止出现路由循环。
• 8位协议:表示上层协议的类型。
• 16位首部检验和:使用CRC进行校验,来鉴别头部是否被破坏.。
• 32位源IP地址:发送端主机的标识
• 32位目的IP地址:接收端主机的标识
• 选项:不定长,最多40字节。主要用于补充信息的说明。
• 数据:正文部分。
网段划分
首先,网段划分就是将IP地址分为网络号和主机号。
网络号:标识一个局域网
主机号:在一个局域网中标识一个主机
为什么要这样划分呢?这就涉及到了IP分配的问题。首先IP的格式是 点分十进制的风格:xxxx . xxxx . xxxx . xxxx,比如192.168.62.1转换成二进制数就是11000000 10101000 00111110 00000001转换成十进制数就是3232251393。
那么IP地址通过一个四字节的整型数字就可以表示出来,最大也就是255.255.255.255,取值范围是[0,4294967295]。这些IP地址是给全球使用的,那么意味着要进行IP的分配。IP资源有限,不可能胡乱的分配,规定每个国家分配一定数量的IP地址,这就要求有一定的分配规则。夸张一点的说,中国有1亿网民,大致需求4亿个公网IP,那么就把以000…开头的IP地址分给中国,也就是说中国实际拥有2^29个IP地址。那么只要遇到以000开头的IP地址都会知道是中国的网民在上网了。中国内所有的IP再接着往下细分,比如说000 xxxx中紧接着的四位bit位是表示一个省份的IP地址的,再往下分可以是市,县……
因此网段划分具有的意义:
• 根据网段的位数,区分不同区域的主机。
• 同一局域网中的所有IP地址的网络号相同,便于实现局域网内相互辨认并实现直接通信。
• 不同的子网其实就是把网络号相同的主机放到一起。
• 如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复。
通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同。有一种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便。一般的路由器都带有DHCP功能。因此路由器也可以看做一个DHCP服务器。在一个子网中添加一台新的主机,管理该子网的路由器就会自动分配IP地址。
IP地址的种类划分:
A类 0.0.0.0到127.255.255.255
B类 128.0.0.0到191.255.255.255
C类 192.0.0.0到223.255.255.255
D类 224.0.0.0到239.255.255.255
E类 240.0.0.0到247.255.255.255
从上到下,分类所具有的IP个数依次减少。子网掩码是用来划分IP地址的网络和主机部分的,如果子网掩码的位数增加,可以划分出更多的子网,每个子网中的主机数量也会减少,从而减少IP地址浪费的问题。
例如,一个使用了24位子网掩码的网络可以有256个子网,每个子网可以有254个可用的主机地址。但如果使用了更多的位数作为子网掩码,比如25位、26位,那么可以划分出更多的子网,每个子网中的主机数量也会减少。这样就可以更加有效地利用IP地址,减少浪费。
引入一个额外的子网掩码(subnet mask)来区分网络号和主机号。子网掩码也是一个32位的正整数,通常用一串 “0” 来结尾。将IP地址和子网掩码进行 “按位与” 操作,得到的结果就是网络号。网络号和主机号的划分与这个IP地址是A类、B类还是C类无关。
例如:
IP地址 | 192.168.128.81 | C0 A8 80 51 |
---|---|---|
子网掩码 | 255.255.255.240 | FF FF FF F0 |
网络号 | 192.168.128.80 | C0 A8 80 50 |
子网地址范围 | 192.168.128.80~192.168.128.95 |
关于子网掩码的简洁表达式:192.168.128.81/28,其中 / 前面的部分表示IP地址,后面的部分表示子网掩码高28位为1,也就是子网掩码为255.255.255.240。
公有IP、私有IP、特殊IP
上面我们提到过,全球的IP数量是有限的,随着网名数量的增加以及每个网民所拥有的上网设备的增多,IP数量就会越来越短缺。由于IP这个概念在很早就引入到了整个网络的体系中去运用,因此临时更改是不太现实以及难以推广的。那么为了解决IP数量不足的问题,就有了公有IP和私有IP的概念产生。
公有IP:暴露给公网,全球唯一标识一台主机
私有IP:只能在局域网中使用,并且具有一些规定:
10.*,前8位是网络号,共16,777,216个地址。
172.16.到172.31.,前12位是网络号,共1,048,576个地址。
192.168.*,前16位是网络号,共65,536个地址,包含在这些范围中的,都称为私有IP。
特殊IP: 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。
广播IP地址通常是网络中的最大地址,即该网络中最后一个可用地址。例如,如果一个网络有IP地址范围为192.168.1.0/24,那么广播IP地址就是192.168.1.255。注意,广播地址并不是一个可分配的IP地址,因为它被用来发送广播消息到该网络上的所有主机。
通过私有IP的网段,我们可以得知:局域网中使用私有IP最多可以划分三级子网。
私有IP并没有增加IP数量的绝对上限,但是却变相的使得每个IP所能代表的用户增多了。至于具体的转化关系,就要涉及到NAT这项技术了,这里会简单应用一下,文章后面会单独详细分析。
路由器配置两个IP地址:LAN口IP(子网IP)和WAN口IP。其中LAN口IP就是在该路由器所在的局域网中使用的IP,而WAN口IP是对上一层网络分层所使用的IP地址。如图中所示,运行商的路由器的WAN口IP就是公有IP。更总结一点的说法就是:WAN口IP用来标识一个路由器,而子网IP用来组织该路由器下一层的IP地址。
私有IP不能出现在广域网中,否则会造成IP地址冲突的的情况发生。但是IP协议要求通信的双方要有源IP和目的IP,因此就需要对私有IP进行转化,子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成WAN口IP),这样逐级替换,最终数据包中的IP地址成为一个公网IP。这种技术称为NAT(Network Address Translation,网络地址转换)。
如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上。
下图就是具体的数据报在路由器转发的过程中源IP的更迭替换:
可以看出主机A与主机E在往服务器127.2.38.5发送数据时,每经过一个路由器,都会将源IP跟换成该路由器的WAN口IP。
理解路由
数据在经过一个个路由器的时候,需要知道具体的路由器地址才行。只知道路由器的IP地址还是不够的,还要知道MAC地址。
这里又提到了数据链路层的MAC地址,它标识了路由器的具体的物理传输地址,在路由表中保存。
什么是路由?
路由就是数据报在传输过程中,找寻正确通往目的主机路径的过程。
为什么要路由?
路由可以解决数据报在网络层面上的路径查找问题。
怎么路由?
路由器都会保存一份路由表:
上图就是一个云服务器的路由表,相较于路由器还是少了很多,毕竟没有众多路由器与它相连。
路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Metric是距离度量,指示到达目标网络或主机需要经过的距离或代价,通常用于路由协议中。Flags中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。数据链路层是当有数据包到达网络设备时,路由表会根据目标地址选择最合适的路由表项进行转发,以确保数据包能够到达正确的目标。
例如:若是这个云服务器充当路由器,则一个数据包的目的IP是10.0.4.10,那么在路由表中不断地与子网掩码按位与,当与255.255.252.0运算时,得到了10.0.4.0的结果,与目的IP相符,那就从eth0这个发送接口发送信息。如果路由表中没有与目的地址匹配的记录,则路由器会尝试向默认路由器转发数据包。默认路由器通常被称为缺省路由器,是指不属于本地网络的任何目的地址都可以经由该路由器转发到其他网络。具体有以下做法,作为了解:
路由器选择下一跳路由器的算法通常使用距离向量算法或链路状态算法。距离向量算法是基于每个路由器收到的邻居路由器的距离信息来计算到目的IP地址的最短路径,并更新自己的路由表。链路状态算法则是通过广播自己的链路状态信息,收集所有路由器的链路状态信息并计算最短路径。在实际应用中,还会使用路由聚合、路由过滤等技术来优化路由表,提高路由器的转发效率和网络的安全性。
数据链路层
数据链路层协议的作用就是完成两个路由器之间的数据传输,这是具体到了临近设备的数据传输,也就是”一跳“。多个”一跳“的结合最终才能完成整个路径行走的实现。换言之,网络层协议解决在众多路径中走哪一条路径,而数据链路层解决路径上的节点跳转。有意思的是,网络层的路径并不是一下就找好的,而是伴随着节点跳转,根据路由表来决定走哪个方向。所以说,网络层的协议和数据链路层协议在这个时候是同时起作用的,因此混杂着一起理解是有原因的。
MAC地址以及MAC帧(以太网帧)
MAC地址是在”一跳“这个动作中完成硬件上的锚定任务的。涉及到了硬件,MAC地址的设计就是实现在硬件上的辨识。关于MAC地址的具体格式,这里就不做具体了解了。
MAC地址是由网络适配器(也称为网卡)制造商预先分配给网络适配器的唯一标识符。这意味着每个网络适配器都有一个唯一的MAC地址,因此它与特定的硬件设备有很强的关联性。从理论上讲,两个不同的网卡不应该具有相同的 MAC 地址,并且更换网络适配器还会导致MAC地址的更改。因此,MAC地址可以被用来鉴别和追踪网络中的特定硬件设备。
MAC帧指的是在OSI模型中数据链路层(第二层)中,传输数据所使用的帧结构。MAC帧通常包含了帧起始、帧头、帧体和帧尾等多个部分。其中,帧起始(Start of Frame, SOF)用于标识一个新帧的开始,帧头(Header)包含了一些控制信息,如MAC地址、帧类型等,帧体(Payload)包含了实际的数据内容,帧尾(Ender)用于标识一个帧的结束,并可能包含一些校验码等。在以太网中,常用的MAC帧格式为标准帧格式(Ethernet II Frame Format),它包含了6字节的目的MAC地址、6字节的源MAC地址、2字节的类型/长度字段和帧体。在IEEE 802.3标准中,也定义了MAC帧格式,具体细节有一些差异。
源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。
帧协议类型字段有三种值,分别对应IP、ARP、RARP。
帧末尾是CRC校验码。
MTU协议
MTU:数据链路层中所能传输的最大传输单元。
MAC帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位。如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)。不同的数据链路层标准的MTU是不同的。
MTU对IP和TCP协议的影响
对IP协议的影响:
由于数据链路层MTU的限制,对于较大的IP数据包要进行分包。将较大的IP包分成多个小包,并给每个小包打上标签。每个小包IP协议头的 16位标识(id) 都是相同的;每个小包的IP协议头的3位标志字段中,第2位置为0,表示允许分片,第3位来表示结束标记(当前是否是最后一个小包,是的话置为1,否则置为0)。到达对端时再将这些小包,会按顺序重组,拼装到一起返回给传输层。一旦这些小包中任意一个小包丢失,接收端的重组就会失败。但是IP层不会负责重新传输数据,TCP层负责数据重传。
对TCP协议的影响:
TCP的一个数据报也不能无限大,还是受制于MTU。TCP的单个数据报的最大消息长度,称为MSS(MaxSegment Size)。TCP在建立连接的过程中,通信双方会进行MSS协商。最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)。双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。然后双方得知对方的MSS值之后,选择较小的作为最终MSS。MSS的值就是在TCP首部的40字节变长选项中(kind=2)。
分片会大大增加丢包的风险,因此MTU的设置就给IP协议以及TCP提供了一种参考:尽量不要超过这个限制,否则就要承担丢包重传的代价。
查询MTU:
使用ifconfig命令,即可查看ip地址,mac地址,和MTU。
ARP协议及其作用
信息在数据链路层中传输时,无论是否经由路由器转发,都需要知道下一跳的MAC地址,由于MAC地址是与硬件强相关的,因此想要获得MAC地址,就得需要一种手段:通知所有的同一层网络的主机(广播),如果是下一跳,即目的IP符合,那么就返回它的MAC地址,如果不符合,则不做任何应答。同样的,如果都没有响应,那么就不再广播从而获得目的主机的MAC地址了,将数据包发送给默认的下一跳。
ARP数据报的格式:
1.硬件地址类型(Hardware Type):指示网络采用的硬件地址类型,通常为Ethernet,值为1。
2.协议类型(Protocol Type):表示网络层协议的类型,如IP,值为0x0800。
3.硬件地址长度(Hardware Address Length):指示各个硬件地址的长度,通常为6个字节。
4.协议地址长度(Protocol Address Length):指示网络层协议要使用的地址长度,通常为4个字节。
5.操作码(Opcode):表示ARP请求或ARP响应的类型,值为1表示请求,2表示响应。
6.发送端MAC地址(Sender MAC Address):指示发送ARP数据报的主机的MAC地址。
7.发送端IP地址(Sender IP Address):指示发送ARP数据报的主机的IP地址。
8.目的MAC地址(Target MAC Address):在ARP请求中,这个字段为空;在ARP响应中,指示目的主机的MAC地址。
9.目的IP地址(Target IP Address):指示目的主机的IP地址。
其中,硬件地址和协议地址是最重要的信息,它们确定了需要进行ARP解析的目标主机。 ARP协议使用这样的方式来解析网卡地址和IP地址之间的关系,以便在网络层和数据链路层之间进行通信。
工作流程图:
宏观层面:
数据层面:
二者结合观察:
每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。时限的设计除了是避免维护不必要的资源,也有防止MAC地址因为替换设备而发生改变等因素的存在。
上述过程中有一个问题:广播发给所有的主机,意味着广播时网络中只存在广播信息。一旦多个主机同时进行广播,就会造成数据冲突,称之为“碰撞”,该局域网称之为“碰撞域”。一旦出现碰撞现象,就认为信息不可靠了,需要重发。因此一个局域网中一旦出现碰撞,多个需要重发的主机会随机等待一定时间再次重发数据,以避免碰撞的再次产生。
为了尽量减小碰撞的影响范围,使用交换机对碰撞域进行划分。
把碰撞事件控制在一个较小的范围内,对于其他碰撞域来说,很可能没有影响。就比如上面图中的C、D、E主机段发生了碰撞,但是碰撞并没有传递到AB段和FG段,则只要是AB段和FG各自段内通信,那么就不会受到影响,但是这两个段之间却会受到中间CDE段的阻碍而无法通信。所以引入交换机和碰撞域也只能减少碰撞的影响,而不能消除。
涉及到的相关协议
围绕着网络层以及数据链路层协议,还有一些周边协议需要了解学习。
DNS协议(应用层)
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序。但是IP地址不方便记忆。于是人们发明了一种叫主机名的东西,是一个字符串,并且使用hosts文件来描述主机名和IP地址的关系。
DNS是应用层协议
DNS底层使用UDP进行解析
浏览器会缓存DNS结果
一般我们访问某些网站的时候,并不会根据IP去访问,而是通过网址,甚至直接是中文网名。这就是用到了
NAT与NAPT协议
NAT与NAPT技术是解决IP地址数量紧缺应运而生的。在上面我们讲解了公有IP和私有IP的概念以及基础应用。其中遗留了一个问题没展开说:一个甚至多个私有IP给同一个服务器发送信息,如何在返回的时候找到并区分私有IP。
首先NAT解决一个私有IP拥有者主机的通信回访问题:
NAPT解决多个私有IP拥有者主机的通信回访问题:
使用IP+port来建立这个关联关系。
这种关联关系也是由NAT路由器自动维护的。例如在TCP的情况下,建立连接时,就会生成这个表项。在断开连接后,就会删除这个表项。
NAT技术的缺陷:
由于NAT依赖这个转换表, 所以有诸多限制:
1.无法从NAT外部向内部服务器建立连接。
2.装换表的生成和销毁都需要额外开销。
3.通信过程中一旦NAT设备异常,即使存在热备, 所有的TCP连接也都会断开。
NAT和代理服务器的关系:
路由器往往都具备NAT设备的功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程。代理服务器看起来和NAT设备有一点像。客户端像代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器。服务器返回结果后,代理服务器又把结果回传给客户端。所以,代理服务器与NAT是完全不同的两种东西。
区别如下:
1.从应用上讲,NAT设备是网络基础设备之一, 解决的是IP不足的问题。代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像迅游这样的加速器,也是使用代理服务器。
2.从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换。代理服务器往往工作在应用层。
3.从使用范围上讲,NAT一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网。
4.从部署位置上看,NAT一般集成在防火墙,路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上。
总结
网络层以及数据链路层逐渐脱离了数据的处理,开始重视传输这个问题,这也是逻辑上的必然,越底层的协议越和传输相关联。重点在于理解IP以及MAC地址的作用,以及在哪些环节需要用到它们。