• 渡渡鸟_linux
    2019-03-07
    我结合网络上查阅的资料和文章中的内容,总结了下网卡收发报文的过程,不知道是否正确:
    1. 内核分配一个主内存地址段(DMA缓冲区),网卡设备可以在DMA缓冲区中读写数据
    2. 当来了一个网络包,网卡将网络包写入DMA缓冲区,写完后通知CPU产生硬中断
    3. 硬中断处理程序锁定当前DMA缓冲区,然后将网络包拷贝到另一块内存区,清空并解锁当前DMA缓冲区,然后通知软中断去处理网络包。
    -----
    当发送数据包时,与上述相反。链路层将数据包封装完毕后,放入网卡的DMA缓冲区,并调用系统硬中断,通知网卡从缓冲区读取并发送数据。
    展开

    作者回复: 对的

     1
     28
  • 安排
    2019-02-26
    当一个网络帧到达网卡后,网卡会通过 DMA 方式,把这个网络包放到收包队列中;然后通过硬中断,告诉中断处理程序已经收到了网络包。

    接着,网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;然后再通过软中断,通知内核收到了新的网络帧。

    接下来,内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧。



    老师你好,上面的一段话有些疑问想请教一下。

    收包队列是属于哪里的存储空间,是属于物理内存吗,还是网卡中的存储空间,通过dma方式把数据放到收包队列,我猜这个收包队列是物理内存中的空间。这个收包队列是由内核管理的吧,也就是跟某一个进程的用户空间地址没关系?

    那sk_buf缓冲区又是哪里的存储空间,为什么还要把收包队列拷贝到这个缓冲区呢,这个缓冲区是协议栈维护的吗?也属于内核,跟进程的用户空间地址有关系吗?


    socket的接收发送缓冲区是映射到进程的用户空间地址的吗?还是由协议栈为每个socket在内核中维护的缓冲区?

    还有上面说到的这些缓冲区跟cache和buf有什么关系?会被回收吗?


    内核协议栈的运行是通过一个内核线程的方式来运行的吗?是否可以看到这个线程的名字?
    展开

    作者回复: 问题比较多,放到答疑篇里面统一回复吧

    
     13
  • Dale
    2019-02-12
    网络报文传需要在用户态和内核态来回切换,导致性能下降。业界使用零拷贝或intel的dpdk来提高性能。
     1
     9
  • Geek_00d753
    2019-03-22
    收数据的时候,从网卡到应用层socket。需要一次硬中断+一次软中断。
    发数据的时候只需要一次软中断。
    是这样吗?老师
     1
     2
  • 饼子
    2019-02-20
    遇到了程序分配大量链接,占用完程序最大打开文件数量,使用lsof 查看分析的

    作者回复: 嗯嗯,文件数量或者连接数量都可以看到

    
     2
  • ninuxer
    2019-02-13
    打卡day35
    有一次业务反馈有些请求无法正常响应,后来花了两天时间才发现ifconfig看网卡的drop的包不断增长,后来发现是跟开启了内核的timestamp参数有关
    
     2
  • 空空
    2019-02-08
    老师过年好!
    曾经在Linux3.10测试netlink收发包效率,发现一个问题,正常情况下每收一个包大概需要10us,但是每隔8秒会出现一次收包时间30-50ms,就是因为固定间隔8秒会出现一次收包时间过长,导致收包效率降低。请教一下老师每隔8秒系统会做什么?或者是因为什么系统配置?希望老师解答一下疑惑,谢谢!

    作者回复: 这个不好说,后面有讲到延迟增大的分析思路,到时候可以分析看看

     1
     2
  • 威
    2019-02-06
    老师您好,请问最后一张图下方的两个大圈圈代表的是什么意思,是代表loop吗

    作者回复: ring buffer

    
     2
  • Geek_25565b
    2019-08-02
    老师好,netstat 执行一次 Recv-Q 和Send-Q 有值就说明堆积吗?还是用watch 看变化情况确定堆积?
    
     1
  • 空白
    2019-07-14
    一直不太理解,网络包是如何具体交付给对应的线程的?

    作者回复: 系统调用

    
     1
  • 学而不思则罔
    2019-04-10
    老师好,一直不太明白skb_buff和sk_buff的区别,这两者有关系吗

    作者回复: sk_buff一般是说内核数据接口,而 skb则是套接字缓存(socket buffer)

    
     1
  • 胡鹏
    2019-03-20
    我所知道的网络问题,就是服务器被ddos攻击,小规模,可以防,,,大规模防不了

    作者回复: 是的,大规模必须要专业的网络设备来抗

    
     1
  • 张挺
    2019-03-20
    您好,请问,数据从网卡到应用程序或者应用程序到网卡,都会同时触发硬中断和软中断吗?
    
     1
  • 玉剑冰锋
    2019-02-15
    您好老师,IP包分片,一个IP包分成多个分片,是如何保证接收方收一个完整的数据包的?

    作者回复: 根据 MTU 分片,分片里面会包含分片信息,所以接收后还可以组合起来。

    
     1
  • 夜空中最亮的星(华仔...
    2019-02-14
    新年好,给老师拜个晚年,过年的课都落下了,抓紧时间赶上来。

    作者回复: 谢谢,新春快乐!

    
     1
  • 佳
    2019-02-13
    使用InfiniBand网卡和InfiniBand交换机的时候, mtu如果配置65520的时候,通过http下载对象存储小文件比较慢,但是配置9000的时候大小文件都比较快。https://github.com/antirez/redis/issues/2385 Redis works very slow with MTU higher than packet size. 请问老师是什么原因

    作者回复: MTU大小的问题都是分片和重组导致的。后面有案例讲到分析内核中网络协议栈的行为,你可以到时候试着分析下这种场景

    
     1
  • 陈云卿
    2019-02-06
    系统出口带宽被打满,导致大量请求超时

    作者回复: DDoS 😊

    
     1
  • Penn
    2019-02-06
    中断不均,连接跟踪打满

    作者回复: 嗯 这是最常见的两个问题

    
     1
  • allan
    2019-12-14
    请教下老师,为什么内核协议栈接收网络包的时候,在每一层都要找出上层协议呢???比如在网络层取出上层协议的类型是TCP/UDP,直接把本层的头部去掉,交上层处理不就可以了嘛
    
    
  • sTone
    2019-06-08
    根据tcp网络模型的封装方式, 网络接口层mac地址, 但是internet是ip寻址, 难道每次接到网络包都要拆分到网络层找到对应的ip地址, 然后再决定下一步? 是不是先mac寻址再op寻址?
    
    
我们在线,来聊聊吧