Linux网络——链路层协议

目录

    • 以太网协议
        • 协议格式
        • MAC地址
        • 详谈MTU
        • ARP协议
            • 协议格式
            • 概念
        • DNS协议
        • NAT/NAPT
            • NAT
            • NAPT
            • NAT缺陷
            • NAT和代理服务

以太网协议

协议格式

  • 功能:负责相邻两个设备之间的数据传输;
    Linux网络——链路层协议_第1张图片
  • 48 位源端 / 对端 Mac 地址:网卡的物理硬件地址,在网卡出厂时固定,用于识别指定相邻设备;
  • 16 位数据类型:用于数据分用时上层解析协议的选择,一般有三种,分别对应IP、ARP、RARP;
  • 32 位数据帧尾:校验和进行差错校验;

MAC地址

  • 概念:MAC 地址用来识别数据链路层中相连的节点,长度为 48 位,即 6 个字节,一般用 16 进制数字加上冒号的形式来表示,例如:08:00:27:03:fb:19;
  • 性质:MAC 地址在网卡出厂时就确定了,不能修改,MAC 地址通常是唯一的(虚拟机中的 MAC 地址不是真实的 MAC 地址,可能会冲突,也有些网卡支持用户配置 MAC 地址);

详谈MTU

Linux网络——链路层协议_第2张图片

  • MTU:链路层限制的最大传输单元,以太网默认 1500 字节;
  • MSS:最大数据段大小,这个在 tcp 建立连接前双方会协商 mss 的大小,mss = mtu - IP 最小报文长度 - tcp / udp 最小报文长度;
  • TCP:mtu = 1500 字节,mss = 1460 字节;
  • UDP:mtu = 1500 字节,mss = 1472 字节;
  • MTU 对于 IP 的影响:
    由于数据链路层 MTU 的限制,对于较大的 IP 数据包要进行分包,将较大的 IP 包分成多个小包,并给每个小包打上标签,每个小包 IP 协议头的16 位标识(id)都是相同的,每个小包的 IP 协议头的 3 位标志字段中,第 2 位置为 0,表示允许分片,第 3 位来表示结束标记(当前是否是最后一个小包,是的话置为 0,否则置为 1),到达对端时再将这些小包按顺序重组,拼装到一起返回给传输层,一旦这些小包中任意一个小包丢失,接收端的重组就会失败,但是 IP 层不会负责重新传输数据;
  • MTU 对于 TCP 的影响:
    tcp 连接时双方会协商 mss 大小,然后取双方较小的 mss 作为最大数据段大小进行传输,每次从发送缓冲区中取出不大于 mss 大小的数据封装报头进行传输,而从上面看出 mss 是绝对小于 mtu 的,所以 tcp 在传输层会自动进行数据分段,在网络层就不会进行分片处理;
  • MTU 对于 UDP 的影响:
    udp 并不会协商 mss,只要数据段大小在 64k 字节 ~ 28k 字节之间就可行,但是如果这个数据段大小大于 mtu 就会分片,而分片后在对端重组的过程中很有可能出现问题,一旦一个分片出现问题,那么整个报文就会被丢弃(不可靠传输,丢弃就没了),因此分片越多,传输出问题的几率越大,因此在使用 udp 传输时,我们最好在传输层就计算好 mss 大小并进行分包,这样在网络层就不会进行分片;

ARP协议

协议格式

Linux网络——链路层协议_第3张图片

  • 协议格式中源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的;
  • 硬件类型指链路层网络类型,1 为以太网;
  • 协议类型指要转换的地址类型,0x0800 为 IP 地址;
  • 硬件地址长度对于以太网地址为 6 字节;
  • 协议地址长度对于和 IP 地址为 4 字节;
  • op 字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答;
概念
  • 概念:介于网络层与链路层之间的协议,通过 IP 地址获取 mac 地址;
  • 功能:在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址,而数据包被网卡接收到需要先判断数据包的硬件地址与本机是否符合,如果 mac 地址符合再去处理上层协议,如果 mac 地址不符合则直接丢弃,因此在通讯前必须获得目的主机的硬件地址;
  • 流程:假设我们通过路由表找到数据下一跳要到达 IP 地址为 192.168.0.1 的主机,那么就会有如下流程;
    1. 源主机发出 ARP 请求,请求的内容为(IP 地址是 192.168.0.1 的主机的硬件地址是多少?),并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播);
    2. 同一网段下的主机接收到广播的 ARP 请求,如果发现 IP 地址与本机不符合,则直接丢弃,如果发现 IP 地址与本机相符,则发送一个 ARP 应答数据包给源主机,将自己的硬件地址填写在应答包中;
    3. 每台主机都维护一个 ARP 缓存表(ip–mac),可以用arp -a命令查看,缓存表中的表项有过期时间(一般为 20 分钟),如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址;
  • 为什么要有缓存表?为什么表项要有过期时间?
    缓存表的作用是为了提高查找效率,不用每一次都要进行 ARP 请求,如果有缓存记录,既可以直接使用;
    缓存表有过期时间是因为 dhcp(动态分配 IP),现在大部分 IP 地址都是动态分配的,一定时间后,要通信主机的 IP 地址可能发生改变,所以缓存表需要在一定时间后进行更新,所以缓存表有过期时间;
  • ARP 欺骗攻击:伪造 IP 进行 ARP 响应;
    解决方案:将相邻主机的 MAC 地址存入白名单,然后对于 ARP 响应的 MAC 地址与白名单进行比对,如果不存在,则认为是欺骗攻击,不予理睬;

