前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >linux 网络套接字

linux 网络套接字

作者头像
233333
发布于 2019-05-25 10:10:16
发布于 2019-05-25 10:10:16
2.8K00
代码可运行
举报
运行总次数:0
代码可运行

在内核分析网络分组时,底层协议的数据将传输到跟高的层。而发送数据的时候顺序是相反的。每一层都是通过加(首部+净荷)传向跟底层,直至最终发送。

这些操作决定了网络的的性能。

就如下图所示

linux因此设计了一个结构体

如下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/** 
 *  struct sk_buff - socket buffer
 *  @next: Next buffer in list
 *  @prev: Previous buffer in list
 *  @list: List we are on
 *  @sk: Socket we are owned by
 *  @stamp: Time we arrived
 *  @dev: Device we arrived on/are leaving by
 *      @real_dev: The real device we are using
 *  @h: Transport layer header
 *  @nh: Network layer header
 *  @mac: Link layer header
 *  @dst: FIXME: Describe this field
 *  @cb: Control buffer. Free for use by every layer. Put private vars here
 *  @len: Length of actual data
 *  @data_len: Data length
 *  @csum: Checksum
 *  @__unused: Dead field, may be reused
 *  @cloned: Head may be cloned (check refcnt to be sure)
 *  @pkt_type: Packet class
 *  @ip_summed: Driver fed us an IP checksum
 *  @priority: Packet queueing priority
 *  @users: User count - see {datagram,tcp}.c
 *  @protocol: Packet protocol from driver
 *  @security: Security level of packet
 *  @truesize: Buffer size 
 *  @head: Head of buffer
 *  @data: Data head pointer
 *  @tail: Tail pointer
 *  @end: End pointer
 *  @destructor: Destruct function
 *  @nfmark: Can be used for communication between hooks
 *  @nfcache: Cache info
 *  @nfct: Associated connection, if any
 *  @nf_debug: Netfilter debugging
 *  @nf_bridge: Saved data about a bridged frame - see br_netfilter.c
 *      @private: Data which is private to the HIPPI implementation
 *  @tc_index: Traffic control index
 */
 
struct sk_buff {
    /* These two members must be first. */
    struct sk_buff      *next;
    struct sk_buff      *prev;
 
    struct sk_buff_head *list;
    struct sock     *sk;
    struct timeval      stamp;
    struct net_device   *dev;
    struct net_device   *real_dev;
 
    union {
        struct tcphdr   *th;
        struct udphdr   *uh;
        struct icmphdr  *icmph;
        struct igmphdr  *igmph;
        struct iphdr    *ipiph;
        unsigned char   *raw;
    } h;
 
    union {
        struct iphdr    *iph;
        struct ipv6hdr  *ipv6h;
        struct arphdr   *arph;
        unsigned char   *raw;
    } nh;
 
    union {
        struct ethhdr   *ethernet;
        unsigned char   *raw;
    } mac;
 
    struct  dst_entry   *dst;
    struct  sec_path    *sp;
 
    /*
     * This is the control buffer. It is free to use for every
     * layer. Please put your private variables there. If you
     * want to keep them across layers you have to do a skb_clone()
     * first. This is owned by whoever has the skb queued ATM.
     */
    char            cb[48];
 
    unsigned int        len,
                data_len,
                csum;
    unsigned char       local_df,
                cloned,
                pkt_type,
                ip_summed;
    __u32           priority;
    unsigned short      protocol,
                security;
 
    void            (*destructor)(struct sk_buff *skb);
#ifdef CONFIG_NETFILTER
        unsigned long       nfmark;
    __u32           nfcache;
    struct nf_ct_info   *nfct;
#ifdef CONFIG_NETFILTER_DEBUG
        unsigned int        nf_debug;
#endif
#ifdef CONFIG_BRIDGE_NETFILTER
    struct nf_bridge_info   *nf_bridge;
#endif
#endif /* CONFIG_NETFILTER */
#if defined(CONFIG_HIPPI)
    union {
        __u32       ifield;
    } private;
#endif
#ifdef CONFIG_NET_SCHED
       __u32            tc_index;               /* traffic control index */
#endif
 
    /* These elements must be at the end, see alloc_skb() for details.  */
    unsigned int        truesize;
    atomic_t        users;
    unsigned char       *head,
                *data,
                *tail,
                *end;
};

套接字换从区在各个层交换数据,就不用复制数据了。

从以上字段和注释可以看到,head和end字段指向了buf的起始位置和终止位置。然后使用header指针指像各种协议填值。然后data就是实际数据。tail记录了数据的偏移值。

相信大家都能看懂注释,具体的解释就不用介绍了.,

在一个新的分组产生的时候,TCP层首先在用户空间中分配内存来容纳该分组数据。分配的空间大于数据的实际需要长度。因此较低的层可以增加首部,在往下一层走的时候,只需要对字段添值即可。

对接收分组的一样,分组数据复制到内核分配的一个内存区中。并在分析的过程中一直处于内存区中。

