转摘至http://www.2cto.com/kf/201301/183563.html?fw_key=B782188880BAA902

tcp_send_ack()函数是内核用来发送ACK的函数,该函数比较简单,就是先分配一个SKB包,然后简单的初始化(初始化操作中没有设置ip_summed)后,调用tcp_transmit_skb()来将SKB包传递到IP层。tcp_transmit_skb中先做一些操作后(仔细看过,到计算校验和之前,没有更改过ip_summed),会调用tcp_v4_send_check(语句是:icsk->icsk_af_ops->send_check(sk, skb->len, skb);)来计算校验和。

tcp_v4_send_check代码如下:
[cpp]  
/* This routine computes an IPv4 TCP checksum. */  
void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb)  
{  
struct inet_sock *inet = inet_sk(sk);  
struct tcphdr *th = tcp_hdr(skb);  
if (skb->ip_summed == CHECKSUM_PARTIAL) {  
th->check = ~tcp_v4_check(len, inet->saddr,  
inet->daddr, 0);  
skb->csum_start = skb_transport_header(skb) - skb->head;  
skb->csum_offset = offsetof(struct tcphdr, check);  
} else {  
th->check = tcp_v4_check(len, inet->saddr, inet->daddr,  
csum_partial(th,  
th->doff << 2,  
skb->csum));  
}  
}  
在这个函数中可以看到第7行中已经开始使用skb->ip_summed来做比较,那也就是说skb->ip_summed肯定在之前已经初始化过,反反复复地仔细阅读tcp_send_ack和tcp_transmit_skb函数都没有发现初始化的地方,真的是很奇怪。因为之前我看过alloc_skb的实现,而且又看了一次,没看到在哪个地方“明显地”初始化了ip_summed成员。
只能全文搜索ip_summed的所有设置的地方,看了半天还是没有找到在tcp_send_ack到tcp_transmit_skb之间的地方有初始化ip_summed的操作,最后还是把目光锁定在alloc_skb函数上。看了几遍之后突然看到一句不起眼的代码:
[cpp]  
/* 
* Only clear those fields we need to clear, not those that we will 
* actually initialise below. Hence, don't put any more fields after 
* the tail pointer in struct  
*/  
    memset(skb, 0, offsetof(struct sk_buff, tail));  
skb->truesize = size + sizeof(struct sk_buff);  
atomic_set(&skb->users, 1);  
看到第6行代码,才恍然大悟,
原来是在这个地方把skb从head成员到tail的所有成员都初始化为0,当前ip_summed也在这个范围内,也就是说ip_summed的值为0,对应的就是CHECKSUM_NONE。
哎,只怪自己粗心大意,看的不够仔细!
tcp_v4_send_check中第7行if (skb->ip_summed == CHECKSUM_PARTIAL),判断ip_summed是否等于CHECKSUM_PARTIAL,那在什么是否会将ip_summed置为CHECKSUM_PARTIAL呢?这个答案要在tcp_sendmsg中找,代码片段如下:
[cpp]  
/* 
* Check whether we can use HW checksum. 
*/  
if (sk->sk_route_caps & NETIF_F_ALL_CSUM)  
skb->ip_summed = CHECKSUM_PARTIAL;  
也就是说如果目的路由网络设备的特性支持NETIF_F_ALL_CSUM时,才将ip_summed设置为CHECKSUM_PARTIAL。
当然这里的讨论只限于TCP协议发送SKB包,到计算校验和的过程中ip_summed成员的变化和值。

