TCP/IP下三层协议----网络接口层与网络层

时间:2023-01-26 10:34:20
一.网络接口层(链路层):

①以太网帧格式:

TCP/IP下三层协议----网络接口层与网络层

其中目的地址和源地址均是网卡地址(MAC地址),对于每个设备都是唯一的,ifconfig ---->HWaddr即是我们的MAC地址;而对于类型字段,可以有三种值:0800---IP,0806----ARP,8035----RARP;而对于帧末尾则是我们的CRC校验码 以太网帧的数据长度最小为46字节,最大为1500字节,也就是封装上层的数据帧,由于上层数据帧ARP和RARP不足46字节,因此要添加补充位,而对于最大的数据字节(以太网最大传输单元MTU),对于最大传输单元MTU取决于传输的网络类型,当上层数据帧的长度大于MTU大小时,就需要对数据帧进行分片,当然分片的动作并不是在此处进行的,而是由上层的协议进行分片(如IP协议)
对于CRC校验码(循环冗余校验码):作为一种差错校验码,最明显的特征就是在所要发送的信息字段的后面加上用于校验的冗余码字段。 而对于CRC的生成,(假设有k位信息码,n位冗余码),最主要在于n位冗余码的生成:(利用除法及余数原理) 举个例子:k位信息码位101001,需要给定3位冗余码,也就是生成(k+n,k)校验码,给定除数P为1101 计算方法:用k位信息码,先向它的末尾加上n个0(101001000),并将其作为被除数,用它除以我们的给定除数P(1101),而除的过程利用模2加,也就是我们的按位异或操作,计算得出余数R(001),将其作为我们的后三位冗余码,由此就可以得到我们的校验码(101001001) 补充一个概念:冗余码在这里也叫做帧检验序列FCS 上述就是CRC校验码在发送端的生成过程,而当我们的校验码到达接收端后,接收端会对其进行检测,大致方法如下: 将接收到的每一个帧都除以之前约定好的除数P,至于除法计算过程与生成过程相同,只不过在这里我们要判断余数是否为0,若为0,则在传输过程中并未出现差错,否则认为传输过程中出现误码,则认为当前接收的这个帧出现差错(但是这里我们并不能知道是哪一位或者哪几位出现差错),由此将当前帧进行丢弃 如上,就是CRC校验码的生成与校验过程,其中有一点不得不提,就是反复提到的除数P,在实际应用当中通常会有以下几种生成多项式(多项式中出现的每一项的次数就是表示了在之前二进制序列当中的哪一位存在1): CRC-16:X^16+X^15+X^2+1 CRC-CCITT:X^16+X^12+X^5+1 CRC-32
②ARP地址解析协议 在局域网当中,对于知道目的IP地址及端口号,却不知道目的MAC地址,很明显难以填写以太网数据帧中的目的MAC地址字段,无法实现信息从源主机到单一目的主机的传输,由此源主机会发出ARP请求询问目的主机的MAC地址,而目的主机在接收到请求后会发出ARP应答,发送自己的MAC地址给源主机 至于其中的具体过程,首先得了解ARP数据报的格式: TCP/IP下三层协议----网络接口层与网络层

上图是经过以太网数据帧封装的ARP数据帧格式,其中帧类型会被设置成0806(ARP请求/应答),硬件类型指的是链路层网络类型(1---以太网),协议类型是指要转换的地址类型(0x0800代表IP地址),op字段(0----ARP应答,1----ARP请求) 下面分析具体的ARP过程: 首先由源主机发出ARP请求,由于不知道目的MAC地址,所以这里我们采用广播的方式将以太网首部的目的MAC地址填写成全F,这样一来只要是在当前局域网内的主机均能够收到源主机发送的数据(注意:无论是不是广播方式,同一个局域网内的所有主机均能够收到源主机的数据,只是能否传给上层就得看MAC地址是否符合了),并传输给上层(由于在链路层对于与自己MAC地址不符的数据,会选择在当前层进行丢弃,这样一来一般的MAC地址就无法送达到上层进行IP地址的判断了,而广播这一方式很好的解决了这样的问题,在链路层所有主机均不会对数据进行丢弃,能够送达至上层进行IP地址的判断),对于IP地址吻合的主机,会发送ARP应答,将自己的MAC地址填写至源MAC地址字段,而目的MAC地址字段则是填写成之前送过来的ARP请求中的源MAC地址,经过以太网数据帧的封装发送出去,而这一次仅有指定的目的主机才能在上层获得所要的数据(源MAC地址)

