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

分类: Linux内核2013-01-16 10:57 1457人阅读 评论(0) 收藏 举报
 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] view plaincopy
  1. /* This routine computes an IPv4 TCP checksum. */
  2. void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb)
  3. {
  4. struct inet_sock *inet = inet_sk(sk);
  5. struct tcphdr *th = tcp_hdr(skb);
  6. if (skb->ip_summed == CHECKSUM_PARTIAL) {
  7. th->check = ~tcp_v4_check(len, inet->saddr,
  8. inet->daddr, 0);
  9. skb->csum_start = skb_transport_header(skb) - skb->head;
  10. skb->csum_offset = offsetof(struct tcphdr, check);
  11. } else {
  12. th->check = tcp_v4_check(len, inet->saddr, inet->daddr,
  13. csum_partial(th,
  14. th->doff << 2,
  15. skb->csum));
  16. }
  17. }
在这个函数中可以看到第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] view plaincopy
  1. /*
  2. * Only clear those fields we need to clear, not those that we will
  3. * actually initialise below. Hence, don't put any more fields after
  4. * the tail pointer in struct
  5. */
  6. memset(skb, 0, offsetof(struct sk_buff, tail));
  7. skb->truesize = size + sizeof(struct sk_buff);
  8. 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] view plaincopy
  1. /*
  2. * Check whether we can use HW checksum.
  3. */
  4. if (sk->sk_route_caps & NETIF_F_ALL_CSUM)
  5. skb->ip_summed = CHECKSUM_PARTIAL;
也就是说如果目的路由网络设备的特性支持NETIF_F_ALL_CSUM时,才将ip_summed设置为CHECKSUM_PARTIAL。
当然这里的讨论只限于TCP协议发送SKB包,到计算校验和的过程中ip_summed成员的变化和值。

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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

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

  2. TCP协议发送SKB时ip_summed初始值为0

    转摘至http://www.2cto.com/kf/201301/183563.html?fw_key=B782188880BAA902 tcp_send_ack()函数是内核用来发送ACK的函数,该 ...

  3. 数据采集之解析Mysql的binlog日志发送至Kafka实时消费(转:https://blog.csdn.net/liguohuabigdata/article/details/79472777)

    本文采用Maxwell来实现实时解析mysql的binlog日志发送至kafka 1.开启mysql binlog 环境中mysql是docker容器,所以需要进入容器修改mysql配置.docker ...

  4. Java Socket编程 - 基于TCP方式的二进制文件传输【转】http://blog.csdn.net/jia20003/article/details/8248221...

    此人博客挺好的,推荐一个! 一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成. 除了基于TCP的二进制文件传输,还演示了JAVA Swing的一些编程技巧,Demo程序 实 ...

  5. 转:浅谈Radius协议 -来自CSDN:http://blog.csdn.net/wangpengqi/article/details/17097221

    浅谈Radius协议 2013-12-03 16:06 5791人阅读 评论(0) 收藏 举报  分类: Radius协议分析(6)  从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下, ...

  6. GTP(GPRS Tunnelling Protocol)协议http://blog.csdn.net/stephen_yin/article/details/6951237

    GTP(GPRS Tunnelling Protocol)协议 标签: extensionheaderinternet网络wapxhtml 2011-11-09 10:15  6097人阅读  评论( ...

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

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

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

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

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

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

最新文章

  1. 不同浏览器Cookie有效期问题
  2. [Leetcode] Combinations 组合数
  3. 业界丨OpenAI 发布通用人工智能研究纲领:以全人类的名义承诺
  4. 提取指定的PDF表格保存到Excel
  5. 实现 JavaScript 异步方法 Promise.all
  6. python的科学计算库有哪些_《用Python进行科学计算》——SciPy数值计算库
  7. sudo chown r mysql_Linux 文件基本属性: chown修改所属组 和 chmod修改文件属性命令
  8. php文件开头加数据,在PHP中附加到文件的开头
  9. Latex安装与使用
  10. python三方库是什么_python第三方库有哪几种
  11. 【信道估计】LS/MMSE信道估计,CS信道估计的MATLAB仿真
  12. DxO FilmPack 5 for Mac(胶片模拟效果滤镜软件)
  13. shuipFCMS的开发记录
  14. python zip(*zipped)的疑问
  15. 2023,本命年向阳而生
  16. android开发利用传感器实现微信的摇一摇功能
  17. C语言中的fprintf函数
  18. 华为解锁密码忘了怎么办用计算机,不记得手机锁屏密码怎么办_华为手机密码忘了的解决方法-系统城...
  19. C语言程序设计:单词本整体框架实现
  20. VGG16预训练学习笔记

热门文章

  1. Android Facebook登录,进来看就对了
  2. 给textView设置文字渐变色
  3. 输入手机号获取验证码的注册页面,说出测试过程
  4. Canvas炫酷3D线条动画背景
  5. CodeForces - 25A IQ test【水题】
  6. Beyond Compare4
  7. Python3《机器学习实战》学习笔记(三):朴素贝叶斯基础篇之言论过滤器
  8. 神一样的编程语言? -- 发现一个编程语言“shen”
  9. Unity动画☀️7. 通过MatchTarget匹配跳墙动画、Vector3、获取动画层GetCurrentAnimatorStateInfo(a).IsName(b)
  10. python元组(戴了紧箍咒的列表)