作家
登录

Linux网络 - 数据包的发送过程

作者: 来源: 2017-04-07 11:02:06 阅读 我要评论

----------------+              +------------------------+ 
  •                 | ndo_start_xmit |              | packet taps(AF_PACKET) | 
  •                 +----------------+              +------------------------+  
    • dev_queue_xmit: netdevice子体系的人口函数,在该函数中,会先获取设备对应的qdisc,如不雅没有的话(如loopback或者IP tunnels),就直接调用dev_hard_start_xmit,不然数据包将经由Traffic Control模块进行处理
    • Traffic Control: 这里主如果进行一些过滤和优先级处理,在这里,如不雅队列满了的话,数据包会被损掉落,详情请参考文档,这步完成后也会走到dev_hard_start_xmit
    • dev_hard_start_xmit: 该函数中,起首是拷贝一份skb给“packet taps”,tcpdump就是大年夜这里获得数据的,然后调用ndo_start_xmit。如不雅dev_hard_start_xmit返回缺点的话(大年夜部分情况可能是NETDEV_TX_BUSY),调用它的函数会把skb放到一个处所,然后抛出软中断NET_TX_SOFTIRQ,交给软中断处理法度榜样net_tx_action稍后重试(如不雅是loopback或者IP tunnels的话,掉败后不会有重试的逻辑)
    • ndo_start_xmit: 这是一个函数指针,会指向具体驱动发送数据的函数

    Device Driver

    ndo_start_xmit会绑定到具体网卡驱动的响应函数,到这步之后,就归网卡驱动管了,不合的网卡驱动有不合的处理方法,这里不做具体介绍,其大年夜概流程如下:

    1. 将skb放入网卡本身的发送队列
    2. 通知网卡发送数据包
    3. 网卡发送完成后发送中断给CPU
    4. 收到中断落后行skb的清理工作

    其它

    • SO_SNDBUF: 大年夜膳绫擎的流程中可以看出来,对于UDP来说,没有一个对应send buffer存在,SO_SNDBUF只是一个限制,当这个socket分派的skb占用的内存跨越这个值的时刻,会返回ENOBUFS,所以说只要不出现ENOBUFS缺点,把这个值调大年夜没有意义。大年夜sendto函数的赞助文件琅绫擎看到如许一句话:(Normally, this does not occur in Linux. Packets are just silently dropped when a device queue overflows.)。这里的device queue应当指的是Traffic Control琅绫擎的queue,解释在linux琅绫擎,默认的SO_SNDBUF值已经够queue用了,疑问的处所是,queue的长度和个数是可以设备的,如不雅设备太大年夜的话,按事理应当有可能会出现ENOBUFS的情况。
    • txqueuelen: 很多处所都嗣魅这个是控制qdisc里queue的长度的,但貌似只是部分类型的qdisc用了该设备,如linux默认的pfifo_fast。
    • hardware RX: 一般网卡都有一个本身的ring queue,这个queue的大年夜小可以经由过程ethtool来设备,当驱动收到发送请求时,一般是放到这个queue琅绫擎,然后通知网卡发送数据,当这个queue满的时刻,会给上层调用返回NETDEV_TX_BUSY
    • packet taps(AF_PACKET): 当第一次发送数据包和重试发送数据包时,都邑经由这里,如不雅产生重试的情况的话,不肯定tcpdump是否会抓到两次包,按事理应当不会,可能是我哪琅绫腔看懂

    参考

    • Monitoring and Tuning the Linux Networking Stack: Sending Data
    • queueing in the linux network stack 

    在网卡驱动发送数据包过程中,会有一些处所须要和netdevice子体系打交道,比如网卡的队列满了,须要告诉上层不要再发了,等队列有余暇的时刻,再通知上层接着发数据。

    【编辑推荐】

    1. 在Linux上用火狐浏览器保护你的隐私
    2. Linux办事器安然设备实例(一)引言
    3. Linux办事器安然设备实例(二)用户账户权限设备
    4. 开源Cillium项目为容器供给强大年夜的收集功能
    5. Linux办事器下LNMP安装与设备办法
    【义务编辑:枯木 TEL:(010)68476606】

      推荐阅读

      Ubuntu 16.04 下如何在Vim中进行文本选择操作和使用标志

    基于图形界面的文本或源代码编辑器,供给了一些诸如文本选择的功能。我是想说,可能大年夜多半人不认为这是一个功能。不过像 Vim 这种基于敕令行的编辑器就不是如许。当你仅应用键盘操作>>>详细阅读


    本文标题:Linux网络 - 数据包的发送过程

    地址:http://www.17bianji.com/lsqh/34631.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)