Linux网络层相关知识及报文格式

前置认识

ip=网络地址+主机地址

Mac是应用于局域网,只在局域网里的唯一性,而IP地址是保证在全网里的唯一性的,其实在数据传输过程中有两套地址,Mac地址会一直根据目的地址而改变,而IP地址始终不变,现在的IP地址一般使用IPv4,代表IP地址有四字节,还有其他的,比如说IPv6等等,IPv6有128个比特位表示IP地址,大概16个字节

如果目标主机和源主机不在同一个子网,源主机就要先把数据交给路由器,路由器解包后,知道Mac的源地址和目标地址确认这个数据需要通过自己传出去,通过查自己的表才能转发到另外一台主机,路由器可以通过解包封装再次把报文传出去,这是把以太网协议转化为令牌环网协议,这样IP协议依靠路由器屏蔽了底层网络的差异化,而路由器需要搭配两张网卡才能实现这种功能

所以IP地址在传输过程中一般不会发生改变,但Mac地址在出局域网后会丢弃源和目的的地址,由路由器重新包装

bash 复制代码
ifconfig

路由器本质上也是一个子网的主机,也需要配备IP地址,而且因为路由器至少连接两个子网,所以路由器相当于有多个网卡,也就是有多个IP地址,路由器一般是子网中的第一台设备,一般主机号都是1,路由器不仅参与构建子网,还可以转发报头,不具备传输层和应用层。
内网IP:指在局域网(LAN)内部使用的IP地址,由路由器维护,主要用于局域网内设备之间的通信。与公网IP不同,内网IP无法直接通过互联网访问,而是通过路由器或NAT(网络地址转换)技术与外部网络通信。

报头


4位版本 :指的是指定IP协议的版本,对于IPV4来说就是4。
4位首部长度 :表示的是ip报头长度,因为只有4位,所以最大可以表示15,可以表示的ip报头最大长度是15*4B=60B,没带选项的标准报头是20字节,所以选项最大是40字节。
8位服务类型 :3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0).,4位TOS分别表示最小延时, 最大吞吐量, 最高可靠性, 最小成本.,这四者相互冲突, 只能选择一个.,对于ssh/telnet这样的应用程序, 最小延时比较重要,对于ftp这样的程序, 最大吞吐量比较重要。
16位总长度 :表示数据报总共占多少个字节。
8位生存空间 :ip报文会被一直转发,但这是因为目的地址找不到或者网络有问题,这种游离报文会一直存在,所以我们必须设置生存时间ttl,这是指我们的报文最多可以经过路由器的跳数,如果TTL减到0还没送达,那么这个报文要被丢弃。
8位协议 :用于表示我们要把数据字段交付给上层的哪一个协议编号。
16位首部校验和 :ip中要对首部做校验,校验失败的报文直接丢弃,校验成功才向上交付。
32位目的IP地址 :用于进行路径选择,tcp用于提供端口,IP协议用于提供IP地址。
数据 :包括TCP报头等传输层报头,HTTP报头等应用层报头和需要传输的数据。
16位分片标识 :在一台主机中,报文并没有在网络层就发出去了,而是交给数据链路层,由数据链路层判断是要转发给同一网段的主机还是路由器,但数据链路层不能一次性发送太大的报文,所以当网络层需要传输的报文太大,那么就需要网络层把报文分片,网络层也可以把分片的报文组装起来,不同的IP报文分片标识是不一样的,分片后的分片标识是一样的。
3位标志 :第二位置为1表示不允许分片,为0表示允许分片,第三位表示结束标志位,如果当前报文是最后一个包,第三位就为1,否则的话就设置为0。
13位片偏移 :原始报文被分为若干片,13位片偏移表示每一片在原始报文里的偏移量,我们可以通过片偏移是否为0判断报文是否被分片,当我们收到分片里除了第一个分片的任何一个分片,13位片偏移一定不为0,即使是第一个分片,我们也可以通过3位标志里的第三位结束标志位来判断是否分片。