TCP协议发送SKB时ip_summed初始值为0相关推荐

  1. TCP协议发送SKB时ip_summed成员的设置 http://blog.csdn.net/justlinux2010/article/details/8508455

    TCP协议发送SKB时ip_summed成员的设置 分类: Linux内核2013-01-16 10:57 1457人阅读 评论(0) 收藏 举报  tcp_send_ack()函数是内核用来发送AC ...

  2. TCP协议发送SKB时ip_summed成员的设置

     tcp_send_ack()函数是内核用来发送ACK的函数,该函数比较简单,就是先分配一个SKB包,然后简单的初始化(初始化操作中没有设置ip_summed)后,调用tcp_transmit_skb ...

  3. TCP协议发送和接收数据

    TCP协议发送与接收数据 一.发送数据 1.使用Socket类的构造方法创建Socket对象 Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指 ...

  4. 多线程下的生产者消费者(一个初始值为0的变量,两个线程一个加1一个减1,轮询5轮)

    在使用Lock之前,我们使用的最多的同步方式应该是synchronized关键字来实现同步方式了.配合Object的wait().notify()系列方法可以实现等待/通知模式.Condition接口 ...

  5. Java中通过TCP协议发送和接收数据-Socket编程

    TCP TCP协议是面向连接.保证高可靠性(数据无丢失.数据无失序.数据无错误.数据无重复到达)传输层协议. TCP通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端 ...

  6. 累加 map java_Java Map key 不存在时设置初始值,存在时累加计算值的设计方案

    在 java 中使用 Map 时,针对 key 进行数值的累计运算,需要指定键不存在时,设置初始值,特定 key 存在时,对已有键值进行累加. 参考方案 java 8 中,Map 中增加了 getOr ...

  7. 免费的TCP测试工具,自己写的,运行jar包就能用,定时通过TCP协议发送自定义XML

    最近做项目想要模拟发送TCP数据,但是网上各种工具都不好用,所以自己写了一个: 具体功能:能够自定义XML格式,自定义对方的Tcp端口,自定义定时发送的间隔,直接在安装有java环境变量的电脑中使用C ...

  8. 按键自加自减的c语言数码管编程,设计一个单片机输入显示系统,要求每按一下按键数码管显示数据加1(数码管初始值为0,9加1 后显示0)。...

    程序清单如下: #include < reg51.h >// 51单片机头文件 #define uchar unsigned char// 宏定义,用uchar替代无符号字符型 #defi ...

  9. 【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?

    [转]使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? Posted on 2008-06-11 15:24 路缘 阅读(3868) 评论(0) 编辑 收藏  http://www.cnbl ...

最新文章

  1. C++_volatile限定修饰符 Pair类型
  2. c大小写转换函数_Excel中的大小写金额转换,技巧法和函数法,职场必学技巧
  3. PIC最简约的PWM波形产生程序(PIC16F877A)
  4. 一名新晋程序员的自述:我的编程自学之路
  5. Python测试开发django5.urls.py参数name与a标签的引用
  6. Python+matplotlib绘制三维图形5个精选案例
  7. thinkphp5---join联合查询
  8. linux 定时关机命令,linux 定时关机命令
  9. MAC终端命令颜色设置
  10. Android播放器框架分析之AwesomePlayer
  11. 初学者安装mysql5.7_CentOS7入门_安装并配置mysql5.7.18
  12. 笔记本电脑使用的11个酷炫技巧
  13. Clojure 语言在 2020 年的现状
  14. 游戏服务器为什么选用Actor模型,《百万在线》给你答案
  15. 基于数据库和ASP的网上教学资源管理系统的开发
  16. H.266/VVC代码学习32:VTM5.0解码端最上层函数
  17. 在eclipse上配置tomcat,安装eclipse的JST Server Adapters Extensions时报错 Anerroroccurredwhilecollectingitems...
  18. Android 更换用户头像(拍照、相册选取)
  19. kafka系列之kafka生产者与分区(3)
  20. (paypal,stripe)轮询收款系统

热门文章

  1. Python数据分析_第06课:数据清洗与初步分析_笔记
  2. 夕阳红旅游团第三周报告
  3. 中创算力|分布式维基百科新语言版本服务上线,IPFS助力Web3.0!
  4. 在mac上进行运行flutter项目
  5. EC-PCA: 利润中心会计流程设计和方案要点
  6. 使用scrapy爬取qq音乐
  7. IDEA坑: log.info爆红和Mapper没有跳转箭头(插件安装)
  8. java实现超级玛丽游戏
  9. Boost:标记的简单双图bimap的测试程序
  10. 云ERP有什么优势?功能有哪些?