Linux IP 协议承担承上启下职责,向上对接传输层,向下适配链路层。内容涵盖 IP 报文格式详解,包括版本号、首部长度、服务类型、总长度、标识、标志、片偏移、生存时间及检验和等字段含义。阐述网段划分原理、子网掩码计算、私有与公网 IP 定义及 NAT 转换过程。深入分析 IP 分片与重组机制、MTU 限制对传输的影响,以及 MAC 帧结构与 ARP 协议跨网段寻址。最后探讨正反向代理服务器区别与内网穿透实现原理,为网络排查与优化提供理论支撑。
不羁2 浏览
拆解 Linux 中的 IP 协议与数据链路层
在 Linux 内核的网络子系统中,IP 协议承担着承上启下的关键职责:向上接收传输层(TCP/UDP)的数据包,为其添加地址与路由信息;向下将数据包交付给链路层(以太网等),完成物理传输的适配。当一个数据包从应用层发出,它会先经过 TCP 封装,再进入 IP 层被打上源 IP 和目的 IP 的标签,随后通过路由表计算出最优路径,最终通过网卡发送出去。这个过程中,IP 地址的分配、路由的选择、数据包的分片与重组,每一个环节都直接影响 Linux 网络的稳定性与性能。
含目的地址的报文,会被当前局域网的所有主机拿到,但为什么只会给确定主机?因为 MAC 帧的包装,当其它主机看到该报文时,会查看里面的 MAC 地址,当该报文的'目的 MAC 地址'和自己的'MAC 地址'不一样,就会主动抛弃,实现快速辨别的效果。
整个传输过程
首先 MAC 帧的数据包经过上下层的贯穿协议会直达路由器 A,中间局域网的主机不会接收,因为目的 MAC 地址是自己的路由器 A,此时 MAC 帧包装的 IP 数据包被路由器获取。
再去除外层的 MAC 帧拿到 IP 数据包,NAT 转换:替换里面的 IP 为自己的公网 IP,分配公网端口。
该路由器再根据目的 IP 查看路由表,确定下一跳(路由器),该路由器 A 再通过 ARP 协议由该路由器 A 通过公网向已经确定的下一跳路由器 B 发送请求,让路由器 B 告诉路由器 A 自己的 MAC 地址。
此时路由器 A 再重新封装 MAC 帧,源 MAC 地址为自己,目的 MAC 地址为路由器 B 的,再转交给网络。
当经过多个路由器到达最后一个路由器 C,去除 MAC 帧,找到了该数据包的目的 IP 网段,路由器 C 再通过 ARP 协议询问当前内的百度服务器,百度服务器回复路由器 C,C 再重新封装 MAC 帧,目的 MAC 地址为百度服务器的,源 MAC 地址为路由器 C,数据变完成了发送!
注意:路由器也可以理解为一个主机,也在执行操作系统上下层协议。
ARP 协议
解决的问题:数据从应用层贯穿数据链路层才能经过网卡这些硬件发送,中间需要很多路由器运输,而 MAC 帧又是数据链路层的,需要不断更新源 MAC 地址和目的 MAC 地址,中间是无法跨越的。
ARP 协议怎么实现跨网段传输:ARP 协议只能在同一个网段中使用,ARP 协议可以快速在当前局域网内实现获取对方的 MAC 地址。那么在公网中呢?公网又是一个局域网,被逐渐分层,中间由运营商控制(路由器的公网 IP 又在一个局域内)。
ARP'欺骗'原理:当路由器 A 收到目标路由器 B 的 ARP 应答(其中就包含了 B 的 MAC 地址)之后,只要 ARP 的格式正确和目的主机是自己,就不会去验证真实性。此时 A 为了下次快速的获取 MAC 的地址,会将这些信息缓存下来,形成 ARP 缓存,如果多次收到同样的 ARP 应答,会更新 ARP 缓存表。
此时如果中间设备伪造 ARP 应答给路由器 A(知道对方的 IP 即可),随后将原来路由器 B 的 MAC 地址换成自己的'我是路由器 B,我的 MAC 地址是..',此时 A 在发送数据时,本来发给 B 的数据包就直接发给了中间人,形成'截胡'。
解决问题:只有客户端主动向服务器发送请求,服务端才可以和客户端之间实现通信,即服务端在无客户端主动发送请求的条件下,NAT 会直接拦截服务端的请求,因为内网 IP 在外网设备看来是不认识它的;而内网穿透就是实现双向通道,帮外网设备找到内网设备。
原理:首先我们要明白,私网客户端在公网的身份是:该路由器的公网 IP+ 分配端口。那么私网设备 A 通过这个 B 在公网的这个身份(长链接),不就可以访问到 B 吗?所以内网穿透本质是私网设备主动访问中间公网服务器,这样公网服务器就知道了私网设备的身份,那如果中间公网服务器再把双方的公网身份告诉对方,私网设备 A 不就可以直接和私网设备 B 通信!私网设备主动访问公网设备——>获取公网身份——>私网设备通过公网身份实现交流。