网络基础(六)-链路层
参考文献
- TCP/IP详解
链路层
- 在
TCP/IP
协议族中,链路层主要有三个目的:- 为
IP
模块发送和接收IP
数据报; - 为
ARP
模块发送ARP
请求和接收ARP
应答; - 为
RARP
发送RARP
请求和接收RARP
应答
- 为
MAC
地址
-
Media Access Control
-
设备间通信的本质其实是设备拥有的网络接口(网卡)间的通信.为了区别每个网络接口,互联网工程任务组(IETF)要求每个设备拥有一个唯一的编号,这个就是 MAC 地址
-
数据的发送方,将自己的 MAC 地址、目的地 MAC 地址,以及数据作为一个分组(Packet),也称作 Frame 或者封包,发送给交换机.交换机再根据目的地 MAC 地址,将数据转发到目的地的网络接口(网卡)
-
IP 协议要传输数据,就要将数据转换成为链路层的分组,然后才可以在链路层传输
-
链路层分组大小受限于链路层的网络设备、线路以及使用了链路层协议的设计
-
MTU
这个缩写词,它指的是Maximun Transmission Unit
,最大传输单元,意思是链路层网络允许的最大传输数据分组的大小.因此 IP 协议要根据 MTU 拆分封包 -
MSS
(Maximun Segment Size
,最大段大小)是TCP
段,或者称为TCP
分组(TCP Packet
)的最大大小.MSS 是传输层概念,MTU
是链路层概念. -
路层通过 MAC 地址定位网络接口(网卡).在一个网络接口向另一个网络接口发送数据的时候,至少要提供这样 3 个字段:
- 源 MAC 地址
- 目标 MAC 地址
- 数据
-
网卡的ROM中保存着全世界唯一的MAC地址,这是生产网卡时写入的
-
网卡中保存的MAC地址会由网卡驱动程序读取并分配给MAC模块
1 | 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 |
- 在IP地址的上一行是
link/ether 00:16:3e:15:13:3f brd ff:ff:ff:ff:ff:ff
,这个被称为MAC地址,是一个网卡的物理地址,用十六进制,6个byte表示.
网络设备的状态标识
-
<BROADCAST,MULTICAST,UP,LOWER_UP>
叫作net_device flags,网络设备的状态标识 -
UP表示网卡处于启动的状态;BROADCAST表示这个网卡有广播地址,可以发送广播包;MULTICAST表示网卡可以发送多播包;LOWER_UP表示L1是启动的,也即网线插着呢.最大传输单元MTU为1500,这是以太网的默认值.
-
MTU是二层MAC层的概念.MAC层有MAC的头,以太网规定连MAC头带正文合起来,不允许超过1500个字节.正文里面有IP的头、TCP的头、HTTP的头.如果放不下,就需要分片来传输.
MAC
头和IP
头的细节
- 在任何一台机器上,当要访问另一个IP地址的时候,都会先判断,这个目标IP地址,和当前机器的IP地址,是否在同一个网段.怎么判断同一个网段呢?需要CIDR和子网掩码
- 如果是同一个网段,例如,你访问你旁边的兄弟的电脑,那就没网关什么事情,直接将源地址和目标地址放入IP头中,然后通过ARP获得MAC地址,将源MAC和目的MAC放入MAC头中,发出去就可以了.
- 如果不是同一网段,例如,你要访问你们校园网里面的BBS,该怎么办?这就需要发往默认网关Gateway.Gateway的地址一定是和源IP地址是一个网段的.往往不是第一个,就是第二个.例如192.168.1.0/24这个网段,Gateway往往会是192.168.1.1/24或者192.168.1.2/24.
- 网关往往是一个路由器,是一个三层转发的设备.
- 很多情况下,人们把网关就叫作路由器.其实不完全准确,而另一种比喻更加恰当: 路由器是一台设备,它有五个网口或者网卡,相当于有五只手,分别连着五个局域网.每只手的IP地址都和局域网的IP地址相同的网段,每只手都是它握住的那个局域网的网关.
- MAC地址是一个局域网内才有效的地址.因而,MAC地址只要过网关,就必定会改变,因为已经换了局域网.两者主要的区别在于IP地址是否改变.不改变IP地址的网关,我们称为转发网关;改变IP地址的网关,我们称为NAT网关.
路由
静态路由
- 静态路由,其实就是在路由器上,配置一条一条规则.
如何配置路由
-
路由器就是一台网络设备,它有多张网卡.当一个入口的网络包送到路由器时,它会根据一个本地的转发信息库,来决定如何正确地转发流量.这个转发信息库通常被称为路由表
-
一张路由表中会有多条路由规则.每一条规则至少包含这三项信息.
- 目的网络: 这个包想去哪儿?
- 出口设备: 将包从哪个口扔出去?
- 下一跳网关: 下一个路由器的地址.
-
通过route命令和ip route命令都可以进行查询或者配置.
ARP
-
ARP(Address Resolution Protocol)
地址解析协议是根据IP地址获取物理地址(MAC
地址)的一个TCP/IP协议. -
由于OSI模型把网络分为七层,IP地址在OSI模型的第三层,MAC地址在第二层,彼此不能直接通信.在通过以太网发送IP数据包时,需要先封装第三层(32位IP地址),第二层(48为MAC地址)的报头.但由于发送数据包时只知道目标IP地址,不知道其MAC地址,而不能跨越第二层,所以需要使用地址解析协议.
-
使用地址解析后,计算机可根据网络层IP数据包包头中的IP地址信息对应目标硬件地址(MAC地址)信息,以保证通信的顺利进行.
ARP
的基本功能就是负责将一个已知的IP地址解析成MAC地址,以便主机能正常进行通信. -
只有是一个网段的,它才会发送ARP请求,获取MAC地址
-
Linux默认的逻辑是,如果这是一个跨网段的调用,它便不会直接将包发送到网络上,而是企图将包发送到网关.
ARP
工作流程
ARP
工作过程分为两个阶段:一个ARP
请求过程,一个是ARP
响应过程.- 两台主机(A:192.168.1.1 B:192.168.1.2)详细通信过程:
- 当主机A想发送数据给主机B时,首先在自己的本地
ARP
缓存表中检查主机B配置的MAC地址. - 如果主机A在缓存中没有找到相应的条目,它将询问主机B的MAC地址,从而将
ARP
请求帧广播到本地网络上的所有主机.该帧中包括员主机A的IP地址和MAC地址.本地网络上的每台主机都接收到了ARP
请求并且检查是否与自己的IP地址匹配.如果主机发现请求的IP地址与自己的IP地址不匹配,它将会丢弃ARP
请求. - 主机B确定
ARP
请求中的IP地址与自己的IP地址匹配,将主机A的地址和MAC地址添加到本地缓存表. - 主机B将包含其MAC地址的
ARP
回复消息直接发送回主机A(这个数据帧是单播). - 当主机A收到从主机B发来的
ARP
回复消息时,会将主机B的IP和MAC地址添加到自己的ARP
缓存表.本机缓存是有生存期的,默认ARP
缓存表的有效期是120s.当超过有效期后,将重复上面的过程.主机B的MAC地址一旦确定,主机A将能向主机B发送IP通信了.
- 当主机A想发送数据给主机B时,首先在自己的本地
ARP
缓存表维护工具-arp命令
-
ARP高效运行的关键是由于每个主机上都有一个ARP高速缓存。这个高速缓存存放了最近Internet地址到硬件地址之间的映射记录。高速缓存中每一项的生存时间一般为20分钟,起始时间从被创建时开始算起.
-
该命令用于查询本机ARP缓存中的IP地址和MAC地址的对应关系,添加或删除静态对应关系.
1
2
3
4
5
6
7
8
9
10arp
usage: arp [-n] [-i interface] hostname
arp [-n] [-i interface] [-l] -a
arp -d hostname [pub] [ifscope interface]
arp -d [-i interface] -a
arp -s hostname ether_addr [temp] [reject] [blackhole] [pub [only]] [ifscope interface]
arp -S hostname ether_addr [temp]
[reject] [blackhole] [pub [only]] [ifscope interface]
arp -f filename- -s inet_addr eth_addr [if_addr]: 向ARP缓存表中添加可将IP地址inet_addr解析成物理地址eth_addr的静态条目.要向指定接口的表添加ARP缓存条目,使用if_addr参数,此处的if_addr代表指派给该接口的IP地址;
- -d inet_addr if_addr: 删除指定的IP条目,此处的inet_addr代表IP地址.对于指定的接口,要删除表中的某项,使用if_addr,此处的if_addr代表指派给该接口的IP地址.要删除所有条目,使用星号(*)通配符代表inet_addr;
- -a inet_addr[-N if_addr]: 显示所有接口的当前ARP缓存表.要显示特定IP地址的ARP缓存项,使用带有inet_addr参数的arp -a,此处的inet_addr代表IP地址.如果未指定inet_addr,则使用第一个适用的接口.要显示特定接口的ARP缓存表,将-N if_addr与-a参数一起使用,此处的if_addr代表指派给该接口的IP地址.-N参数区分大小写.
- -v 查看帮助信息
ARP
报文格式
- 第一个字段是广播类型的MAC地址:
0XFF-FF-FF-FF-FF-FF
,其目的是网络上的所有主机. - 第二个字段是源MAC地址,即请求地址解析的主机MAC地址.
- 第三个字段是协议类型
- 硬件类型:表明ARP协议实现在哪种类型的网络上.
- 协议类型:表示解析协议(上层协议).这里一般是0800即IP.
- 硬件地址类型长度:MAC地址长度,此处为6个字节.
- 协议地址长度:IP地址长度,此处为4个字节.
- 操作类型:表示ARP协议数据包类型
- 1:表示ARP协议请求数据包
- 2表示ARP协议应答数据包
- 源MAC地址:发送端MAC地址
- 源IP地址:表示发送端协议地址(IP地址)
- 目标MAC地址:目标MAC地址
- 目标IP地址:表示目标段协议地址(IP地址)
NAT
网络地址转换技术
- 网络地址解析协议(NAT)解决的是内外网通信的问题.NAT 通常发生在内网和外网衔接的路由器中,由路由器中的 NAT 模块提供网络地址转换能力.从设计上看,NAT 最核心的能力,就是能够将内网中某个 IP 地址映射到外网 IP,然后再把数据发送给外网的服务器.当服务器返回数据的时候,NAT 又能够准确地判断外网服务器的数据返回给哪个内网 IP.
- NAT 需要作为一个中间层替换 IP 地址.发送的时候,NAT 替换源 IP 地址(也就是将内网 IP 替换为出口 IP);接收的时候,NAT 替换目标 IP 地址(也就是将出口 IP 替换回内网 IP 地址).
- NAT 需要缓存内网 IP 地址和出口 IP 地址 + 端口的对应关系.也就是说,发送的时候,NAT 要为每个替换的内网 IP 地址分配不同的端口,确保出口 IP 地址+ 端口的唯一性,这样当服务器返回数据的时候,就可以根据出口 IP 地址 + 端口找到内网 IP.
网络地址转换类型
- 静态NAT: 此类NAT在本地和全局地址之间做一到一的永久映射.须注意静态NAT要求用户对每一台主机都有一个真实的Internet IP地址.
- 动态NAT: 允许用户将一个未登记的IP地址映射到一个登记的IP地址池中的一个.采用动态分配的方法将外部合法地址映射到内部网络,无需像静态NAT那样,通过对路由器进行静态配置来将内部地址映射到外部地址,但是必须有足够的真正的IP地址来进行收发包.
- 端口NAT(PAT): 最为流行的NAT配置类型.通过多个源端口,将多个未登记的IP地址映射到一个合法IP地址(多到一).使用PAT能够使上千个用户仅使用一个全局IP地址连接到Internet.