学习笔记:网络协议之IP协议
本文仅供学习交流使用,侵权必删。
不作商业用途,转载请注明出处
IP地址,又称网际协议地址,由32位组成。IP地址是IP协议提供的一种统一的地址格式,为网络世界中的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
IP报文头
![](https://img.haomeiwen.com/i13554671/dc1874988a907537.png)
- Version(版本):4位,定义IP协议版本。是使用IPv4还是IPv6。两台机器必须使用一致的版本号,否则无法建立通信
- Hdr Len(头部长度):4位,定义数据报文头的长度。协议头最小值为5,最大值为15
- Type of Service(服务):8位,该字段定义上层协议对处理当前数据报所期望的服务质量,并对数据报按照重要性级别进行分配。前3位成为优先位,后面4位成为服务类型,最后1位没有定义。这些8位字段用于分配优先级、延迟、吞吐量以及可靠性
- Identification(标识):表示当前是第几个分片,数据报文重组时用到
- Flag(标记):3位,该字段由3位字段构成,其中最低位(MF)控制分段,存在下一个分段置为1,否则置0代表该分段是最后一个分段。中间位(DF)指出数据报是否可进行分段,如果为1则机器不能将该数据报进行分段。第三位即最高位保留不使用,值为0
- Fragment Offset(分段偏移):13位,表示分段数据在源数据报文中的相对位置,
- TTL(生存时间):8位,表示改报文的存活时间。每过1ms或者经过一个网关,TTL的值就减1。当TTL为0时,该报文被认为目的主机不可达,直接丢弃。
- Protocol(协议):8位,表示上层使用的协议,例如是TCP、UDP、ICMP、IGP等等。
- Header Checksum(头部校验和):16位,该字段帮助确保IP协议头的完整性。由于某些协议头字段的改变,这就需要对每个点重新计算和检验。计算过程是先将校验和字段置为0,然后将整个头部每16位划分为一部分,将个部分相加,再将计算结果取反码,插入到校验和字段中
- Source IP Address(源地址):32位,源主机IP地址
- Destination IP Address(目的地址):32位,目标主机IP地址
查看IP
日常我们查看IP地址的方式有:ip addr(需要iproute2) 或者 ifconfig(需要net-tools)
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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:16:4e:65:ff:fe brd ff:ff:ff:ff:ff:ff
inet 172.16.176.152/20 brd 172.16.191.255 scope global dynamic eth0
valid_lft 306370030sec preferred_lft 306370030sec
上面的172.16.176.152/20就是我们的IPv4地址。
ip地址后面的有个scope是global,表示eth0这张网卡是对外的。IP地址上面有一行是link/ether 00:16:3e:15:ff:fe brd ff:ff:ff:ff:ff:ff,这个是mac地址,就是网卡的物理地址,由6个byte组成。
上面还有一个lo(loopback),又称为回环接口,一般就是分配到127.0.0.1这个地址。这个地址一般用于本地,不会出现在网络中而是直接经过内核处理然后返回。
网卡名称旁边有一行<BROADCAST,MULTICAST,UP,LOWER_UP>的是网络设备的状态标识(net_device flags)
- UP代表处于启动状态
- BROADCAST表示这个网卡可以发送广播包
- MULTICAST表示可以发送多播包
- LOWER_UP代表插着网线
mtu是最大传输单元。mtu 1500表示ip packet不能超过1500byte。包括mac头不超过1518byte(其中mac头14字节,尾4字节)
qdisc这个是排队规则,这里排队规则采用的是pfifo_fast。排队规则的作用是内核通过网络发送数据的时候,按照这个接口配置的排队规则将数据包push到队列中。pfifo_fast采用先进先出的方式,但是pfifo_fast这种规则的队列包含三个band,这里面的原理暂时不太了解,后面有空再深入学习。
CIDR(无类型域间选路)
IP地址172.16.176.152/20,这个地址用的就是CIDR表示法。IP地址由<网络号><主机号>组合而成。172.16.176.152/20表示前20位表示网络号,后12位表示主机号。
子网掩码
另外我们可以通过子网掩码跟ip地址做按位与运算得到网络号。而子网掩码的二进制值就是网络位都为1,主机号都为0。
那么我的子网掩码就是255.255.240.0,跟ip地址做按位与运算得到网络号为172.16.176.0
广播地址
广播地址一般是网络号不变,主机号的二进制位都为1。得出广播地址为172.16.191.255
机器是如何通过IP通信
机器1需要与机器2通信,首先会先判断两个IP地址是否在同一个网段中,如果是同一个网段,机器1直接发送ARP请求获取MAC地址。如果不是,Linux的逻辑判断如果是一个跨网段的通信,它会获取网关的MAC地址,然后将包发过去。
这里只是非常简单描述IP层的联系,网络通信底层逻辑是极其复杂的。