我们并不建议分片,因为有任何一个分片丢失,报文都需要重新发送,所以我们需要减少分片,具体丢哪一个片可以通过13位片偏移和3位标识的第三位来判断是第一个还是最后一个,还是中间的片丢失来判断。

在数据链路层发送数据的时候会有数据碰撞的问题,所以在发送的时候就适合发送短数据,但如果是这样的话又需要网络层进行分片,所以我们需要在尽量少分片的情况下分片。

IP划分

因为主机号位数太多,而每个局域网使用的主机数都会小于等于主机号能表示的主机数,所以AB类网络会让大量的IP地址被浪费掉
CIDR方法 :在分类划分法的基础上,引入一个子网掩码来区分网络号和主机号,子网掩码是一个32位的整数,通常用一串0来结尾,是在路由器内部配置的,将IP和子网掩码进行按位与操作,得到的就是网络号,就可以找到接下来要去的位置,网络号和主机号的划分和这个IP是哪一类IP无关。

在任何一个子网当中,不存在主机号为0或者主机号为全1的主机,因为主机号为全0的是网络号,主机号为全1的是广播。假设IP地址是120.151.20.68,子网掩码是255.255.255.240,也就是1111 1111 1111 1111 1111 1111 1111 0000,掩码完的网络号就是120.151.20.64,后四位是主机号,所以子网地址范围就是从120.151.20.64到120.151.20.79,子网掩码也可以写成122.133.144.155/24,表示前24个比特位为1,剩下的为0。

这样,比如说主机号有16位,而最后主机只有14台,那么最多只需要4位的主机号,而子网掩码的方法可以把剩下12位主机号变成2^12个子网,每一个子网最多可以存放2 ^4台主机,只有就可以大大提升IP的利用率。
特殊的IP地址 :将IP地址中的主机号全部设为0,就成为了网络号,代表这个局域网,如果全部设为1,就成为了广播地址,用于给同一个链路中相互连接的主机发送数据包,127.*的地址主要是用于本地环回测试,通常是127.0.0.1
动态分配IP地址 :只给接入网络的设备分配IP地址,所以同一个MAC地址的设备,每次的IP可能是不一样的。
IPv6 :用16字节128位比特位来表示一个地址,和IPv4是完全不兼容的,连协议都是不一样的。
私有IP和公网IP :以下的IP地址只能用来组建私网,10.开头的IP ,前8位是网络号,共16,777,216个地址。172.16.到172.31.开头的IP ,前12位是网络号,共1,048,576个地址。192.168.开头的IP,前16位是网络号,共65,536个地址。包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP)。

运营商 :消息一定是先到运营商内部,再到其他地方

路由

在复杂的网络中找到一条通往目标的路

bash 复制代码
route #可以查当前机器的路由表

第一列指的是这台主机直接相连的网络,第二列指的是下一跳的路由器,第三列指的是目的网络的子网掩码,Iface列指的是本地的网络接口,当我们需要把报文发出去的时候,就通过这些网络接口进行发送,所以当我们路由的时候,会拿着目标主机的公网IP按位与上Genmask获得网络号,如果得到的网络号和Destination相等,那么我们就通过Iface对应的接口把数据发出去,如果匹配不上,就查下一个,如果在路由表中查不到,那么路由器就会把数据推送到默认路由器中,也就是下图里的default。

ICMP协议

在网络中出现问题的时候,这个协议是会对我们的报文进行应答的。

有一种原始套接字,这种套接字可以帮我们绕过传输层,直接到网络层构建ICMP,ping命令就是使用这种原理,所以ping也不关心端口号,因为端口号是传输层的内容。

当路由器收到了一个报文,发现这个报文是一个含有ICMP报头的报文,如果发现目标地址的主机有出什么状况后,就会返回ICMP的报文,并在类型里填充对应的差错报告发回去,主要是用于网络诊断。

NAT技术

工作在网络层,直接对IP地址做替换,只能部署在局域网的出口。

