ip协议字段
- 网络层是负责地址管理和路由转发的,换句话说,和ip地址是强相关滴
- 网络链路当中的每一个路由器和交换机都会进行分用得到数据链路层的目的MAC地址和网络层的目的IP地址
- 引申出来,我们在socket编程的时候为什么需要对IP和端口进行主机字节序转换成网络字节序
4位版本:
- 指的是ip协议的版本
4位首部长度:
- 指的是ip协议报头的长度
- 4个比特位计算出来的是数值,需要乘以4, 才表示ip协议报头的长度
- 报头的长度= 4个比特位计算出来的数值* 4,单位字节
eg:0101 * 4 = 20字节
8位服务类型:
- 前三位是描述的是优先级,但是被弃用了
- 后4位分别是: 最小延时(ssh),最大吞吐量(ftp),最高可靠性, 最小成本
- 如果要指定则比特位置位1,如果为0, 则表示默认属性
- 并且这4个比特位有互斥属性.
- 最后一位是保留位,置位0
16位总长度: 2^16
- UDP协议: 2^16次方
- UDP是整条数据递交的
- TCP协议: MSS最大报文段长度
- MTU = ipheader + TCPheader +有效载荷( tcp数据)(1500字节)
- 限制了tcp给ip协议提交数据的长度
- MTU是数据链路的限制,根据网络链路传输的电气特性决定的值
- 对于TCP数据,递交到网络层之后,网络层的ip协议打上ip协议的报头之后,可以直接提交给数据链路层
- UDP在传输数据的时候,有可能传输的数据大于了数据链路层的MTU,也就是意味着IP协议需要将UDP进行分片传输(为了满足MTU的要求,将UDP数据切割成不同的小片,进行传输 )
- 对于IP协议本身是不负责数据的可靠传输的
- UDP协议也是不负责数据的可靠传输的
- 当UDP数据递交网络层的IP协议的时候, 如果大于MTU, 则网络层需要进行分片传输(分片传输,相当于传输了多个ip数据包)
- 对于UDP而言,分片传输当中的所有分片构成了一个UDP数据包
- 对于IP协议而言,每一个分片都是一个独立的ip数据
- 就会导致当UDP进行分片传输的时候,其中一个分片丢失了 ,其他的UDP数据则会被丢弃
- 总结:
- TCP不需要分片传输的
- UDP则有可能需要进行分片传输
- 如果UDP数据本身大于(MTU- ( ip头部+udp头部) ) (MTU(1500) - 20 - 20=1460字节),则需要进行分片传输
- 如果UDP数据本身小于等于(MTU- (ip头部+udp头部) ),则不需要分片
- ip协议的分片传输其实是针对UDP而言的
16位标识:
- 标识ip数据报,属于哪一个udp数据的分片; 同一个udp数据报在网络层分片之后,都具有相同的标识
3位标志:
- 位0:预留位
- 位1:禁止分片
- 禁止了UDP传输的数据大于MTU的值,如果大于, 则直接丢弃
- 位2:更多分片
- 如果该位为1,则表示还有分片
- 如果为0,则表示该分片是最后一个分片
13位片偏移:
- 最大表示的数字是2^13
- 偏移量= 13位片偏移计算出来的数值 *8
- 2^13 * 2^3 = 2^16 ==>可以完美的表示当ip数据报为最大长度2^16时,计算偏移量
- 计算分片相对于整个udp数据包的相对位置
8位生存时间:
- 最大跳数,最大存活时间,TTL, 标志当前的ip数据包,可以被转发设备转发多少次。
- 当转发设备每转发一次, 则TTL减1,直到减为0
- 如果当TTL为0的时候,还没有到达目标主机,则转发设备就会丢弃该条数据,不给转发了
- 如果当TTL不为0的时候,就到达了目标主机,则发送成功
- 当转发设备每转发一次, 则TTL减1,直到减为0
- TTL的初始默认值一般是64
- TTL存在的意义就是为了防止循环路由, 防止因循环路由而造成的带宽浪费
8位协议:
- 标识传输层在使用什么协议,在递交数据的时候,就知道将数据递交给传输层的哪一个协议了
16位的首部校验和:
- 判断ip数据在传输过程当中是否失真
32位源IP地址 / 32位目的IP地址:
- 一般情况下,在网络链路当中传输的时候,是不会进32位目的IP地址行更改的;
- 拥有地址转换服务器的网络除外(NAT/NAPT)