网络层--数据链路层

⽹络层

在复杂的⽹络环境中确定⼀个合适的路径.

IP协议

基本概念 • 主机:配有IP地址,但是不进⾏路由控制的设备;
• 路由器:即配有IP地址,⼜能进⾏路由控制;
• 节点:主机和路由器的统称;

协议头格式

• 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4.
• 4位头部⻓度(headerlength):IP头部的⻓度是多少个32bit,也就是length*4的字节数.4bit表⽰最 ⼤的数字是15,因此IP头部最⼤⻓度是60字节.
• 8位服务类型(TypeOfService):3位优先权字段(已经弃⽤),4位TOS字段,和1位保留字段(必须置为 0). 4位TOS分别表⽰:最⼩延时,最⼤吞吐量,最⾼可靠性,最⼩成本.这四者相互冲突,只能选择⼀个. 对于ssh/telnet这样的应⽤程序,最⼩延时⽐较重要;对于ftp这样的程序,最⼤吞吐量⽐较重要.
• 16位总⻓度(totallength):IP数据报整体占多少个字节.
• 16位标识(id):唯⼀的标识主机发送的报⽂.如果IP报⽂在数据链路层被分⽚了,那么每⼀个⽚⾥⾯的 这个id都是相同的.
• 3位标志字段:第⼀位保留(保留的意思是现在不⽤,但是还没想好说不定以后要⽤到).第⼆位置为1表 ⽰禁⽌分⽚,这时候如果报⽂⻓度超过MTU,IP模块就会丢弃报⽂.第三位表⽰"更多分⽚",如果分⽚ 了的话,最后⼀个分⽚置为1,其他是0.类似于⼀个结束标记.
• 13位分⽚偏移(framegamentoffset):是分⽚相对于原始IP报⽂开始处的偏移.其实就是在表⽰当前 分⽚在原报⽂中处在哪个位置.实际偏移的字节数是这个值*8得到的.因此,除了最后⼀个报⽂之 外,其他报⽂的⻓度必须是8的整数倍(否则报⽂就不连续了).
• 8位⽣存时间(TimeToLive,TTL):数据报到达⽬的地的最⼤报⽂跳数.⼀般是64.每次经过⼀个路 由,TTL-=1,⼀直减到0还没到达,那么就丢弃了.这个字段主要是⽤来防⽌出现路由循环
• 8位协议:表⽰上层协议的类型
• 16位头部校验和:使⽤CRC进⾏校验,来鉴别头部是否损坏.
• 32位源地址和32位⽬标地址:表⽰发送端和接收端.
• 选项字段(不定⻓,最多40字节)

地址管理

⽹段划分
IP地址分为两个部分,⽹络号和主机号
• ⽹络号:保证相互连接的两个⽹段具有不同的标识;
• 主机号:同⼀⽹段内,主机之间具有相同的⽹络号,但是必须有不同的主机号;
• 不同的⼦⽹其实就是把⽹络号相同的主机放到⼀起
• 如果在⼦⽹中新增⼀台主机,则这台主机的⽹络号和这个⼦⽹的⽹络号⼀致,但是主机号必须不能和 ⼦⽹中的其他主机重复.
通过合理设置主机号和⽹络号,就可以保证在相互连接的⽹络中,每台主机的IP地址都不相同.
那么问题来了,⼿动管理⼦⽹内的IP,是⼀个相当⿇烦的事情.
• 有⼀种技术叫做DHCP,能够⾃动的给⼦⽹内新增主机节点分配IP地址,避免了⼿动管理IP的不便.
• ⼀般的路由器都带有DHCP功能.因此路由器也可以看做⼀个DHCP服务器.
过去曾经提出⼀种划分⽹络号和主机号的⽅案,把所有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
随着Internet的⻜速发展,这种划分⽅案的局限性很快显现出来,⼤多数组织都申请B类⽹络地址,导致B 类地址很快就分配完了,⽽A类却浪费了⼤量地址;
• 例如,申请了⼀个B类地址,理论上⼀个⼦⽹内能允许6万5千多个主机.A类地址的⼦⽹内的主机数更 多.
• 然⽽实际⽹络架设中,不会存在⼀个⼦⽹内有这么多的情况.因此⼤量的IP地址都被浪费掉了. 针对这种情况提出了新的划分⽅案,称为CIDR(ClasslessInterdomainRouting):
• 引⼊⼀个额外的⼦⽹掩码(subnetmask)来区分⽹络号和主机号;
• ⼦⽹掩码也是⼀个32位的正整数.通常⽤⼀串"0"来结尾;
• 将IP地址和⼦⽹掩码进⾏"按位与"操作,得到的结果就是⽹络号;
• ⽹络号和主机号的划分与这个IP地址是A类、B类还是C类⽆关;

