IP工作在网络层,所有的TCP、UDP、ICMP、IGMP报文都会被封装成IP数据包,其具有如下特性:
1、不可靠性
例如路由器的缓冲区溢出,IP会将缓冲区中的所有数据包丢弃并发送ICMP错误报文给发送源,所有的可靠性(即重传操作等)都应该由上层(应用层、传输层)提供。
2、无连接性
IP不会保存任何之前发送报文的信息或状态。
IP协议会用一个唯一的32位的IP地址来标识网络上每一台主机和路由器,一个主机或路由器也可以有多个不同的IP地址。IP地址的划分:此处是指IPV4地址
通常用点分十进制来表示32位的IP地址,即以八位为一组,共四组,例如 11000000 00000001 00000001 00000001=192.1.1.1
127.0.0.0~127.255.255.255的地址均为环回地址,环回地址是主机向自己发送报文的特殊地址,目的地址为环回地址的报文不会发送到网络上,通过ping环回地址,可以检测本机的TCP/IP配置。
IP具有两种功能:
1、addressing:通过将IP地址记录在头部来将IP报文发送到目的地
2、fragmentation:当IP报文过于大时,可以将其碎片化,到达目的地后重组(由于IP本身无法提供可靠性,而且碎片化会增加丢包的概率,一般情况下能不碎片化就不碎片化)
报文之间的处理是相互独立的,不会相互影响,也没有先后顺序之分(即B报文必须在处理完A报文后处理),这意味着IP报文可以乱序发送,并且到达相同地点的报文选择的路由也可以不一样。
IP头部
TCP/IP协议组头部的传送遵循大端序,拿上图来说,0-7位先传送,8-15后传送......。
版本号:记录IP的版本号,目前常见的有IPV4、IPV6,表示IP版本号为4和6。
首部长度:IP头部长度=首部长度*32/8。头部最长为60字节。
服务类型:TOS由三位优先级字段(用于表示报文的重要性)+四位TOS字段+一位不用的位(置为0)组成,4位TOS字段分别表示:最小延迟(1000)、最大吞吐量(0100)、最大可靠性(0010)、最小货币成本(0001),0000表示正常服务,设置TOS的目的是让上层协议就报文如何处理的问题向网络层提供提示,网络层会取对应的参数作为选择路由的衡量值。
数据报文总长度:IP数据报文的总长度(以字节为单位),通过该字段可以得知以太网帧的哪部分是IP报文。
标识:主机在工作时会发送许多IP报文,可以通过标识来辨别各个IP报文,主机每发送一个IP报文,标识的值就会加一,作为下一次发送的IP报文的标识字段的值。IP fragement的功能由标识、标志及片移量一同提供。
生存时间(TTL):设置了IP报文传送过程中所能经过的最大路由器数目,该值由发送源(不是转发源)初始化,每经过一个路由器,该值减一,当该值为0时,IP报文会被丢弃,路由器发送ICMP消息给发送源,设置该值是为了防止路由环路的出现,即A有路由到B,B也有路由到A,则A将IP报文发送给B,B又将IP报文发送给A。
协议:指定IP报文的数据部分是什么协议(如TCP),根据该字段将报文交给对应的传输层。
首部校验和:只会对IP头部进行校验。接收方在接收到IP报文时,首先会计算首部校验和,若发现有错误,则会丢弃IP报文,并且不会产生任何信息通知发送源,此时,IP报文丢弃的发现由传输层或应用层提供。
计算方式:
首先在发送端,有以下三步:
- 把即将发送的IP头部中的检验和设置为0,然后以16位为一个间隔,将IP头部分成许多个16位的字段;
- 将第1步获得的所有字段进行二进制相加求和;
- 把最终结果取反,就得到检验和,再将该值填充到IP头部。
其次在接收端,也有相应的三步:
- 把接收到的IP头部分成16位一个间隔的字段集合;
- 所有字段进行二进制相加求和;
- 将最终结果取反,判断该结果是否为0,若为0,则说明检验和正确,若不为0,则协议栈会丢掉这个包。(你没看错,这一步还是要取反)
为什么只要最终结果取反后为0则表示未更改?
当校验和在发送端计算时,IP头部的校验和全为0,设此时计算的结果为A,A取反的结果为B,在接收端进行计算时IP头部校验和的值为B,则计算结果为A+B,由于B为A取反,所以若各个字段都没有改变,则A+B的各个位均为1,取反后全为0.
源IP地址和目的IP地址:省略。
选项:为可选部分,包括:路由记录选项、时间戳选项、松散源路由选项、严格源路由选项,相关选项的介绍会在后序博客中总结,若IP头部长度不是4的倍数,将会填充0字节使其为4的倍数。
IP路由
什么是IP路由?简单点来说就是为了到达目的地,要选择哪条路径。
一般情况下,主机不会转发IP报文,路由器可以转发IP报文,但也可以通过设置让主机转发IP报文。主机和路由器均具有路由表(相当于我们的地图,只是这个地图是局部的),路由表中的内容包括:
1、目的地IP地址,这个值可以是主机IP地址,也可以是网络地址。
2、下一跳(即转发(发送)给下一个路由器)的IP地址或是直接相连的网络的地址。
3、标志域,标志IP地址是网络地址还是主机IP地址。
4、指定发送(转发)IP报文的接口。
路由器通过路由协议可以得知到达某一个IP地址的具体路径。
IP处理IP报文的过程:
每次网卡接收到IP报文时,会检查目的地IP地址是不是自己的,若是,或者该IP报文是广播的,则根据协议字段将去掉IP头部的报文交给对应协议模型处理,否则,若IP层可以转发报文,则根据路由表转发,若路由表找不到路由,则丢弃,并返回“主机不可达”或是“网络不可达”的ICMP报文给发送源,若IP层不可以转发报文,则丢弃报文。
IP路由按以下步骤进行:
1、搜索路由表,查找完全匹配的目的地IP地址(网络号和主机号都相等),如果找到了,直接发送IP报文。
2、搜索路由表,查找与目的IP地址网络号相等的网络地址,若找到,发送给与该网络相连的路由器,若该网络与自己的一个接口直接相连,则直接发送到对应网络。
3、搜索默认路由(IP地址和子网掩码均为0.0.0.0,该路由会连到另一个路由器,该路由器按顺序执行IP路由的步骤),若找到,则发送给默认路由。
子网
将网络位进一步划分,分为网络位和子网位,例如:192.1.2.1,则2表示子网。
为什么需要子网?
谈谈我的理解:
子网用于缓解IP地址紧张的问题,详情见下文
子网的IP地址要满足一些规则,这些规则在总结CCNA时在说。
子网掩码
问题:考虑这样一种情况,我们将一个C类地址划分给一个公司,C类地址的主机位有八位,意味着这个公司占用的C类地址最多可以分配254台主机(0和255的主机号不会被使用),但这个公司的电脑只有两台,多出的252个IP地址又不能给其他公司用,这就造成了IP地址的严重浪费。
将部分主机位置为网络位,可以解决这个问题。例如将主机位的前两位划分为网络位,则主机位只有六位,这个网络可分配的IP地址就会大大减少,那么如何知道多少位主机位呢?通过子网掩码,子网掩码的计算方式:将主机位置为0,其余位置1,例如:11111111 11111111 11111111 11000000=255.255.255.192。
下面介绍Linux的两个指令:
netstat:可以让用户得知目前都有哪些网络连接正在运作(windows上为netstat)。
ifconfig:ifconfig用于查看和更改网络接口的地址和参数,包括IP地址、网络掩码、广播地址(windows上为ipconfig)