最详细的Linux TCP/IP 协议栈源码分析
一.linux内核网络栈代码的准备知识1. linux内核ipv4网络部分分层结构:
BSD socket层: 这一部分处理BSD socket相关操作 , 每个socket在内核中以struct socket结构体现 。 这一部分的文件
主要有:/net/socket.c /net/protocols.c etc INET socket层:BSD socket是个可以用于各种网络协议的接口 , 而当用于tcp/ip , 即建立了AF_INET形式的socket时 ,
还需要保留些额外的参数 , 于是就有了struct sock结构 。 文件主要
有:/net/ipv4/protocol.c /net/ipv4/af_inet.c /net/core/sock.c etc TCP/UDP层:处理传输层的操作 , 传输层用struct inet_protocol和struct proto两个结构表示 。 文件主要
有:/net/ipv4/udp.c /net/ipv4/datagram.c /net/ipv4/tcp.c /net/ipv4/tcp_input.c /net/ipv4//tcp_output.c /net/ipv4/tcp_minisocks.c /net/ipv4/tcp_output.c /net/ipv4/tcp_timer.c
etc IP层:处理网络层的操作 , 网络层用struct packet_type结构表示 。 文件主要有:/net/ipv4/ip_forward.c
ip_fragment.c ip_input.c ip_output.c etc. 数据链路层和驱动程序:每个网络设备以struct net_device表示 , 通用的处理在dev.c中 , 驱动程序都在/driver/net目
录下 。
2. 两台主机建立udp通信所走过的函数列表
^ | sys_read fs/read_write.c | sock_read net/socket.c | sock_recvmsg net/socket.c | inet_recvmsg net/ipv4/af_inet.c | udp_recvmsg net/ipv4/udp.c | skb_recv_datagram net/core/datagram.c | ------------------------------------------- | sock_queue_rcv_skb include/net/sock.h | udp_queue_rcv_skb net/ipv4/udp.c | udp_rcv net/ipv4/udp.c | ip_local_deliver_finish net/ipv4/ip_input.c | ip_local_deliver net/ipv4/ip_input.c | ip_recv net/ipv4/ip_input.c | net_rx_action net/dev.c | ------------------------------------------- | netif_rx net/dev.c | el3_rx driver/net/3c309.c | el3_interrupt driver/net/3c309.c ========================== | sys_write fs/read_write.c | sock_writev net/socket.c | sock_sendmsg net/socket.c | inet_sendmsg net/ipv4/af_inet.c | udp_sendmsg net/ipv4/udp.c | ip_build_xmit net/ipv4/ip_output.c | output_maybe_reroute net/ipv4/ip_output.c | ip_output net/ipv4/ip_output.c | ip_finish_output net/ipv4/ip_output.c | dev_queue_xmit net/dev.c | -------------------------------------------- | el3_start_xmit driver/net/3c309.c V
需要C/C++ Linux服务器架构师学习资料私信“资料”(资料包括C/C++ , Linux , golang技术 , Nginx , ZeroMQ , MySQL , Redis , fastdfs , MongoDB , ZK , 流媒体 , CDN , P2P , K8S , Docker , TCP/IP , 协程 , DPDK , ffmpeg等) , 免费分享
文章插图
二.linux的tcp-ip栈代码的详细分析
1.数据结构(msghdr,sk_buff,socket,sock,proto_ops,proto)
bsd套接字层,操作的对象是socket,数据存放在msghdr这样的数据结构:
创建socket需要传递family,type,protocol三个参数 , 创建socket其实就是创建一个socket实例 , 然后创建一个文件描述符结构 , 并且互相建立一些关联 , 即建立互相连接的指针 , 并且初始化这些对文件的写读操作映射到socket的read , write函数上来 。
同时初始化socket的操作函数(proto_ops结构),如果传入的type参数是STREAM类型 , 那么就初始化为SOCKET->ops为inet_stream_ops , 如果是DGRAM类型 , 则SOCKET-ops为inet_dgram_ops 。 对于inet_stream_ops其实是一个结构体 , 包含了stream类型的socket操作的一些入口函数 , 在这些函数里主要做的是对socket进行相关的操作 , 同时通过调用下面提到的sock中的相关操作完成socket到sock层的传递 。 比如在inet_stream_ops里有个inet_release的操作 , 这个操作除了释放socket的类型空间操作外 , 还通过调用socket连接的sock的close操作 , 对于stream类型来说 , 即tcp_close来关闭sock
- Linux Kernel 5.10.5发布:禁用FBCON加速滚动特性
- Linux 5.11开始围绕PCI Express 6.0进行早期准备
- Fedora正在寻求协助 希望加快Linux 5.10 LTS内核测试进度
- Linux Mint 20.1 Ulyssa稳定版已确定延期至2021年初发布
- 英特尔Xe GPU在Linux 5.11上的性能表现不错
- MIPS架构厂商日渐式微 Linux报告其漏洞遭遇困难
- Linux Kernel 5.11首个候选版本更新发布
- Linux 5.12内核将支持Radeon RX 6000系列显卡超频
- 开源开发者尝试为任天堂N64主机带来了新的Linux内核移植
- Linux 5.11窗口合并期今天结束 引入大量新特性和改进