没有合适的资源?快使用搜索试试~ 我知道了~
linux-TcpIP协议栈源码阅读笔记.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 155 浏览量
2021-11-26
09:27:04
上传
评论
收藏 454KB PDF 举报
温馨提示
试读
17页
linux-TcpIP协议栈源码阅读笔记.pdf
资源推荐
资源详情
资源评论
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
3. 网络路径图、重要数据结构 sk_buffer 及路由介绍
linux-net.pdf 第 2.1 章 第 2.3 章 第 2.4 章
4. 从连接、发送、到接收数据包的过程
linux-net.pdf 第 4 、5、6 章详细阐述
二.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
释放 sock 。
创建 socket 同时还创建 sock 数据空间,初始化 sock, 初始化过程主要做的事
情是初始化三个队列, receive_queue (接收到的数据包 sk_buff 链表队
列),send_queue( 需要发送数据包的 sk_buff 链表队列 ),backlog_queue( 主
要用于 tcp 中三次握手成功的那些数据包 ,自己猜的 ), 根据 family 、type 参数,
初始化 sock 的操作,比如对于 family 为 inet 类型的, type 为 stream 类型
的,sock->proto 初始化为 tcp_prot. 其中包括 stream 类型的协议 sock 操作
对应的入口函数。
在一端对 socket 进行 write 的过程中, 首先会把要 write 的字符串缓冲区整理
成 msghdr 的数据结构形式 ( 参见 linux 内核 2.4 版源代码分析大全 ), 然后调用
sock_sendmsg 把 msghdr 的数据传送至 inet 层,对于 msghdr 结构中数据
区中的每个数据包,创建 sk_buff 结构,填充数据,挂至发送队列。一层层往
下层协议传递。一下每层协议不再对数据进行拷贝。而是对 sk_buff 结构进行
操作。
inet 套接字及以下层 数据存放在 sk_buff 这样的数据结构里:
路由:
在 linux 的路由系统主要保存了三种与路由相关的数据,第一种是在物理上
和本机相连接的主机地址信息表, 第二种是保存了在网络访问中判断一个网络地
址应该走什么路由的数据表; 第三种是最新使用过的查询路由地址的缓存地址数
据表。
1.neighbour 结构 neighbour_table{ } 是一个包含和本机所连接的所有
剩余16页未读,继续阅读
资源评论
sinat_40572875
- 粉丝: 52
- 资源: 7万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功