特殊的IP地址

• 将IP地址中的主机地址全部设为0,就成为了⽹络号,代表这个局域⽹;
• 将IP地址中的主机地址全部设为1,就成为了⼴播地址,⽤于给同⼀个链路中相互连接的所有主机发 送数据包;
• 127.*的IP地址⽤于本机环回(loopback)测试,通常是127.0.0.1

IP地址的数量限制

我们知道,IP地址(IPv4)是⼀个4字节32位的正整数.那么⼀共只有2的32次⽅个IP地址,⼤概是43亿左 右.⽽TCP/IP协议规定,每个主机都需要有⼀个IP地址.
这意味着,⼀共只有43亿台主机能接⼊⽹络么?
实际上,由于⼀些特殊的IP地址的存在,数量远不⾜43亿;另外IP地址并⾮是按照主机台数来配置的,⽽ 是每⼀个⽹卡都需要配置⼀个或多个IP地址. CIDR在⼀定程度上缓解了IP地址不够⽤的问题(提⾼了利⽤率,减少了浪费,但是IP地址的绝对上限并没 有增加),仍然不是很够⽤.这时候有三种⽅式来解决:
• 动态分配IP地址:只给接⼊⽹络的设备分配IP地址.因此同⼀个MAC地址的设备,每次接⼊互联⽹中, 得到的IP地址不⼀定是相同的;
• NAT技术;
• IPv6:IPv6并不是IPv4的简单升级版.这是互不相⼲的两个协议,彼此并不兼容;IPv6⽤16字节128位 来表⽰⼀个IP地址;但是⽬前IPv6还没有普及;
私有IP地址和公⽹IP地址
如果⼀个组织内部组建局域⽹,IP地址只⽤于局域⽹内的通信,⽽不直接连到Internet上,理论上使⽤任意 的IP地址都可以,但是RFC1918规定了⽤于组建局域⽹的私有IP地址
• 10.*,前8位是⽹络号,共16,777,216个地址
• 172.16.到172.31.,前12位是⽹络号,共1,048,576个地址
• 192.168.*,前16位是⽹络号,共65,536个地址
包含在这个范围中的,都成为私有IP,其余的则称为全局IP(或公⽹IP);
• ⼀个路由器可以配置两个IP地址,⼀个是WAN⼝IP,⼀个是LAN⼝IP(⼦⽹IP).
• 路由器LAN⼝连接的主机,都从属于当前这个路由器的⼦⽹中.
• 不同的路由器,⼦⽹IP其实都是⼀样的(通常都是192.168.1.1).⼦⽹内的主机IP地址不能重复.但是⼦ ⽹之间的IP地址就可以重复了.
• 每⼀个家⽤路由器,其实⼜作为运营商路由器的⼦⽹中的⼀个节点.这样的运营商路由器可能会有很 多级,最外层的运营商路由器,WAN⼝IP就是⼀个公⽹IP了.
• ⼦⽹内的主机需要和外⽹进⾏通信时,路由器将IP⾸部中的IP地址进⾏替换(替换成WAN⼝IP),这样 逐级替换,最终数据包中的IP地址成为⼀个公⽹IP.这种技术称为NAT(NetworkAddress Translation,⽹络地址转换).
• 如果希望我们⾃⼰实现的服务器程序,能够在公⽹上被访问到,就需要把程序部署在⼀台具有外⽹IP 的服务器上.这样的服务器可以在阿⾥云/腾讯云上进⾏购买.

路由选择