DNS协议

  • 背景:TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序,但是 IP 地址不方便记忆,于是人们发明了一种叫主机名的东西,是一个字符串,并且使用 hosts 文件来描述主机名和 IP 地址的关系;
  • 域名:是一个便于记忆的字符串,代表了一个服务器的别名,访问服务器时通过解析域名得到服务器的 IP 地址,然后进行访问;
  • 发展:一个域名服务器支撑不了所有人的访问,因此采用分布式存储,将域名信息分散存储到世界各地;
  • 划分:
    顶级域名服务器:.com / .org / .gov / .cn / .en / .jp / …
    二级域名:.baidu.com / .taobao.com / …
    三级域名:.zhidao.baidu.com / .tieba.baidu.com / …
    Linux网络——链路层协议_第4张图片
  • 域名解析流程:
    Linux网络——链路层协议_第5张图片
  • 经典面试:当你在浏览器地址栏输入一个URL后回车,将会发生的事情?
    域名解析——》搭建 tcp 客户端——》组织 http 请求——》发送请求——》服务器收到请求进行解析——》业务处理——》组织 http 响应——》客户端收到响应进行解析——》根据 content-type 解析处理正文;
  • icmp 协议:是一个网络层协议,通常用于进行网络探测,基于该协议的有 telnet–23 端口、ssh–22 端口、ping–不用端口;

NAT/NAPT

NAT
  • 概念:NAT 能够将私有 IP 对外通信时层级替换为全局 IP,也就是就是一种将私有 IP 和全局 IP 相互转化的技术方法,很多学校、家庭、公司内部采用每个终端设置私有 IP,而在路由器或必要的服务器上设置全局 IP,全局 IP 要求唯一,但是私有 IP 不需要,在不同的局域网中出现相同的私有 IP 是完全不影响的;
    Linux网络——链路层协议_第6张图片
  • 上图中 A 主机与服务器进行通信的流程如下:
    • NAT 路由器将源地址从 10.0.0.10 替换成全局的 IP:202.244.174.37;
    • NAT 路由器收到外部的数据时,又会把目标 IP 从 202.244.174.37 替换回 10.0.0.10;
    • 在 NAT 路由器内部,有一张自动生成的,用于地址转换的表,当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系;
NAPT
  • 上面的情景如果不只是 A 与服务器通信,而是 A、B、C 都与服务器进行通信,那么他们的目标 IP 地址都是 163.221.120.9,如果此时服务器回复数据后,那么路由器要将数据发给谁呢?这是路由器识别不出来的,所以诞生了 NAPT 技术,使用 ip + port 来建立另一个映射关系;
    Linux网络——链路层协议_第7张图片
NAT缺陷
  • NAT 依赖转换表,所以限制很多;
  • 无法从 NAT 外部向内部服务器建立连接;
  • 转换表的生成和销毁都需要额外开销;
  • 通信过程中一旦 NAT 设备异常,即使存在热备,所有的 TCP 连接也都会断开;
NAT和代理服务
  • 路由器往往都具备 NAT 设备的功能,通过 NAT 设备进行中转,完成子网设备和其他子网设备的通信过程;
  • 代理服务器看起来和 NAT 设备有一点像,客户端向代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器,服务器返回结果后,代理服务器又把结果回传给客户端;
  • 那么 NAT 和代理服务器的区别有哪些呢?
    • 从应用上讲,NAT 设备是网络基础设备之一,解决的是 IP 不足的问题,代理服务器则是更贴近具体应用,比如通过代理服务器进行,另外像迅游这样的加速器,也是使用代理服务器;
    • 从底层实现上讲,NAT 是工作在网络层,直接对 IP 地址进行替换,代理服务器往往工作在应用层;
    • 从使用范围上讲,NAT 一般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网进行;
    • 从部署位置上看,NAT 一般集成在防火墙、路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上;
  • 代理服务器是一种应用比较广的技术:
    • ():广域网中的代理;
    • 负载均衡:局域网中的代理;
  • 代理服务器分为正向代理和反向代理:
    • 正向代理:A 想要买一个国外的产品,但是自己不方便,所以让经常去外国出差的 B 捎带些,此时相对于这个产品厂家,B 就是正向代理;
    • 反向代理:现在除了 A 以外,还有许多其他人也想买这个产品,所以都去找 B 帮忙,B 觉得这样的捎带太麻烦了,所以直接买了很多很多产品屯在家里,如果有人需要,就直接从家里拿给他,不必每次出差带些回来,此时相对于产品厂家,B 就是反向代理;
    • 正向代理用于请求的转发,反向代理往往作为一个缓存;

你可能感兴趣的:(Linux的网络学习,以太网,路由器,DNS,ARP,NAT与代理)