第三章 IP :网际协议
IP协议提供不可靠,无连接的数据报传送服务。
不可靠:不保证IP数据报成功到达目的地。
无连接:IP不维护后续数据报的状态信息(不一定按序发送和接收)。
IP首部
IP首部一般为20个字节,除非包含选项字段。
版本:IPv4或IPv6
首部长度:首部的长度,以4 byte为单位,包含选项字段。该字段共4 bit,因此IP首部最长为60 Byte,且必须为4 Byte的倍数
服务类型:
总长度:整个IP数据报的长度,以byte为单位。该字段共16 bit,所以IP数据报最长为2^16 byte
标识:唯一标识主机发送的每一份数据报
TTL:Time-To-Live,数据报可以经过的最多路由数,一旦经过一个处理它的路由器,它的值减1,当为0时,数据报就被丢弃,并发送ICMP报文通知 源主机。
协议:识别是哪个协议向IP协议传送数据,包括TCP,UDP,ICMP,IGMP……
首部检验和:根据IP首部计算的检验和码(将该字段置0,对首部中每16bit进行二进制反码求和,结果存在该字段;接收方收到后对首部中没16bit进行二进制反码求和,若结果全为全1,则正确)(注意是对IP首部进行检验,而不是IP首部+IP数据,而UDP的检验和是针对UDP首部+UDP数据)(但是为什么要反码?)
IP地址:32bit,记录格式一般为点分十进制(e.g. 192.168.1.1)
为什么要用反码求和而不是原码求和来检验首部和?
1)首先,我们要明确反码求和和原码求和的区别,反码求和溢出时,即最高位有进位,则将该进位加到最低位上;而原码求和则是丢弃该进位。
2)其次,明确Big Endian字节序和Little Endian字节序:
TCP/IP网络传输时,先传0-7bit,其次8-15bit,然后16-23bit,最后24-31bit(从小到大),这叫网络字节序,也叫Big Endian字节序。
Big Endian字节序:最高字节在地址最低位,最低字节在地址最高位
Little Endian字节序:反之
比如将 0x1234 存入 0x0000 开始的内存
Memery Big Endian Little Endian
0x0000 0x12 0x34
0x0001 0x34 0x12
3)那么,使用反码求和就可以不依赖系统是Big Endian字节序还是Little Endian字节序,而原码求和会受到字节序的影响。
4)最后,举个例子就明白了。
原码:
10000000 00000000
+10000010 00000000
=00000010 00000000
原码,使用另一种字节序:
00000000 10000000
+00000000 10000010
=00000001 00000010
反码:
01111111 11111111
+01111101 11111111
=11111101 11111111
反码,使用另一种字节序:
11111111 01111111
+11111111 01111101
=11111111 11111101
可以看到,反码求和,改变了字节序,结果相同,只是字节顺序相应地也交换了;而原码的结果就不同了。
IP路由选择
IP从TCP,UDP,ICMP和IGMP接收数据报(即本地生成的数据)并进行发送,或者从一个网络接口接收数据进行转发或接收。
1)当数据来自TCP,UDP,ICMP和IGMP(从上传递下来的):
传递给链路层
2)当数据报来自网络接口(从下传递上来的):
(1)IP首先判断IP地址是否为本地地址或者广播地址,如果是就送到首部协议段所指定的协议模块进行处理(继续向上传递)
(2)如果不满足这些地址,且IP层设置为了路由功能,那么就对数据报进行转发,否则数据报被丢弃
那么,什么叫IP的路由功能呢?有了路由功能怎么对数据报进行转发呢?
当收到一个IP数据报的时候,IP并不知道该数据报达到最终目的的完整路径,所有的IP路由选择只为数据报提供下一站路由器的IP地址,IP的路由选择功能为:
1)搜索路由表,寻找目的IP地址(网络号+主机号),找到则发给该行记录的下一个路由器
2)若1)失败,则继续搜索路由表,寻找目的IP地址的所在网络号,找到则发给该行记录的下一个路由器
3)若2)失败,则继续搜索路由表,寻找叫做“默认”的那行记录,找到则发给该行记录的下一个路由器
4)若3)失败,则该数据报就不能被传送
子网掩码
IP地址=网络号+子网号+主机号
子网掩码即与IP地址对应的网络号和子网号为1,主机号为0的32个bit
子网的划分缩减了路由表的规模:
为了到达IP地址为140.252.*.*的主机,路由表现在只需记录到达子网络140.252的下一跳,而不需要记录该子网下的所有主机的下一跳。