IP数据包结构图
(引用千锋教育)
IP包头长度可变,20-60字节。
1、版本: 告诉大家使用的是ipv4还是ipv6? (这四位是0100或0110)
2、首部长度:告诉接收端IP包头长度,别多收少收。
(注意:数据帧前14字节是二层帧头,故从14往后根据首部长度就可以直到三层IP包头的长度)
3、优先级与服务类型(QOS与TOS): 前3bit是优先级,服务类型是4bit,最后留一个bit不用,扩展开发使用。 比如公司分公司之间跨城市连接专线,给专业运营商交点钱,让网速快很多。
4、总长度: 数据帧由2层帧头,3层ip包头,四层tcp/udp包头,五层数据,2层帧尾组成
首部长度指的是3层ip包头的长度,而总长度是3,4,5层加起来。
5、分片:
举个例子,这个是数据帧中三四五层内容,比如五层待发数据为4000字节,其他两个为20字节,
假如每个ip数据包最多容纳1500个字节,那上面这个情况肯定要分片,如何分呢?下面解释。
直观来看,1500是上限,那4000字节肯定要分3份。
把20字节的IP包头拿出来复制3份,把TCP/IP包头和data放一起,变成了4020字节。(下图)
注意,TCP/UDP层为什么不拿出复制,因为主要起导航作用的是3层IP包头,故TCP/UDP安全到终点即可。
接下来开始组合,如下图
这样就组合完成了!
注意,只是单纯从字节角度分析分片,后面还会提到标志位和偏移量。
6、段偏移量和标识位
还是刚刚的图,我加上偏移量
7、标志位(3位): 第一位没有启用,统一是0,第二位0表示分片了,1表示未分片,
第三位为1表示还有后续分片,自己不是最后一个。
8、TTL(time to live): 也是转为10进制来算,100以上基本是windows主机,以下是linux
发送数据,每经过一个路由器TTL就减一,如果为0时,那就销毁该数据帧。
目的是防止无用数据包在网络上当垃圾。如果接收方无法接收数据或者出错,导致发送方找不到,那不能让该数据帧永远游荡在网络上,故TTL归零时就销毁。
9、协议号:如果是6往TCP走,17往UDP走,1是往同层ICMP协议走
看下图,数据从下到上所经过的协议:
该图表示下层为上层服务的简单结构图,数据链路层中MAC子层协议包含了IP和ARP两种类型,在
MAC帧中的(类型)一栏通过类型号来进行选择。(0x0800走IP协议,0x0806走ARP协议)
网络层中IP协议中也包含了去往TCP和UDP的途径,协议号6走TCP,17走UDP,1走ICMP。
10、首部校验和: 和帧尾FCS类似,FCS用于校验整个帧,而这里主要校验IP数据包的(20-60字节)
11、源地址和目的地址: 32位大小,比如10.1.1.1 ,每个10进制数字转换8个二进制位,共32位
补充:MAC地址48位,IP地址32位。即6字节和4字节