参考文献

  • TCP/IP详解

链路层

  • TCP/IP协议族中,链路层主要有三个目的:
    1. IP模块发送和接收IP数据报;
    2. ARP模块发送ARP请求和接收ARP应答;
    3. 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 个字段:

    1. 源 MAC 地址
    2. 目标 MAC 地址
    3. 数据
  • 网卡的ROM中保存着全世界唯一的MAC地址,这是生产网卡时写入的

  • 网卡中保存的MAC地址会由网卡驱动程序读取并分配给MAC模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:16:3e:15:13:3f brd ff:ff:ff:ff:ff:ff
inet 172.26.175.8/20 brd 172.26.175.255 scope global dynamic eth0
valid_lft 312851716sec preferred_lft 312851716sec
inet6 fe80::216:3eff:fe15:133f/64 scope link
valid_lft forever preferred_lft forever

  • 在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通信了.
ARP缓存表维护工具-arp命令
  • ARP高效运行的关键是由于每个主机上都有一个ARP高速缓存。这个高速缓存存放了最近Internet地址到硬件地址之间的映射记录。高速缓存中每一项的生存时间一般为20分钟,起始时间从被创建时开始算起.

  • 该命令用于查询本机ARP缓存中的IP地址和MAC地址的对应关系,添加或删除静态对应关系.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     arp
    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报文格式

img
  • 第一个字段是广播类型的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.