二.网络层 IP协议: TCP/IP下三层协议----网络接口层与网络层

IP协议报头各字段: 4位版本:指IP协议的版本(4----IPv4),4位首部长度:占四位,单位为字(4字节),最小为5(20字节),最大为15(60字节);8位服务类型TOS:用于区分服务;16位总长度:指的是报头加数据整个数据报所占大小,单位字节【通过4位首部长度与16位总长度可以将报头与有效载荷区分开来】
16位标识:对于IP数据报进行标识,但并不代表序号(没有先后),当我们的IP数据报因为超过MTU大小时,需要进行分片,对于同一个数据报的分片,这个字段的值是相同的,便于之后的恢复;3位标志:MF=1表示之后还有分片,MF=0表示这是最后一个分片,DF=0表示当前数据报允许分片,DF=1则表示不能在进行分片,还有一位作为保留;13位片偏移:表示当前数据报在原数据报中的相对位置
8位生存时间TTL:表示游离报文的生存时间,防止存在太多的未能被处理的游离数据报文,在TTL为0时,路由器就会将此报文进行丢弃;8位协议:表示上层协议类型;16位首部检验和:用于对数据报报头信息进行检验
32位源IP地址:源主机IP地址;32位目的IP地址:目的主机IP地址
关于IP协议不得不提的就是IP地址:我们的IP地址被划分成网络号和主机号,以点分十进表示,网络号相同的IP地址之间处于同一个局域网当中,可以进行直接通信,而对于网络号不同的IP地址,它们处于不同路由器管理下的局域网当中,它们之间进行通信要通过路由器进行转发

TCP/IP下三层协议----网络接口层与网络层

按照网络号与主机号的两级结构,我们可以对IP地址进行如上划分,但是这种划分方式会导致我们申请到的网络号可以对应相当数量的主机(如B类IP,每一个网络号对应可以有65536个主机),但是一般来说我们并不需要这么多的主机,甚至远少于这个网络号下的主机数,这样一来就会导致大量的IP地址自己用不掉,别人又用不了,造成浪费。所以在此基础之上引入了子网的概念: 通过在主机号中取上前几位来作为子网号,这样一来可以用网络号+子网号来标识一个物理网络,这样一来这多个物理网络就位于同一个路由器所管辖下的局域网当中,这样的话就可以大大减少路由器的路由表的压力(不用记录所有的物理网络,而是记录它们所属的局域网) 子网掩码:网络号+子网号(在CIDR中称为网络前缀)所占的所有比特位用1进行表示,剩余的主机号用0表示 用子网掩码和IP地址进行按位与操作,即可计算出当前网络地址(包括网络号和所在子网号) CIDR消除了A,B,C,D类网络,以及划分子网的概念,而是以网络前缀来表示之前的网络号+子网号,除此之外,对于IP地址采用了斜线记法:IP地址/网络前缀位数,而根据网络前缀的位数可以划分出不同的地址块,而且很明显网络前缀位数越小,在这个地址块当中的网络数越多,而对于网络前缀位数少的地址块自然包含了位数多的地址块,这样一来就可以对于给定网络进行IP地址的分配,而且不受网络类型的限制,而由多个地址块小的网络构成一个地址块大的网络即是路由聚合或构成超网(即由多个网络前缀位数多的路由条目构成一个位数少的路由条目)
下面介绍一种特殊的IP地址:127.*,常用的是127.0.0.1,用作本地环回测试,当发送数据包的目的地址是环回地址,或者是与本机上的其他网络设备的IP地址相同的地址,那么数据包将不会发送到网络上,而是通过环回设备这一特殊的网络设备,将数据包重新由协议栈底层发回给上层,所以通常被用来网络协议栈和网络服务 TCP/IP下三层协议----网络接口层与网络层