【Linux】数据链路层 and 其他知识

📝前言:

这篇文章我们来讲讲Linux网络------数据链路层:

🎬个人简介:努力学习ing

📋个人专栏:Linux

🎀CSDN主页 愚润求学

🌄其他专栏:C++学习笔记C语言入门基础python入门基础C++刷题专栏


目录

一,MAC帧格式

虽然局域网内,IP是唯一的,但是两个主机如果想要通信,就算知道了对方的唯一IP,还是要通过MAC地址来通信 。(局域网内负责数据转发的核心设备(交换机)"不认识 IP 地址,只认 MAC 地址",IP 地址无法完成 "物理端口定位")

  • 源地址和目的地址是指网卡的硬件地址(也叫 MAC 地址), 长度是 48 位,是在网
    卡出厂时固化的;
    • MAC 地址用来识别数据链路层中相连的节点;
    • 长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
    • 在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址).
  • 帧协议类型字段有三种值,分别对应 IP、ARP、RARP;
  • 帧末尾是 CRC 校验码

二,MTU和MSS

MTU(最大传输单元):

  • 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的 MTU
    了,则需要对数据包进行分片(fragmentation),加重丢包风险
  • MTU 直接限制 IP 报文总长度(如以太网 MTU=1500 时,IP 报文总长度最大 1500 字节)
  • 并通过 MSS(TCP 的单个数据报的最大消息长度) 间接限制 TCP 报文段
    • MSS = MTU - IP 头最小长度(通常 20 字节) - TCP 头最小长度(通常 20 字节)。例如,常见以太网 MTU 为 1500 字节时,MSS 默认值即为 1500 - 20 - 20 = 1460 字节,这意味着单个 TCP 报文段最多能携带 1460 字节的应用数据。

MSS:

  • TCP 在建立连接的过程中, 通信双方会进行 MSS 协商.
    • 双方在发送 SYN 的时候会在 TCP 头部写入自己能支持的 MSS 值.
    • 然后双方得知对方的 MSS 值之后, 选择较小的作为最终 MSS.
    • MSS 的值就是在 TCP 首部的 40 字节变长选项中(kind=2)
  • 最理想的情况下, MSS 的值正好是在 IP 不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的 MTU).

三,ARP协议

1. ARP数据报

  • 源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
  • 硬件类型指链路层网络类型,1 为以太网;
  • 协议类型指要转换的地址类型,0x0800 为 IP 地址;
  • 硬件地址长度对于以太网地址为 6 字节;
  • 协议地址长度对于和 IP 地址为 4 字节;
  • op 字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答。

2. ARP 工作流程

ARP 不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议。

因为交换机只认MAC地址,所以我们需要ARP技术,来通过对应的目的IP,得到对应主机的MAC地址。

工作流程:

  1. 由源主机向目标主机发送ARP请求,ARP请求里带上源主机的MAC地址,源IP和目的IP,这里的目标MAC地址是广播地址(FF:FF:FF:FF:FF:FF)
    • 这个请求整个局域网的所有主机都能收到,其他局域网中的主机接收到了这个ARP请求,通过检查目的IP,发现不是给自己的就会丢弃
  2. 当目标主机发现ARP请求中的目的IP是自己时,就会把自己的MAC地址填写进ARP响应包,发回去。(这里的MAC地址是具体的,是私发)
    • 知道具体MAC地址时,用单独的MAC地址时是私发,不知道的时候,找MAC地址的时候是广播(FF:FF:FF:FF:FF:FF)
  3. 源主机收到对应的ARP响应以后,就能得到目标主机的MAC地址,就可以通信了

    每台主机都会维护一个 ARP 缓存表,可以用 arp -a 命令查看。缓存表中的表项有过期时间(一般为 20 分钟),如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址。

四,打通一遍通信流程

假如内网主机A要向公网主机C发送消息:

  1. 内网主机A,通过子网掩码计算出网络号,发现网络号与自身不同,不在同一内网,于是查自己的路由表找下一跳(默认路由,路由器R的IP)
  2. 交给路由器R的时候,也是局域网通信,只知道IP地址,所以需要通过ARP得到对应的MAC地址,得到的时候,会在主机A和路由器内都维护一个ARP缓存表
  3. 路由器R拿到数据(封装好的数据,从应用层到数据链路层)以后,把对应的内网源ip1:port1替换成自己的wan口ip:port2(NAPT技术),然后以wan口ip:port2当做源ip发出去,这时候也会在路由器R内部形成内网IP:PORT到公网IP:PORT的映射表【NAT转换】
  4. 路由器R在自己的路由表里面找到目标网络地址对应的下一跳,然后发过去
    • R 也是通过 ARP 获取公网下一跳的 MAC 地址
  5. 通过好几跳,主机C子网的对外的路由器收到了数据,然后通过ARP得到主机C的MAC地址,然后成功把数据交给了主机C
  6. 主机C构建好应答以后,以wan口ip:port2当做目的ip
  7. 应答经公网多跳转发后,到达主机 A 的网关路由器 R 的 WAN 口,然后通过映射表,知道是给主机A的,又通过ARP缓存表,知道主机A的MAC地址,于是应答就到了

