第五章 Internet协议 网络层

有TCP、 UDP、 ICMP和IGMP数据都通过IP数据报传输。

Internte 是特指使用tcp/ip协议的网络。而internet是泛指使用协议通讯的网络。

ip

使用一种“我尽力送”,“送完我就不管”的方式进行数据数据报的投递。
也就是,不可靠的传送,不保存状态的传送。
有了数据我就封装送出去,至于数据报的先后达到顺序,是否能够到达不是ip负责的事情。
其上层也就是传输层负责可靠性之类的。

ip数据报

IP数据报
IP数据报

至于为什么带了两个物理地址的头部,还有一个IPv4类型的值:0x0800
我就也不知道了。

从0800后面开始的是ip报的内容。

  1. 版本号 4bit是有半位
    ipv4为4,ipv6为6。
  2. IHL 4bit
    保存ipv4头部的32位字(也就是4字节大小)的数量。表示的值最大是15,所以头部最长为60字节。
    该值默认为5。也就是20。
    该字段控制了选项的最大大小:最长为15*4=60b的头部,所以选项的最大长度为40B
    也是记录了有效荷载部分从哪里开始
  3. Ds区分服务
    区分服务代码点
    没看懂
  4. ECN显式拥塞通知
    路由如果有探测流量拥堵的能力。当路由探测到当前流量拥堵,那么会将流经的数据报的改字段设置为2
    表示我这里的流量太大了。
    当目的主机收到该数据报的时候,检测到ECN为2,会通知发送方降低发送速度。
    这是避免和处理网络拥塞的方法之一。
  5. 总长度 16bit
    是IPv4数据报的总长。所以这个长度和IHL长度的差,可以计算出数据部分的起始位置和长度。
    因为长为16bit(一个int大小),所以可以携带65535字节数据。
    如果长度太小,会被填充。
    我的电脑上都被填充为66字节。还有54字节的。
    虽然可以携带65535字节的数据,但是数据链路层的MTU不允许。所以通常分组
    该字段指明了数据到哪里结束。
    ip数据报最小为48或46,如果小于就被填充,是在以太网帧中被填充。
    但是ipv4有一个576字节的限制,也一个ipv4数据报总大小为576,如果选项最大为60B,那么携带512B的有效荷载。
  6. 标识 16bit
    主要是数据报分片以后,不会和别的分片混淆,依然能够组装。
    后面讲
  7. TTL最大路由跳数(time to live) 8bit
    一个数据包可以经过的路由器个数。上图的是0x80,也就是128个。
    当该值为0时,被丢弃。会返回一个icmp
    主要是为了防止路由环路的。
  8. 协议 8bit
    数据报携带数据的类型。也就是TCP还UDP
    TCP为6
    udp为17
    ICMP为1
    现在主要用于识别其中封装的协议是否为一种传输层协议。
    还有其他的类型,其他的值。
  9. 头部校验和 16bit
    ip不检查数据报有效荷载(也就是携带数据的有效性。)
    只检测头部信息的正确性
    所以需要一种工具来检测数据的正确性。
    当数据报经过一台路由器时,TTL变,所以检验和也要变。
    在接收到ipv4数据报时,主机(或路由)从新计算一遍校验和,如果出错直接丢弃,并不会发送差错信息。
    高层需要实现重发。
  10. 两个ip地址64bit
  11. 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地址是否是本机地址(或是广播之类地址),如果是,那么接受。
如果不是:

  1. 本机是一台主机。
    直接丢弃数据报
  2. 本机是一台路由器
    路由器会转发该数据报。

ip转发

每个路由保存一个ip转发表(也就是路由表)。用于判断数据报的下一跳。
表中每条包含:目的ip地址,掩码,下一跳ip,接口。

当路由进行数据报转发时:
首先检查数据报中的目的地址(ip地址),然后进行最长前缀匹配算法
将该ip与转发表中的掩码进行与运算,结果中1最多的那个那条表示匹配最好。
将其下一跳地址作为该数据报的目的地址(ip)。

如果没有发现匹配条目,送到默认路由。再不行返回主机不可达。

ip数据报的主机处理

接受端 主机模式

  1. 强主机模式
    只有当目的ip地址与数据报到达的借口配置的ip地址相同时,才将数据包交付到本地协议栈
  2. 弱主机模式
    数据报的目的ip与主机的任意一个接口配置的ip地址相同时,就将数据报交付给本地协议栈

发送端

又是什么源地址选择算法

你可能感兴趣的:(第五章 Internet协议 网络层)