skbuf还提供了一个双向链表对这个数据分组进行了管理。

如下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct sk_buff_head {
    /* These two members must be first. */
    struct sk_buff  *next;
    struct sk_buff  *prev;
 
    __u32       qlen;
    spinlock_t  lock;
};

__u32 qlen; 缓冲区中等待队列的长度。就是分组的成员数量。

lock 表示了cpu的互斥。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-02-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
万字图解 | 深入揭秘Linux 接收网络数据包
通过前面的文章我们已经了解了「数据包从HTTP层->TCP层->IP层->网卡->互联网->目的地服务器」这中间涉及的知识。
公众号 云舒编程
2024/01/25
1.3K0
万字图解 | 深入揭秘Linux 接收网络数据包
研发:Print TCP Packet Data
Below is an example which does exactly what you need: hook received TCP packets and print their payloads. If you want to print some other information from received packet (like binary data), you just need to modify a bit the section under this comment:
heidsoft
2018/10/18
1.8K0
kubernetes "雪崩"了: 从k8s到linux内核
kubernetes作为云原生不可或缺的重要组件,在编排调度系统中一统天下,成为事实上的标准,如果kubernetes出现问题,那将是灾难性的。而我们在容器化推进的过程中,就遇到了很多有意思的故障,今天我们就来分析一个“雪崩”的案例。
用户6879030
2024/06/05
2210
平衡二叉树与红黑树的区别_平衡二叉树怎么构造
   红黑树是一颗二叉搜索树,通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因而是近似于平衡的。   树的每个结点包含5个属性,color,key,left,right,p。如果一个结点没有子结点或父结点,则该结点的响应指针属性的指为NIL。我们可以把这些NIL视为指向二叉搜索树的叶结点(外部节点)的指针,把带关键字的结点视为树的内部结点。     一颗红黑树是满足下面红黑性质的二叉搜索树:       1.每个结点或是红色的,或是黑色的。       2.根结点是黑色的。       3.每个叶子结点(NIL)是黑色的。       4.如果一个结点是红的,那么它的两个子结点都是黑的。       5.对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑结点。 ——引用自《算法导论》 第十三章 红黑树 红黑树的性质