在这里我们可以发现:NAT技术只能从内向外(要先从内向外有映射),不能直接从外向内(因为也不知道内网主机的IP啊)

五,代理服务器

1. 正向代理

代理服务器在client 和 互联网(运营商)之间,代表客户端向目标服务器发送请求。正向代理服务器接收客户端的请求,然后代表客户端将请求转发给目标服务器。正向代理可以实现多种功能,如提高访问速度、隐藏客户端身份、实施访问控制等。

2. 反向代理

反向代理服务器位于客户端和 Web 服务器之间,当客户端发起请求时,它首先会到达反向代理服务器。反向代理服务器会根据配置的规则将请求转发给后端的 Web服务器,并将 Web 服务器的响应返回给客户端。在这个过程中,客户端并不知道实际与哪个 Web 服务器进行了交互,它只知道与反向代理服务器进行了通信

六,内网穿透

因为NAT无法从外向内,所以我们需要在公网中多添加一台机器,先让内网的设备和公网中的机器建立连接。后续另一个内网的私有设备访问公网设备的,再由公网设备中转,就可以实现访问之前建立了连接的内网设备了。

七,内网打动

步骤:

  • 第一步:双方与信令服务器建立连接,暴露 "NAT 映射信息"
  • 第二步:信令服务器交换双方信息(公网映射地址(公网 IP + 端口)),触发 "打洞请求"
  • 第三步:建立直接 P2P 连接,脱离信令服务器

八,网络究极问题

浏览器发起http,到得到网页的整个过程,帮我描述一下,越详细越好

从浏览器发起 HTTP 请求到得到网页,涉及应用层→传输层→网络层→数据链路层→物理层的全栈交互,以及服务器端的反向流程。

  • 第一步【应用层准备】:用户输入URL,浏览器对URL进行解析,得到协议信息,域名,以及目标资源路径...
    • 浏览器会检查缓存(或通过域名服务器)将域名转换成对应的IP
  • 第二步【建立应用层 → 网络层桥梁】:客户端会拿着IP与服务器建立 TCP 连接,进行三次握手,并建立长连接来复用TCP连接,避免多次握手的开销
    • Linux内核对TCP做出了很多优化
      • 确认应答:应答时携带自身数据
      • 滑动窗口:通过窗口缩放因子扩大接收窗口,提升吞吐量;
      • 拥塞控制:根据网络状况动态调整发送速率,避免拥塞;
      • 延迟确认:合并多个 ACK 包,减少网络开销。
  • 第三步【应用层】:(LST握手形成应用层加密通道)浏览器发出HTTP请求报文,Linux 内核通过socket接口将 HTTP 数据封装为 TCP 段(send()系统调用),后传入网络层
  • 第四步【数据链路层与物理层传输】:网络层进行 IP报头封装,数据链路层通过 ARP进行MAC封装,帧通过网线(电信号)或无线(电磁波)传输到网关,经路由器转发(基于路由表),最终到达服务器所在网络
  • 第五步:服务器端网络栈逐层解封请求报文。反向代理(如 Nginx)接收请求,根据Host头转发到对应后端服务,由后端服务处理业务,生成 HTTP 响应
  • 第六步:响应报文经 TLS 加密→TCP 封装→IP 封装→MAC 封装,沿原路径返回客户端
  • 第七步:浏览器解析响应头,然后得到对应的网页,最后TCP 连接关闭(四次挥手

🌈我的分享也就到此结束啦🌈

要是我的分享也能对你的学习起到帮助,那简直是太酷啦!

若有不足,还请大家多多指正,我们一起学习交流!

📢公主,王子:点赞👍→收藏⭐→关注🔍

感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

相关推荐
刀法孜然3 小时前
vim 编辑中,临时挂起编辑器进程,返回到终端命令行
linux·编辑器·vim
Amelio_Ming3 小时前
systemd-journald和rsyslogd日志配置详解
linux·运维·服务器
稚辉君.MCA_P8_Java3 小时前
WebSocket 是什么原理?为什么可以实现持久连接?
网络·数据库·websocket·网络协议
九皇叔叔3 小时前
Linux Shell 中的 $():命令替换的核心用法
linux·运维·chrome
半桔4 小时前
【网络编程】详解 IP 协议:报头字段、路由器功能、网段划分和分片传输
linux·网络·网络协议·tcp/ip
大聪明-PLUS4 小时前
TCP/IP 协议族—理论与实践(二)
linux·嵌入式·arm·smarc
liulilittle4 小时前
Linux内核网络优化:两个网络调优解决方案
linux·运维·服务器·网络·内核·信息与通信·通信
hweiyu004 小时前
Linux运维实战:系统及服务管理(视频教程)
linux·运维·服务器
风随心飞飞4 小时前
linux 环境下mysql 数据库自动备份和清库 通过crontab 创建定时任务实现mysql数据库备份
linux·数据库·mysql