在复杂的⽹络结构中,找出⼀条通往终点的路线;
路由的过程,是⼀跳⼀跳(HopbyHop)"问路"的过程.
所谓"⼀跳"就是数据链路层中的⼀个区间.具体在以太⽹中指从源MAC地址到⽬的MAC地址之间的帧 传输区间.
IP数据包的传输过程也和问路⼀样.
• 当IP数据包,到达路由器时,路由器会先查看⽬的IP;
• 路由器决定这个数据包是能直接发送给⽬标主机,还是需要发送给下⼀个路由器;
• 依次反复,⼀直到达⽬标IP地址; 那么如何判定当前这个数据包该发送到哪⾥呢?
这个就依靠每个节点内部维护⼀个路由表;
• 路由表可以使⽤route命令查看
• 如果⽬的IP命中了路由表,就直接转发即可;
• 路由表中的最后⼀⾏,主要由下⼀跳地址和发送接⼝两部分组成,当⽬的地址与路由表中其它⾏都不 匹配时,就按缺省路由条⽬规定的接⼝发送到下⼀跳地址。
假设某主机上的⽹络接⼝配置和路由表如下:
• 这台主机有两个⽹络接⼝,⼀个⽹络接⼝连到192.168.10.0/24⽹络,另⼀个⽹络接⼝连到 192.168.56.0/24⽹络;
• 路由表的Destination是⽬的⽹络地址,Genmask是⼦⽹掩码,Gateway是下⼀跳地址,Iface是发送接 ⼝,Flags中的U标志表⽰此条⽬有效(可以禁⽤某些条⽬),G标志表⽰此条⽬的下⼀跳地址是某个路由 器的地址,没有G标志的条⽬表⽰⽬的⽹络地址是与本机接⼝直接相连的⽹络,不必经路由器转发;
转发过程例1:如果要发送的数据包的⽬的地址是192.168.56.3 • 跟第⼀⾏的⼦⽹掩码做与运算得到192.168.56.0,与第⼀⾏的⽬的⽹络地址不符 • 再跟第⼆⾏的⼦⽹掩码做与运算得到192.168.56.0,正是第⼆⾏的⽬的⽹络地址,因此从eth1接⼝发 送出去;
• 由于192.168.56.0/24正是与eth1接⼝直接相连的⽹络,因此可以直接发到⽬的主机,不需要经路由 器转发;
转发过程例2:如果要发送的数据包的⽬的地址是202.10.1.2 • 依次和路由表前⼏项进⾏对⽐,发现都不匹配;
• 按缺省路由条⽬,从eth0接⼝发出去,发往192.168.10.1路由器;
• 由192.168.10.1路由器根据它的路由表决定下⼀跳地址;

数据链路层

认识以太⽹

• "以太⽹"不是⼀种具体的⽹络,⽽是⼀种技术标准;既包含了数据链路层的内容,也包含了⼀些物理 层的内容.例如:规定了⽹络拓扑结构,访问控制⽅式,传输速率等;
• 例如以太⽹中的⽹线必须使⽤双绞线;传输速率有10M,100M,1000M等;

• 以太⽹是当前应⽤最⼴泛的局域⽹技术;和以太⽹并列的还有令牌环⽹,⽆线LAN等;

以太⽹帧格式

以太⽹的帧格式如下所⽰
• 源地址和⽬的地址是指⽹卡的硬件地址(也叫MAC地址),⻓度是48位,是在⽹卡出⼚时固化的;
• 帧协议类型字段有三种值,分别对应IP、ARP、RARP;
• 帧末尾是CRC校验码。

认识MAC地址

• MAC地址⽤来识别数据链路层中相连的节点;
• ⻓度为48位,及6个字节.⼀般⽤16进制数字加上冒号的形式来表⽰(例如:08:00:27:03:fb:19)
• 在⽹卡出⼚时就确定了,不能修改.mac地址通常是唯⼀的(虚拟机中的mac地址不是真实的mac地 址,可能会冲突;也有些⽹卡⽀持⽤⼾配置mac地址)

对⽐理解MAC地址和IP地址

• IP地址描述的是路途总体的起点和终点;

• MAC地址描述的是路途上的每⼀个区间的起点和终点;

认识MTU