全栈程序员站长
2022/11/01
5260
探索eBPF:Linux内核的黑科技
Linux内核在2022年主要发布了5.16-5.19以及6.0和6.1这几个版本,每个版本都为eBPF引入了大量的新特性。本文将对这些新特性进行一点简要的介绍,更详细的资料请参考对应的链接信息。总体而言,eBPF在内核中依然是最活跃的模块之一,它的功能特性也还在高速发展中。某种意义上说,eBPF正朝着一个完备的内核态可编程接口快速进化。
嵌入式Linux内核
2023/06/28
1.6K0
探索eBPF:Linux内核的黑科技
连接跟踪(conntrack):原理、应用及 Linux 内核实现
本文介绍连接跟踪(connection tracking,conntrack,CT)的原理,应用,及其在 Linux 内核中的实现。
我是阳明
2020/12/16
17.2K0
连接跟踪(conntrack):原理、应用及 Linux 内核实现
UDP协议源码解析之接收
调用读取数据的函数前,我们要先调用bind绑定socket对应的地址信息,因为系统是根据地址和端口去查找一个socket的。由代码可以知道,入口没有什么逻辑,主要逻辑在udp层的实现代码中。代码的实现比较简单,就是从socket的接收队列中摘下数据。
theanarkh
2019/03/06
1.1K0
网卡收到一个数据包的时候,是如何传给应用层的(下)
上篇讲到mac头通过mac头的协议字段决定把数据包分发给上层的哪个协议。这里假设上层协议是ip,ip层处理函数是ip_rcv,代码如下
theanarkh
2019/03/06
1.1K0
26.Linux-网卡驱动介绍以及制作虚拟网卡驱动(详解)
本文介绍了如何编写一个简单的驱动程序,该驱动程序可以控制硬件设备。首先介绍了驱动程序的基本结构和组成,包括驱动程序、设备、设备文件、操作系统和硬件之间的交互。然后详细讲解了驱动程序的开发过程,包括设备树、设备驱动、设备驱动的加载和运行,以及如何使用驱动程序开发工具编写驱动程序。最后,介绍了驱动程序在实际开发中的应用,包括驱动程序开发中的常见问题和解决方法,以及如何在生产环境中部署驱动程序。通过本文的学习,可以加深对驱动程序的理解,掌握驱动程序开发的基本技能,为后续的驱动程序开发工作打下坚实的基础。","summary_detail":[{"title":"本文介绍了如何编写一个简单的驱动程序,该驱动程序可以控制硬件设备。","summary":"本文介绍了如何编写一个简单的驱动程序,该驱动程序可以控制硬件设备。首先介绍了驱动程序的基本结构和组成,包括驱动程序、设备、设备文件、操作系统和硬件之间的交互。然后详细讲解了驱动程序的开发过程,包括设备树、设备驱动、设备驱动的加载和运行,以及如何使用驱动程序开发工具编写驱动程序。最后,介绍了驱动程序在实际开发中的应用,包括驱动程序开发中的常见问题和解决方法,以及如何在生产环境中部署驱动程序。通过本文的学习,可以加深对驱动程序的理解,掌握驱动程序开发的基本技能,为后续的驱动程序开发工作打下坚实的基础。
诺谦
2018/01/03
11.1K0
26.Linux-网卡驱动介绍以及制作虚拟网卡驱动(详解)
《Linux Device Drivers》 第十七章 网络驱动程序——note
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/117744.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/11
8520
基于linux的嵌入IPv4协议栈的内容过滤防火墙系统(5)-包过滤模块和内容过滤模块所采用的各种技术详述
3。1 module编程 module可以说是 Linux 的一大革新。有了 module 之后,写 device driver 不再是一项恶梦,修改 kernel 也不再是一件痛苦的事了。因为你不需要每次要测试 driver 就重新 compile kernel 一次。那简直是会累死人。Module 可以允许我们动态的改变 kernel,加载 device driver,而且它也能缩短我们driver development 的时间。在这篇文章里,我将要跟各位介绍一下 module 的原理,以及如何写一个 module。
源哥
2018/08/28
1.2K0
基于linux的嵌入IPv4协议栈的内容过滤防火墙系统(5)-包过滤模块和内容过滤模块所采用的各种技术详述
Linux内核网络UDP数据包发送(三)——IP协议层分析
Linux内核网络 UDP 协议层通过调用 ip_send_skb 将 skb 交给 IP 协议层,本文通过分析内核 IP 协议层的关键函数来分享内核数据包发送在 IP 协议层的处理,并分享了监控IP层的方法。
Linux阅码场
2021/08/26
3.3K0
利用动态 tracing 技术来 trace 内核中的网络请求
这周帮朋友用 eBPF/SystemTap 这样的动态 tracing 工具做了一些很有趣的功能。这篇文章算是一个总结
青南
2021/06/23
1.9K0
利用动态 tracing 技术来 trace 内核中的网络请求
使用 ebpf 深入分析容器网络 dup 包问题
大家好,我是杨玉玺,2011年至今一直从事底层网络研发,先后就职于阿里云、金山云从事 VPC 虚拟化网络研发,对高性能网络优化,复杂网络问题排查有非常丰富的经验。目前就职腾讯云 TKE 团队,专注 K8S 底层网络。
灵雀云
2020/02/17
1.3K0
使用 ebpf 深入分析容器网络 dup 包问题
Linux 1.2.13 -- IP分片重组源码分析
本文源码解析参考: 深入理解TCP/IP协议的实现之ip分片重组 – 基于linux1.2.13
大忽悠爱学习
2023/10/11
6590
Linux 1.2.13 -- IP分片重组源码分析
信息安全课程——窃取密码
信息安全课程——窃取密码 一、 一、 安装ubantu16-64 Desktop版本 通过XShell连接虚拟机。 sudo apt install openssh-server sudo apt-get install vim #安装vim,使用上下左右键 sudo apt-get install gcc-multilib 代码如下: //getpass.c #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <
matt
2022/10/25
6480
信息安全课程——窃取密码
Netfilter编程实现用户名和密码的窃取
本实验窃取密码的前提是要明文传输,先必须找到一个登录页面是采用http协议(非https)的站点,一般的163邮箱都有相应的防御机制,建议使用自己学校的邮箱或门户,随意输入用户名和密码。
matt
2022/10/25
2.8K0
Netfilter编程实现用户名和密码的窃取
如何学习 Linux 内核网络协议栈
sk_buff 是一个贯穿整个协议栈层次的结构,在各层间传递时,内核只需要调整 sk_buff 中的指针位置就行。
入门笔记
2022/11/14
1.6K0
如何学习 Linux 内核网络协议栈
OVS BUG撸码回忆录 •上篇
本文作者 / yogazhao 爱自然科学,赞叹于大师级码农高超的艺术境界;爱生命科学,诚服于古圣先贤的天地气象。 可能大多数瓜农都对《艺伎回忆录》比较熟悉,作为一个IT界的码农,当然也有自己类似的经历,该文分为上篇和下篇,此篇为《OVS BUG撸码回忆录•上篇》 回忆录缘起 以前为排查ovs的某个bug,无奈撸了把相关内核流程。当时因为调用链太多,脑袋栈溢出,处理不过来,所以临时用txt比较零散的记录了下关键点,做完了就丢了。后面想起来,无奈用everything找了好久才找到, 再读之,发现忘了很
腾讯云TStack
2019/07/19
1.4K0
OVS BUG撸码回忆录 •上篇
LVS原理与实现 - 实现篇
在上一篇文章中,我们主要介绍了 LVS 的原理,接下来我们将会介绍 LVS 的代码实现。
用户7686797
2021/02/24
1.7K0
推荐阅读
相关推荐
万字图解 | 深入揭秘Linux 接收网络数据包
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验