IPV4数据包结构(20字节):
1-1 版本4位:表示版本号,目前最广泛的是IPv4=B0100,相信IPv6=B0110
1-2 头长4位:数据包头部长度。它表示数据包头部包括多少个32位长整型,也就是多少个4字节的数据。无选项则为5(红色部分)。
1-3 服务类型:包括8个二进制位,每个位的意义如下:
过程字段:3位,设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)~ 7(网络控制)
延迟字段:1位,取值:0(正常)、1(期特低的延迟)
流量字段:1位,取值:0(正常)、1(期特高的流量)
可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)
成本字段:1位,取值:0(正常)、1(期特最小成本)
保留字段:1位 ,未使用
1-4 总长度16位:当前IP数据包的总长度,单位是字节。当然最大只能是65535,即63KB。
2-1 重组标识16位:发送者发送的包的顺序,依序递增1,如果客户端收到的包乱序了。依据这个排序,例如下图
2-2 标志3位:
第一位:保留字段
第二位:取值:0(允许数据报分段)、1(数据报不能分段)
第三位:后面是否有更多分片,取值:0(数据包后面没有包,该包为最后的包)、1(数据包后面有更多的包)
2-3 段偏移量13位:与更多段位组合,帮助接收方组合分段的报文,以字节为单位。
【示例wireshark抓包 标准位+偏移量共计 16位】
3-1 生存时间8位:经常ping命令看到的TTL(Time To Live)就是这个,每经过一个路由器,该值就减一,到零丢弃。
3-2 协议代码8位:表明使用该包裹的上层协议,如TCP=6,ICMP=1,UDP=17等。
【示例TCP】
3-3 IP头检验和16位:是IPv4数据包头部的校验和。
IP首部检验和字段(16位,2字节),只计算IP头部的的所有字段的校验和,它不对首部后面的数据进行计算。
发送方:计算一份数据报的IP头部检验和,则需要首先把此检验和字段置为0。然后对首部中每个16 bit(2字节)进行二进制反码求和(整个首部看成是由一串16 bit的字组成),然后结果存在此检验和字段中。
接受方:当收到一份IP数据报后,对首部中每个16 bit(2字节)进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。
4-1 源始地址:32位=4字节,我们常看到的IP是将每个字节用点(.)分开,如此而已。
5-1 目的地址:32位,同上。
6-1 可选选项:主要是给一些特殊的情况使用,往往安全路由会当作攻击而过滤掉,普联(TP_LINK)的TL-ER5110路由就能这么做。
7-1.用户数据。
IPV6数据包结构(40字节):
1-1 版本(Version):版本字段用来表示IP协议的版本,该字段长度为4比特位,对应值为6(0110)。
1-2 流量分类(Traffic Class):流量分类字段用来标识对应IPv6的流量类别,该字段长度为8比特位,类似于IPv4中的ToS(服务类型)字段。
1-3 流标签(Flow Label):流标签字段时IPv6数据报中新增的一个字段,该字段长度为20比特位,可用来标记报文的数据流类型,以便在网络层区分不同的报文。
2-1 有效载荷长度(PayLoad Length):有效载荷长度字段是以字节为单位的标识IPv6数据报中有效载荷部分(包括所有扩展报头部分)的总长度,也就是除了IPv6的基本报头以外的其他部分的总长度,该字段长度为16比特位。
2-2 下一个头部(Next Header) :下一个头部字段用来标识当前报头的下一个头部类型,该字段长度为8比特位。每种扩展报头都有其对应的值。下一个头部字段内定义的扩展报头类型与IPv4中的协议字段值类似,但在IPv6数据报中,紧接着IPv6报头的可能是上层协议头部(当没有扩展报头或者为最后一个扩展报头时才是上层协议头),也可能是IPv6扩展报头。
2-3 跳数限制(Hop Limit):跳数限制于IPv4报文中的TTL字段类似,指定了报文可以有效转发的次数,该字段长度为8比特位。报文每经过一个路由器结点,跳数值就减1,当此字段值减到0时,则直接丢弃该报文。
3+4+5 源地址(Source IP Address):源IP地址字段标识了发送该IPv6报文发送者的IPv6地址,占128位。
6+7+8 目的IP地址(Destination IP Address):目的IP地址字段标识了IPv6报文的接收者的IPv6地址,占128位。
9-N IPv6扩展报头:Pv6扩展报头是跟在IPv6基本报头后面的可选报头。可以有0个,或者多个扩展报头。数据包仅仅需要传送各自数据包所需要的信息,不需要传送用不到的字段。所以可以通过定义新的扩展报头添加到IPv6数据包中来增加新的可选功能。
主要的IPv6扩展报头有一下几类:
逐跳选项头(Hop-by-hop Options Header):传送必须被转发路径中的每一个节点都检验处理的信息。例如,路由器告警和超大包有效载荷选项等。
目的选项头(Destination Options Header):承载特别针对数据包目的地地址的可选信息
路由头(Routing Header):本扩展报头类型值为43,通过列出在到达目的地的路径中数据包所要经过的节点列表来提供源路由选择的功能。
分段头(Fragment Header):本扩展报头类型值为44,用于标识数据报的分段,在IPv4中就有对应的字段。当源节点发送的报文超过传输链路MTU(源节点和目的节点之间传输路径的MTU)时,需要对报文进行分段时使用。
认证头(Authentication Header,AH):本扩展报头类型值为51,该包头由 IPSec 使用用,以提供认证、数据完整性和防重放保护。它还确保基本IPv6 包头中一些字段的保护。该包头在 IPv4 和 IPv6 中是相同的. 通常称之为 IPSec认证包头 (AH)用于IPSec,提供报文验证,完整性检查。
封装安全有效载荷头(Encapsulating Security Payload,ESP):本扩展头类型值为50,用于IPSec,提供报文验证、完整性检查差和加密。
========================================================
TCP数据包结构(20字节):
1-1 源始端口16位:现在知道为啥TCP端口范围是 0-65535了吧。
1-2 目的端口:同上。
2-1 数据序号32位:TCP为发送的每个字节都编一个号码,这里存储当前数据包数据第一个字节的序号。
3-1 确认序号32位:为了安全,TCP告诉接受者希望他下次接到数据包的第一个字节的序号。也同时代表自己确认接收到了这个序号-1字节的数据了。
4-1 首部长度4位:类似IP--->表明数据距包头有多少个32位(有几个四个字节)。20个字节,则为5
4-2 保留6位:未使用,应置零。
4-3 紧急比特URG:当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。
4-4 确认比特ACK:只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。参考TCP三次握手
4-5 PSH:表示要求对方在接到数据后立即请求递交给应用程序,而不是缓冲起来直到缓冲区收满为止。一般为1.
4-6 复位比特RST(Reset) :当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。参考TCP三次握手
4-7 同步比特SYN:同步比特SYN置为1,就表示这是一个连接请求或连接接受报文。参考TCP三次握手
4-8 终止比特FIN(FINal):用来释放一个连接。当FIN=1时,表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
4-9 窗口字段16位:窗口字段用来控制对方发送的数据量,单位为字节。TCP连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。
5-1.包校验和16位,包括首部和数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。校验范围包括TCP头、数据报内容和概念性伪头部。
概念性伪头部又包括源IP,目的IP,TCP协议号。
5-2.紧急指针16位,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号:指向数据报中紧急数据最后一个字节的下一个字节。
6-1.可选选项24位,类似IP,是可选选项。
6-2.填充8位,使选项凑足32位。
7-1.用户数据……
UDP数据包结构(8字节):
======================THE END==================================