MTU相当于发快递时对包裹尺⼨的限制.这个限制是不同的数据链路对应的物理层,产⽣的限制.
• 以太⽹帧中的数据⻓度规定最⼩46字节,最⼤1500字节,ARP数据包的⻓度不够46字节,要在后⾯补填 充位;
• 最⼤值1500称为以太⽹的最⼤传输单元(MTU),不同的⽹络类型有不同的MTU;
• 如果⼀个数据包从以太⽹路由到拨号链路上,数据包⻓度⼤于拨号链路的MTU了,则需要对数据包进 ⾏分⽚(fragmentation);
• 不同的数据链路层标准的MTU是不同的;
MTU对IP协议的影响
由于数据链路层MTU的限制,对于较⼤的IP数据包要进⾏分包.
• 将较⼤的IP包分成多个⼩包,并给每个⼩包打上标签;
• 每个⼩包IP协议头的16位标识(id)都是相同的;
• 每个⼩包的IP协议头的3位标志字段中,第2位置为0,表⽰允许分⽚,第3位来表⽰结束标记(当前是否 是最后⼀个⼩包,是的话置为1,否则置为0);
• 到达对端时再将这些⼩包,会按顺序重组,拼装到⼀起返回给传输层;
• ⼀旦这些⼩包中任意⼀个⼩包丢失,接收端的重组就会失败.但是IP层不会负责重新传输数据;
MTU对UDP协议的影响
让我们回顾⼀下UDP协议:
• ⼀旦UDP携带的数据超过1472(1500-20(IP⾸部)-8(UDP⾸部)),那么就会在⽹络层分成多个IP数据 报.
• 这多个IP数据报有任意⼀个丢失,都会引起接收端⽹络层重组失败.那么这就意味着,如果UDP数据 报在⽹络层被分⽚,整个数据被丢失的概率就⼤⼤增加了.
MTU对于TCP协议的影响
让我们再回顾⼀下TCP协议:
• TCP的⼀个数据报也不能⽆限⼤,还是受制于MTU.TCP的单个数据报的最⼤消息⻓度,称为 MSS(MaxSegmentSize);
• TCP在建⽴连接的过程中,通信双⽅会进⾏MSS协商.
• 最理想的情况下,MSS的值正好是在IP不会被分⽚处理的最⼤⻓度(这个⻓度仍然是受制于数据链路 层的MTU).
• 双⽅在发送SYN的时候会在TCP头部写⼊⾃⼰能⽀持的MSS值.
• 然后双⽅得知对⽅的MSS值之后,选择较⼩的作为最终MSS.
• MSS的值就是在TCP⾸部的40字节变⻓选项中(kind=2);
MSS和MTU的关系

ARP协议

虽然我们在这⾥介绍ARP协议,但是需要强调,ARP不是⼀个单纯的数据链路层的协议,⽽是⼀个介于数 据链路层和⽹络层之间的协议;
ARP协议的作⽤
ARP协议建⽴了主机IP地址和MAC地址的映射关系.
• 在⽹络通讯时,源主机的应⽤程序知道⽬的主机的IP地址和端⼝号,却不知道⽬的主机的硬件地址;
• 数据包⾸先是被⽹卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直 接丢弃;
• 因此在通讯前必须获得⽬的主机的硬件地址;
ARP协议的⼯作流程
• 源主机发出ARP请求,询问"IP地址是192.168.0.1的主机的硬件地址是多少",并将这个请求⼴播到 本地⽹段(以太⽹帧⾸部的硬件地址填FF:FF:FF:FF:FF:FF表⽰⼴播);
• ⽬的主机接收到⼴播的ARP请求,发现其中的IP地址与本机相符,则发送⼀个ARP应答数据包给源主 机,将⾃⼰的硬件地址填写在应答包中;
• 每台主机都维护⼀个ARP缓存表,可以⽤arp-a命令查看。缓存表中的表项有过期时间(⼀般为20分 钟),如果20分钟内没有再次使⽤某个表项,则该表项失效,下次还要发ARP请求来获得⽬的主机的硬件 地址
相关推荐
_清浅3 小时前
计算机网络【第四章-网络层】
网络·计算机网络·智能路由器
沐浴露z3 小时前
【深入理解计算机网络08】网络层之IPv4
网络·计算机网络·网络编程·信息与通信·408
望获linux4 小时前
【实时Linux实战系列】实时系统的可观测性:Prometheus 与 Grafana 集成
大数据·linux·服务器·开发语言·网络·操作系统
红尘客栈25 小时前
K8s-kubeadmin 1.28安装
java·网络·kubernetes
hello_2505 小时前
动手模拟k8s网络-vxlan模式
网络·容器·kubernetes
我梦之66 小时前
libevent输出缓存区的数据
服务器·网络·c++·缓存
帅帅梓7 小时前
docker网络
网络·docker·php
white-persist7 小时前
SQL 注入详解:从原理到实战
前端·网络·数据库·sql·安全·web安全·原型模式
wanhengidc8 小时前
云手机的挂机功能涉及到哪些内容
运维·服务器·网络·游戏·智能手机