从收包和发包来看IP层的csum是如何计算的,是如何进行校验的。csum值为2个字节长度。
发包流程如下所示,在__ip_local_out_sk函数中调用ip_send_check函数进行csum计算。
ip_local_out->ip_local_out_sk->__ip_local_out->__ip_local_out_sk
ip_send_check函数
/* Generate a checksum for an outgoing IP datagram. */
void ip_send_check(struct iphdr *iph)
{
iph->check = 0; //设置check为0
iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); //把计算csum的值保存到check字段
}ip_fast_csum函数 (ip_fast_csum的实现版本较多,选择其中一个利于理解的进行分析)
/*
* This is a version of ip_compute_csum() optimized for IP headers,
* which always checksum on 4 octet boundaries.
*/
__sum16 ip_fast_csum(const void *iph, unsigned int ihl)
{
return (__force __sum16)~do_csum(iph, ihl*4);
}do_csum函数
static unsigned int do_csum(const unsigned char *buff, int len)
{
int odd;
unsigned int result = 0;

本文探讨了Linux内核4.1.12中IP层的校验和计算过程,主要涉及发包和收包时的csum计算。在发包流程中,通过__ip_local_out_sk函数调用ip_send_check进行校验。收包时,利用ip_fast_csum函数,结合do_sum函数的性质,确保数据未改动时,校验和结果为0。该机制保证了在网络传输中一定程度的数据完整性。
最低0.47元/天 解锁文章
3067

被折叠的 条评论
为什么被折叠?