在下图,每一台家用主机都有自己的私有IP,如果要传输一个报文到服务端,那么就要先把报文交给家用路由器,再交给运营商路由器,发送到公网,才能转发到服务端,但这需要一个前提,否则私有IP就会被传输到公网中,所以,子网IP(也被称为LAN口IP)相当于是私有IP,WAN口IP相当于是公网IP,由于家用路由器和运营商构成一个子网,所以家用路由器的WAN口IP就相当于运营商的一个内网IP,当路由器要把一个报文转发出去的时候,会把源IP转化为WAN口IP,例如,一个报文要从192.168.1.201转发到122.77.241.3的时候,先是经过家用路由器,srcIP就变成10.1.1.2,destIP不变,当进入运营商路由器的时候,srcIP就变成122.77.241.4,目的IP依旧不变,这样就可以交到122.77.241.4这台主机上,如果这台主机想把响应报文返回回去,就把srcIP和destIP换个位置,就可以正常返回报文,也可以避免内网IP在公网里传播,私有IP不断被替换的技术,就被称为NAT技术 ,这样,大家的内网IP就可以重复,最后就可以节省IP。

我们也可以看到,在运营商路由器之下的主机和家用路由器IP,实际上都是私有IP。

NAPT :如果按照上面的方法,服务器主机想把数据发回来的话,确实是可以发回来的,但只能发到拥有WAN口IP的路由器上,因为发回来的目的IP是公网IP,路由器并不知道要把这个报文传输给内网里的哪一台主机,所以我们就需要一张映射表,把内网中使用的源IP源端口,目的IP,目的端口作为key值或者value值,这个一定是唯一的,把转化为WAN口IP的源IP,源端口,目的IP,目的端口变成value或者key值,我们会发现替换完之后的WAN口IP是一样的,但端口号改变了,端口号没有冲突,就能标识唯一性。

内网穿透 :如果我们在公司的局域网的主机,需要访问家里的局域网的主机,那么可以先让家里的主机与公网的服务器建立tcp长连接,然后在公司的主机里向公网的服务器发信息,然后这个公网服务器把信息通过tcp转到家里的主机,就实现了在一个局域网的主机里控制另外一个局域网的主机的效果。

代理服务器

工作在应用层,可以部署在局域网,也可以部署在广域网,也可以跨网。
正向代理 :就像学校的校园网,如果学生登录了校园网,那么学生发出的请求都是从学校服务器发出去的,再由学校服务器替学生去访问外网,导致目标服务器不知道真实客户端是谁,正向代理主要用于请求的转发。
反向代理 :一个公司可能有多台机器,如果把机器的地址全部暴露出去,客户可能会只访问一台机器或者几台机器,就会导致几台机器处理数据繁忙而其他机器空闲的情况,所以我们可以通过一台机器把所有请求接收了,然后分配给空闲的机器,再把处理完的数据转发回去,这样可以让流量均衡,像内网穿透就是反向代理,这样,客户端就不知道真实的服务器是谁,反向代理主要是用于缓存。

相关推荐
盛世宏博北京1 小时前
6. 物联网环境监测新标杆:POE供电以太网温湿度变送器技术详解
大数据·运维·网络·以太网·poe·温湿度变送器
穷途末路程序员2 小时前
linux设备驱动程序框架(进阶1)——利用udev自动生成设备文件
linux
wregjru2 小时前
【网络】7.数据链路层:MAC 帧与 ARP 协议详解
网络
程序猿编码2 小时前
轻量又灵活:一款伪造TCP数据包的iptables扩展实现解析(C/C++代码实现)
linux·c语言·网络·c++·tcp/ip·内核·内核模块
_OP_CHEN2 小时前
【Linux网络编程】(二)计算机网络概念进阶:彻底搞懂协议本质、传输流程与封装分用
linux·运维·服务器·网络·网络协议·计算机网络·c/c++
风曦Kisaki2 小时前
# 云计算基础Day06:Linux权限管理
linux·云计算
勇闯逆流河2 小时前
【Linux】linux进程概念(fork,进程状态,僵尸进程,孤儿进程)
linux·运维·服务器·开发语言·c++
牛十二2 小时前
宝塔安装openclaw+企业微信操作手册
linux·运维·服务器
⑩-2 小时前
API 网关的作用?Spring Cloud Gateway 原理?
java·服务器·网络·spring cloud