Skip to the content.

https://linux.die.net/man/7/socket

/* Sock flags */
enum sock_flags {
    SOCK_DEAD,
    SOCK_DONE,
    SOCK_URGINLINE,
    SOCK_KEEPOPEN,
    SOCK_LINGER,
    SOCK_DESTROY,
    SOCK_BROADCAST,
    SOCK_TIMESTAMP,
    SOCK_ZAPPED,
    SOCK_USE_WRITE_QUEUE, /* whether to call sk->sk_write_space in sock_wfree */
    SOCK_DBG, /* %SO_DEBUG setting */
    SOCK_RCVTSTAMP, /* %SO_TIMESTAMP setting */
    SOCK_RCVTSTAMPNS, /* %SO_TIMESTAMPNS setting */
    SOCK_LOCALROUTE, /* route locally only, %SO_DONTROUTE setting */
    SOCK_MEMALLOC, /* VM depends on this socket for swapping */
    SOCK_TIMESTAMPING_RX_SOFTWARE,  /* %SOF_TIMESTAMPING_RX_SOFTWARE */
    SOCK_FASYNC, /* fasync() active */
    SOCK_RXQ_OVFL,
    SOCK_ZEROCOPY, /* buffers from userspace */
    SOCK_WIFI_STATUS, /* push wifi status to userspace */
    SOCK_NOFCS, /* Tell NIC not to do the Ethernet FCS.
             * Will use last 4 bytes of packet sent from
             * user-space instead.
             */
    SOCK_FILTER_LOCKED, /* Filter cannot be changed anymore */
    SOCK_SELECT_ERR_QUEUE, /* Wake select on error queue */
    SOCK_RCU_FREE, /* wait rcu grace period in sk_destruct() */
    SOCK_TXTIME,
    SOCK_XDP, /* XDP is attached */
    SOCK_TSTAMP_NEW, /* Indicates 64 bit timestamps always */
    SOCK_RCVMARK, /* Receive SO_MARK  ancillary data with packet */
};

可以看看 socket 的所有的 option 都有啥 ?

everything is file 和 socket 接口的差别是什么,为什么如果是 socket 最好是使用 socket 的

参考 man send(2)

The only difference between send() and write(2) is the presence of flags.

常规的 read write 从这里切入:

static const struct file_operations socket_file_ops ;

使用 kprobe 观察下,应该是很清晰的:

@[
    inet_sendmsg+5
    sock_write_iter+367
    vfs_write+889
    ksys_write+187
    do_syscall_64+93
    entry_SYSCALL_64_after_hwframe+110
]: 1054
@[
    inet_sendmsg+5
    sock_sendmsg+254
    splice_to_socket+981
    do_splice+788
    __do_splice+496
    __x64_sys_splice+178
    do_syscall_64+93
    entry_SYSCALL_64_after_hwframe+110
]: 24459
@[
    inet_sendmsg+5
    __sys_sendto+478
    __x64_sys_sendto+36
    do_syscall_64+93
    entry_SYSCALL_64_after_hwframe+110
]: 35897

AF_PACKET

Linux drivers in user space — a survey

Direct access to a network device can be achieved by creating a network socket using the AF_PACKET address family and specifying the SOCK_RAW communication type. This socket can then be bound to a particular interface or a particular Ethernet protocol type. A slightly less direct interface can be had by using SOCK_RAW with AF_INET. This still provides the routing and other functionality common to all IP protocols, but gives complete control over the payload of each IP packet.

  1. 最直接的访问:AF_PACKET + SOCK_RAW

用途:实现协议栈底层工具(如 tcpdump、arping)、自定义协议、网络测试、安全工具等。

  1. 稍微间接但更高级的访问:AF_INET + SOCK_RAW

用途:实现自定义传输协议、ICMP 工具(如 ping)、网络探测、绕过标准 socket API 的限制等。 ❌ 不能操作 MAC 层,也无法指定出口接口的 MAC 地址或监听非 IP 协议(如 ARP)。

特性 AF_PACKET + SOCK_RAW AF_INET + SOCK_RAW
网络层 数据链路层(L2) 网络层(L3)
可构造内容 完整以太网帧(含 MAC) IP 载荷(可含 IP 头)
路由 由应用决定(如指定接口) 由内核路由子系统决定
协议范围 任意以太网协议(IP/ARP/自定义) 仅 IP 协议族(TCP/UDP/ICMP 等)
权限要求 高(CAP_NET_RAW) 高(通常也需要 CAP_NET_RAW)
典型工具 tcpdump, Scapy (L2), arp ping, traceroute, 自定义 IP 工具

[ ] 分析一下这些 flags,比如 SOCK_ZEROCOPY

AF_UNIX

unix domain socket 使用的

勉强读一读

用这个做对比

vn/code/src/c/dccp/README.md

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。