有TCP、 UDP、 ICMP和IGMP数据都通过IP数据报传输。
Internte 是特指使用tcp/ip协议的网络。而internet是泛指使用协议通讯的网络。
ip
使用一种“我尽力送”,“送完我就不管”的方式进行数据数据报的投递。
也就是,不可靠的传送,不保存状态的传送。
有了数据我就封装送出去,至于数据报的先后达到顺序,是否能够到达不是ip负责的事情。
其上层也就是传输层负责可靠性之类的。
ip数据报
至于为什么带了两个物理地址的头部,还有一个IPv4类型的值:0x0800
我就也不知道了。
从0800后面开始的是ip报的内容。
- 版本号 4bit是有半位
ipv4为4,ipv6为6。 - IHL 4bit
保存ipv4头部的32位字(也就是4字节大小)的数量。表示的值最大是15,所以头部最长为60字节。
该值默认为5。也就是20。
该字段控制了选项的最大大小:最长为15*4=60b的头部,所以选项的最大长度为40B
也是记录了有效荷载部分从哪里开始 - Ds区分服务
区分服务代码点
没看懂 - ECN显式拥塞通知
路由如果有探测流量拥堵的能力。当路由探测到当前流量拥堵,那么会将流经的数据报的改字段设置为2
表示我这里的流量太大了。
当目的主机收到该数据报的时候,检测到ECN为2,会通知发送方降低发送速度。
这是避免和处理网络拥塞的方法之一。 - 总长度 16bit
是IPv4数据报的总长。所以这个长度和IHL长度的差,可以计算出数据部分的起始位置和长度。
因为长为16bit(一个int大小),所以可以携带65535字节数据。
如果长度太小,会被填充。
我的电脑上都被填充为66字节。还有54字节的。
虽然可以携带65535字节的数据,但是数据链路层的MTU不允许。所以通常分组
该字段指明了数据到哪里结束。
ip数据报最小为48或46,如果小于就被填充,是在以太网帧中被填充。
但是ipv4有一个576字节的限制,也一个ipv4数据报总大小为576,如果选项最大为60B,那么携带512B的有效荷载。 - 标识 16bit
主要是数据报分片以后,不会和别的分片混淆,依然能够组装。
后面讲 - TTL最大路由跳数(time to live) 8bit
一个数据包可以经过的路由器个数。上图的是0x80,也就是128个。
当该值为0时,被丢弃。会返回一个icmp
主要是为了防止路由环路的。 - 协议 8bit
数据报携带数据的类型。也就是TCP还UDP
TCP为6
udp为17
ICMP为1
现在主要用于识别其中封装的协议是否为一种传输层协议。
还有其他的类型,其他的值。 - 头部校验和 16bit
ip不检查数据报有效荷载(也就是携带数据的有效性。)
只检测头部信息的正确性
所以需要一种工具来检测数据的正确性。
当数据报经过一台路由器时,TTL变,所以检验和也要变。
在接收到ipv4数据报时,主机(或路由)从新计算一遍校验和,如果出错直接丢弃,并不会发送差错信息。
高层需要实现重发。 - 两个ip地址64bit
- ip选项。
该程度可变,最长320bit,40个字节。
暂时没遇到啊
以上就是ip的报头了。
校验和
Internet校验和算法:
1.待校验的相邻字节成对组成16比特整数并计算其和的二进制反码(二进制反码求和).
2.生成校验和,校验和区域本身应当先置0,并和待校验数据相加,其和进行二进制反码运算后赋给校验和区域.
3.检查校验和,将所有字节,包括校验和,进行相加并求二进制反码.如果结果为全1(即二进制反码算术中的0),检查通过.
二进制反码求和:从低位到高位逐列进行和计算,如果最高位(16位)进位,则得到的结果加1,一直循环到最高位没有进位为止.最后把得到的结果取反.程序实现如下:
short checksum(unsigned short *buf, int nwords)
{
//一个大于16位的变量
unsigned long sum;
//低位开始叠加,每次16bit
for (sum = 0; nwords > 0; nwords--)
sum += *buf++;
//一个大于16位的值,如果左移16位不是0,表明发生进位
while (sum >> 16)
//进位的值都是1,然后再加上原来的sum,但是使用0xffff将高位清空,也就是进位清空
//只剩下低16位的值
sum = (sum >> 16) + (sum & 0xffff);
return ~sum;
}
ip转发
如果目的主机和发送方位于同一子网中,那么直接将数据帧扔该目的主机。(通常是最后阶段了)
如果不是位于同一网络中,那么扔给路由器,让路由器处理。
ip层包括一些位移内存中的信息成为路由表或转发表。每次转发都需要从中查找信息。
路由和主机的区别
主机只会发送他生成的数据帧,如果接收到数据帧要不接受,要么直接丢弃,不会转发。
路由会转发别的主机或路由发送来的数据帧。
设备接收到数据帧
当设备接受到一个数据帧以后,数据链路层模块判断:数据帧的目的地址(物理地址),如果是本设备地址或是广播组播之类的地址,那么接受,(否则直接丢弃)。交给ip模块。
ip模块在判断,数据报中的目的ip地址是否是本机地址(或是广播之类地址),如果是,那么接受。
如果不是:
- 本机是一台主机。
直接丢弃数据报 - 本机是一台路由器
路由器会转发该数据报。
ip转发
每个路由保存一个ip转发表(也就是路由表)。用于判断数据报的下一跳。
表中每条包含:目的ip地址,掩码,下一跳ip,接口。
当路由进行数据报转发时:
首先检查数据报中的目的地址(ip地址),然后进行最长前缀匹配算法。
将该ip与转发表中的掩码进行与运算,结果中1最多的那个那条表示匹配最好。
将其下一跳地址作为该数据报的目的地址(ip)。
如果没有发现匹配条目,送到默认路由。再不行返回主机不可达。
ip数据报的主机处理
接受端 主机模式
- 强主机模式
只有当目的ip地址与数据报到达的借口配置的ip地址相同时,才将数据包交付到本地协议栈 - 弱主机模式
数据报的目的ip与主机的任意一个接口配置的ip地址相同时,就将数据报交付给本地协议栈
发送端
又是什么源地址选择算法