IPV4报头详解
(网络层报头)
IPV4报头共有六行,每一行32bit、4字节,报头长度为20-60字节;
前五行为固定头部部分,共20字节;
最后一行为可选部分,取值范围为0-40bits,一般为空
第一行内容(Version、IHL、Type of Service、Total Length)
-
Version:版本
- 用于区分不同IP版本
- 大小:4bits
- IPV4=0100(代表版本4封装)
-
IHL:IP头部长度(I:IP;G:头部,L:长度)
- 因为Option可选部分不固定,导致IP头部长度不固定,所以需要标识头部长度
- IP报文长度必须是4 字节的整数倍,如果不是,需要最后的填充字段加以填充(用0补齐)
- 大小:4bits
- 范围:20~60字节(20字节为固定头部部分大小)
- 默认值:5/0101~15/1111
0101=5 5x4bits=20字节(最小)------- 1111=15 15x4bit=60字节
-
Type of Service:服务类型
- 对流量进行区分和识别,方便后续的抓取流量。
- 大小:8bits
- 区分方法:
-
8bit >> |0|1|2|3|4|5|6|7|
-
将8bits分为3+5两部分;
- 前三位二进制来定义优先级,把流量分为八种等级,0为正常转发,大多数时候这样认为7最高,但可以人为定义;
- 最后一位bits为0;
- 前三位定义的优先级等级分为:
等级 优先级 0(000) Routine(普通) 1(001) Priority(优先) 2(010) Immediate(快速) 3(011) Flash(闪速) 4(100) Flash Override(极速) 5(101) Critic/ECP(关键) 6(110) Internetwork Control(网间控制) 7(111) Network Control(网络控制)
-
- 将8bits分为6+2两部分;
- 前6位二进制定义DSCP区分服务代码点—DS字段,是 IP 优先级和服务类型字段的组合,把流量区分64种等级,0~63;
- 其中前三位区分IP优先级,与上面表格优先级区分相同;
- 第四位为延迟,0—>Normal delay(正常延迟);1—>Low delay(低延迟);
- 第五位为吞吐量,0—>Normal Throughput(正常吞吐量);1—>High Throughput(高吞吐量);
- 第六位为可靠性,0—>为Normal Reliability(正常可靠性);1—>High Reliability(高可靠性)
- 后2位是显示拥塞通知字段—ECN字段,用于QS,告诉其他路由器我已经转发不了了,最后一位为0;
- PHB逐跳行为
- 有的支持IP.P,有的支持DSCP,
- 以上两种都识别,兼容模式,用PHB识别DSCP,如果没有识别DSCP还是按照PHB的识别
-
Total Length:总长度
- 计算实际报文数据的长度
- 总长度 = IP 头部长度 + 数据长度
- 大小:16bits
- 总长度取值范围为0-65535字节,最大长度为 65535 字节(2的16 次方-1),链路只允许1500byte,所以一般都需要MTU分片
第二行内容(Identification、Flangs、Frangment Offset)
为了数据分片后的重组
-
Identification:标识符
- 重组数据时(解封装)标识符一样代表来自同一个数据,就是让目标主机确定一个新到达的分段是哪一个数据流的
- 大小:16bits
- 随机的空间为2的16次方=65535
- 原理:
- 当原始报文大小超过MTU,那么就必须将原始数据进行分片。
- 每个被分片的报文大小不得超过MTU,而这个字段还将在同一原始文件被分片的报文上打上相同的标记,一边接收设备可以识别出属于同一个报文的分片,“类似于进程号”—标识符。
- 相同的标识符使分片后的各数据报片最后能正确地重装成为原来的数据报。
-
Flangs:标记位
- 大小:3bits
- 标识数据是否分片
- 标记位被分为了三部分:
- 保留位:Reserved
- 没有被使用
- 不分片位:DF (Don’t Fragment)
- DF = 1:不允许分片(收到数据时,可以直接解封装)
- DF = 0:允许分片(收到数据时,需要先重组数据,再解封装)
- 保留位:Reserved
- 更多分片:MF (More Fragment)
- MF = 1:表示后面有分片
- MF = 0:表示当前是最后一个分片
- 当上一位DF=0时才看这一位
- 重组数据时,需要通过这一位来确保数据分片全部收到后再开始重组,所以当MF=0时才开始重组数据
-
Frangment Offset:分片偏移
- 标识某个分片在分组中的位置
- 大小:13bits
- 如果没有分片,该字段为 0;如果有分片,片偏移以 8个字节为偏移单位,每个分片的长度一定是 8字节 (64位)的整数倍。
第三行内容(Time to Live、Protocol、Header Checjsum)
-
Time to Live:生存时间(TTL)
- (网络层防环机制)用于三层防环用的,防止数据包发生环路
- 大小:8bits
- TTL值:255(最大,2的8次=255),TTL并不是一个真正时间值,用来表示跳数的大小,即数据包能传多少跳;不同的操作系统TTL值不同
- 原理:
- 数据包每经过一个路由器,TTL值就减 1 ,当 TTL = 0 时,丢弃这个报文,从而阻止报文在网络上无限传输。
-
Protocol:协议
- 标识出传输层的地址或协议号;也就是说表示数据要进行什么样的上层服务,应该交给自己上一层的哪个协议(ICMP/IGMP/OSPF都介于网络层和传输层之间,但一般视作网络层,因为都需要用IP报头封装),告诉主机的 IP 层应该将数据交给哪个上层处理过程
- 大小:8bits
- 协议号范围:0-255(0一般不用),1 代表ICMP,6代表TCP,17代表UDP,89代表OSPF
-
Header Checjsum:报头校验和
- 用于IP首部校验,为了防止其他人篡改IP头部,要是校验失败不再解封装直接丢弃该报文
- 大小:16bits
- 计算方法:
- 校验核的16位字段只对首部查错,不包括数据部分,数据部分由高层协议校验
- 经过路径的每一跳,路由器都要重新计算出的首部检验和并与此字段进行比对,如果不一致,此报文将会被丢弃
- 重新计算的必要性是因为每一跳的一些首部字段(如TTL、Flag、Offset等)都有可能发生变化,不检查数据部分是为了减少工作量
- 数据区的错误留待上层协议处理——(UDP)和(TCP)都有检验和字段;此处的检验计算方法不使用CRC
第四行内容(Source IP Address)
- Source IP Address:源IP地址
- 发送端 IP 地址,Web 应用中,源 IP 不能是受限广播 IP
- 大小:32bits
第五行内容(Destination ip address)
- Destination ip address:目的IP地址
- 接收端 IP 地址;255.255.255.255 为受限广播,路由器将丢弃该报文;x.x.x.255 直接广播,该报文将被发送到 x.x.x.0/24 子网的每一台主机上
- 大小:32bits
第六行内容(Options、Padding)
- Options:可选字段
- Option字段很少使用,用于控制、转发要求、测试等
- 包括机制:
- 松散路由(LSR - Loose Source Route):只要以此经过记录的IP,多经过几个路由器不要紧,网关可以不遵守
- 严格路由(SSR - Strict Source Route):记录出去的IP,数据包严格按照这个记录去转发,并且在转发过程中将源路由替换为路由器地址,不是规定路由则丢弃数据包,最多指定10条路由
- 路由记录(RR - Record Route):记录访问一个地址经过的路由器的IP地址,长度由始发设备设置,不能被放大,如果到达目的前被填满,则只会记录部分路由
- 时间戳(TS - Time Stamp):与 RR 类似,只是将路由改为时间戳,每个路由器都插入时间戳,用来查看路由之前的传输时长
- 扩展:为了不暴露内网路径,防火墙应丢弃携带 RR Option 和 TS Option 的报文
- Padding:填充项
(这一项图中没有画出来,但是实际报头中存在这一项)- Option字段长度需要是 4 字节的整数倍,非整数倍将 PAD 填充
UDP报头详解
(传输层报头)
UDP报头共有两行,每一行32bit、4字节,报头长度为8字节
第一行内容(Source Port、Destination Port)
-
Source Port:源端口号
- 指明发送数据的进程,不需要时可全用0
- 大小:16bits
-
Destination Port:目的端口号
- 指明目的主机接收数据的进程,在终点交付报文时必须要使用到
- 大小:16bits
第二行内容(Length、Checksum)
-
Length:长度
- 该字段值为报头和数据两部分的总字节数,其最小值是8(仅有首部)
- 大小:16bits
-
Checksum:检验和
- UDP检验和作用于UDP报头和UDP数据的所有位;由发送端计算和存储,由接收端校验;校验UDP用户数据报在传输中是否有错,有错就丢弃
- 大小:16bits
TCP报头详解
(传输层报头)
TCP报头共有六行,每一行32bit、4字节,报头长度为20-60字节;
前五行为固定头部部分,共20字节;
最后一行为可选部分,取值范围为0-40bits,一般为空
第一行内容(Source Port、Destination Port)
-
Source Port:源端口号
- 指明发送数据的进程
- 大小:16bits
- 进行TCP通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号(ftp20,ssh22,telnet23,dns53,http80,https443)
-
Destination Port:目的端口号
- 指明目的主机接收数据的进程
- 大小:16bits
- 进行TCP通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号(ftp20,ssh22,telnet23,dns53,http80,https443)
第二行内容(Sequence Number)
- Sequence Number:序号/序列号
- 指发送数据的位置
- 大小:32bits
- 序号用来标识从TCP发送端向接入端发送的数据字节流进行编号,可以理解成对字节流的计数
- 序列号不会从0或1开始,而是建立连接时由计算机随机生成的数字作为初始值,然后将发送过去的字节数累加到初始值上,表示数据的位置
- 此外,在建立连接和断开连接时发送的SYN包和FIN包虽然不携带任何数据,但也会作为一个字节增加对应的序列号
第三行内容(Acknowledgement Number)
1.Acknowledgement Number:确认号
- 指已收到确认应答前一位为止的数据,发送端接受到这个确认应答以后,可以认为以前的数据都已经被正常接受
- 大小:32bits
- 确认号包含发送确认的一端所期望收到的下一个序号;确认号只有在ACK标志为1时才有效
第四行内容(Data Offset、Reserved、Flags、)
-
Data Offset:首部长度
- 用于表示TCP报文首部的长度
- 大小:4bits
- 数据偏移是指数据段中的“数据”部分起始处距离 TCP 数据段起始处的字节偏移量;其实这里的“数据偏移”也是在确定 TCP 数据段头部分的长度,告诉接收端的应用程序,数据从何处开始
-
Reserved:保留位
- 便于扩展新项目
- 大小:6bits
- 为 TCP 将来的发展预留空间,目前必须全部为 0,但即使收到的包在该位上不为0,此包也不会被丢弃
-
Flags:标志位
- 大小:6bits
- 每一位从左到右,分别是URG , ACK , PSH , RST , SYN, FIN
- URG
- 标识紧急指针是否有效,表示包中是否有紧急数据需要处理
- 告诉系统此报文段中有紧急数据
- URG=1 时表示有紧急数据;当 URG=1 时,后面的紧急指针字段才有效
- URG