免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lmarsin
打印 上一主题 下一主题

基于2.6.20版本的《Linux内核源码剖析--TCP/IP实现》【465楼为勘误列表】 [复制链接]

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
11 [报告]
发表于 2010-02-25 13:39 |只看该作者
多谢LZ。已经下载看了开头的一些。前两天正好和一个朋友讨论到这个问题,因此有个疑问请教LZ:


LZ提到 ...
Godbach 发表于 2010-02-25 13:05



    图片好像看不到了啊?

论坛徽章:
0
12 [报告]
发表于 2010-02-25 13:50 |只看该作者
每输出一个SKB时,都会调用update_send_head()来更新sk_send_head,当sk_send_head==&sk_write_queue时,说明已经全部输出,因此要将sk_write_queue设置为NULL。
static void update_send_head(struct sock *sk, struct tcp_sock *tp,
                             struct sk_buff *skb)
{
        sk->sk_send_head = skb->next;
        if (sk->sk_send_head == (struct sk_buff *)&sk->sk_write_queue)
                sk->sk_send_head = NULL;

        tp->snd_nxt = TCP_SKB_CB(skb)->end_seq;
        tcp_packets_out_inc(sk, tp, skb);
}

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
13 [报告]
发表于 2010-02-25 13:52 |只看该作者
明白。你的说法和我的并不矛盾。怎么判断发送队列已经没有需要发送的报文了呢,就是用的那个条件判断,为真之后将sk_send_head置为NULL。

论坛徽章:
0
14 [报告]
发表于 2010-02-25 13:56 |只看该作者
本帖最后由 lmarsin 于 2010-02-25 14:29 编辑
多谢LZ。已经下载看了开头的一些。前两天正好和一个朋友讨论到这个问题,因此有个疑问请教LZ:


LZ提到 ...
Godbach 发表于 2010-02-25 13:05



顺便提下,此书讨论的内核版本为2.6.20。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
15 [报告]
发表于 2010-02-25 13:58 |只看该作者
还有一个问题需要请教 LZ:
sk_send_head在什么条件下指向write_queue的第1个skb

论坛徽章:
0
16 [报告]
发表于 2010-02-25 14:12 |只看该作者
回复 17# Godbach


    当待输出的SKB添加到输出队列上时,如果此时sk_send_head为NULL,则进行设置。参见skb_entail()

static inline void skb_entail(struct sock *sk, struct tcp_sock *tp,
                              struct sk_buff *skb)
{
        struct tcp_skb_cb *tcb = TCP_SKB_CB(skb);

        skb->csum    = 0;
        tcb->seq     = tcb->end_seq = tp->write_seq;
        tcb->flags   = TCPCB_FLAG_ACK;
        tcb->sacked  = 0;
        skb_header_release(skb);
        __skb_queue_tail(&sk->sk_write_queue, skb);
        sk_charge_skb(sk, skb);
        if (!sk->sk_send_head)
                sk->sk_send_head = skb;
        if (tp->nonagle & TCP_NAGLE_PUSH)
                tp->nonagle &= ~TCP_NAGLE_PUSH;
}

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
17 [报告]
发表于 2010-02-25 14:25 |只看该作者
顺便提下,此书讨论的内核版本为2.60.20。
lmarsin 发表于 2010-02-25 13:56


2.6.20吗?

论坛徽章:
0
18 [报告]
发表于 2010-02-25 14:29 |只看该作者
没错,是2.6.20,刚才敲错了

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
19 [报告]
发表于 2010-02-25 14:29 |只看该作者
回复 18# lmarsin

多谢。

write_queue上的所有skb都是等待发送到IP层的skb吧。

以后每次应用层来了报文,都添加到write_queue的尾部,sk_send_head第一次从其头部往后遍历并发送当前的skb,随后记录skb->next,就是下次发送的head。除非head等于wirte_queue了,否则继续发送报文。应该是这样的过程吧。

论坛徽章:
0
20 [报告]
发表于 2010-02-25 14:31 |只看该作者
回复  lmarsin

多谢。

write_queue上的所有skb都是等待发送到IP层的skb吧。

以后每次应用层来了报 ...
Godbach 发表于 2010-02-25 14:29



    write_queue上,sk_send_head之前的是待确认或可能重传的段,sk_send_head之后是待输出的段。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP