IP分组首部格式

IP数据报格式
英文

IPv4首部包含14个字段(fields),13是必需的,最后一个可选。

1、版本(Version)

4 bits,IPv4分组的version值为0100

 2、首部长度(Internet Header Length,IHL)

4 bits,单位是4 bytes。最小值为5,此时首部不包含可选项(options),长度为20 bytes。最大值为15,此时IHL为60 bytes。

3、服务类型(Differentiated Service Code Point,DSCP)

8 bits,指定packet的优先级、延迟、吞吐率、可靠性要求等。

 4、明确的拥塞通告(Explicit Congestion Notification,ECN)

教材上没有提及

5、总长度(Total Length)

16 bits,分组的总长度,包括首部和数据。分组最小值为IHL的最小值20 bytes,最大值为65535bytes。

 6、标识(Identifier)

16 bits,同一IP分组的数据片(fragments)具有相同的标识。

 7、标志(Flags)

3 bits,第0位是保留位(resvered),必需为0. 第1位=1时,表示不分片(Don’t fragment, DF),为0表示可分片。第2为=1时,表示该后续有其他分片(More fragmetns, MF)。
!!!描述“第一位”是用第0位

 8、片偏移(Fragment Offset)

13 bits,以8 bytes为单位给出当前数据片在原IP分组中的位置。最大偏移(2^13 - 1)* 8 bytes = 65528 bytes,加上首部的20 bytes已超出IP分组的最大总长度。

 9、生存时间(Time To Live,TTL)

8 bits,限制IP分组在网络中存在时间的计数器,TTL的单位为秒(second) 。
实际上,TTL作为路由(router)的最大跳数(hop count)使用初始值有发送终端设定。,每到达一个路由,TTL的值减一,值为0时,router丢弃该分组,并向sender发送ICMP时间超时(ICMP Time Exceeded)的消息。

10、协议(Protocol)

8 bits,指示IP分组数据部分使用的协议,可用的协议列表,常见的如TCP(6)、UDP(17)、ICMP(2),括号内为协议号(Protocol Number)。
联想记忆:TCP可靠,很溜(6);UDP会遗弃(17)

11、首部校验和(Header Checksum)

16 bits,仅验证首部。分组到达router后,router计算首部的checksum,和该字段比较,不匹配则丢弃该分组。

12、源地址(Source Address)和目的地址(Destination Address)

在传输过程中,有可能被(Network address translation,NAT)设备改变。

13、可选项(Options)

联想记忆【单位】:1种8片首饰
1-总长度,8-片偏移,4-首部长度

### IP分组首部校验和的计算方法 IP分组首部校验和用于检测IP头部信息传输过程中可能出现的错误。该字段占据16比特,以16比特为单位对整个IP头进行二进制反码求和操作[^2]。 #### 计算过程 当准备发送一个IP数据包时,发送端会将校验和字段设为全0,之后对每一个16比特的数据单元执行无符号加法运算。如果遇到奇数个字节,则最后一个八位会被补充一个额外的零八位以便形成完整的16比特边界。对于IPv4来说,所有这些数值相加以获得初步的结果;如果有溢出发生,则需把最高有效位上的任何溢出重新加入到最低有效位上,这一过程被称为折叠(folding),直至不再存在溢出为止。最后一步是对上述所得结果取反并将其存放在校验和字段内[^3]。 接收设备收到此数据包后也会重复相同的计算流程来验证接收到的信息是否正确无误。若最终得出的校验和等于`0xFFFF`(即全部位均为1),则说明在传输期间未发现差错;反之,则表明可能存在某些形式的数据损坏或篡改情况。 #### 作用 通过这种方式可以有效地识别因物理层干扰或其他因素引起的小范围随机变化所造成的单个或少数几个位翻转现象,从而提高了通信系统的可靠性。然而值得注意的是,这种方法并不能保证绝对的安全性和准确性,因为它无法捕捉到特定模式下的多位同时改变事件以及更复杂的攻击行为。因此,在更高层次协议中通常还会采用更加严格的数据完整性保护机制,比如TCP中的序列号控制与确认应答机制等[^1]。 ```python def calculate_ip_checksum(header): """ Calculate the checksum of an IPv4 header. :param header: A byte string representing the IPv4 header without checksum field set to zero. :return: The calculated checksum as a two-byte integer value. """ sum = 0 # Process every 16 bits (two bytes at once). for i in range(0, len(header), 2): if i + 1 >= len(header): # Handle odd length by padding with one extra '0' bit. sum += ord(header[i]) << 8 else: sum += (ord(header[i]) << 8) + ord(header[i + 1]) # Fold carry into lower order bits. while (sum >> 16) != 0: sum = (sum & 0xFFFF) + (sum >> 16) # Take ones complement and convert it back to network byte order. return ~sum & 0xFFFF ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值