🧐 Keep Learning...
dengyunsheng250 / github_pages Goto Github PK
View Code? Open in Web Editor NEWto record blog
to record blog
🧐 Keep Learning...
start_kernel 函数在 init/main.c 文件中定义,它是内核启动的入口点。
在 start_kernel 中,会调用 rest_init,这是一个初始化函数,它在 kernel/init.c 文件中定义。
rest_init 会调用 kernel_init_freeable,这是另一个初始化函数,它在 kernel/init.c 文件中定义。
kernel_init_freeable 中会调用 net_init,这是网络初始化的入口点,它在 net/core/sock.c 文件中定义。
net_init 会调用 inet_init,这是初始化TCP/IP协议栈的函数,它在 net/ipv4/af_inet.c 文件中定义。
协议上下都通过TCP/ IP相关联。
TCP/IP协议栈通过一系列的数据结构和函数调用来实现与上层套接口(如应用层)和下层数据链路层的关联。以下是TCP/IP协议栈中一些关键组件和它们如何相互关联的概述:
套接口(Socket):
socket
创建。bind
, listen
, connect
, accept
, send
, recv
等,这些API允许应用层发送和接收数据。协议族(Protocol Family):
AF_INET
(IPv4)或 AF_INET6
(IPv6)。协议(Protocol):
SOCK_STREAM
(TCP)或 SOCK_DGRAM
(UDP)。网络核心API:
inet_sendmsg
和 inet_recvmsg
,提供了与套接口API交互的接口。协议层处理:
tcp_sendmsg
,然后传递给IP层。tcp_recvmsg
,最后传递给应用层。数据链路层:
路由和ARP:
网络设备驱动程序:
通过这些组件和它们的交互,TCP/IP协议栈实现了从应用层到数据链路层的完整通信路径。在实际的Linux内核源代码中,这些组件的实现可能会更加复杂,并且涉及到更多的细节。
TCP三次握手涉及的函数通常在 net/ipv4/tcp_ipv4.c 文件中。
tcp_v4_connect 函数处理连接请求,它调用 tcp_create_openreq_child 创建一个新的连接请求。
tcp_create_openreq_child 创建一个新的 struct request_sock 实例,并调用 tcp_v4_send_syn 发送SYN包。
tcp_v4_send_syn 设置SYN标志位并发送SYN包。
tcp_v4_send_synack 在接收到SYN包后发送SYN-ACK包。
tcp_v4_do_rcv 处理接收到的TCP段,根据状态机进行状态转换。
send 函数在用户空间通过系统调用 sys_sendto 或 sys_sendmsg 实现。
在内核空间,sys_sendto 或 sys_sendmsg 调用 inet_sendmsg。
inet_sendmsg 调用 tcp_sendmsg,然后是 tcp_write_xmit。
tcp_write_xmit 封装数据成TCP段,并通过 ip_local_out 发送。
recv 函数在用户空间通过系统调用 sys_recvfrom 或 sys_recvmsg 实现。
在内核空间,sys_recvfrom 或 sys_recvmsg 调用 inet_recvmsg。
inet_recvmsg 调用 tcp_recvmsg,然后是 tcp_prequeue_process。
数据被接收后,通过 sk_filter_trim_cap 等函数进行过滤,然后传递给应用层。
路由表由 struct fib_table 和 struct fib_info 表示,这些结构体在 net/ipv4/fib_semantics.h 文件中定义。
初始化过程在 fib_net_init 函数中进行,这个函数在 net/ipv4/fib_main.c 文件中定义。
在Linux网络核心中,查询路由表以找到目的IP地址的下一跳IP地址的过程涉及以下几个关键步骤:
路由表查找:
struct fib_table
结构体表示的,它包含了一系列的路由规则,每个规则由struct fib_info
结构体表示。最长前缀匹配(LPM):
fib_lookup
函数中完成,该函数在net/ipv4/fib_semantics.c
文件中定义。路由选择:
ARP解析:
arp_send_request
函数发送,该函数在net/ipv4/arp.c
文件中定义。数据包封装:
dev_hard_header
和skb_push
等函数。数据包发送:
这个过程涉及到多个内核模块和函数,它们协同工作以确保数据包能够正确地路由到目的地。在实际的Linux内核源代码中,这些步骤可能会更加复杂,并且涉及到更多的细节和错误处理逻辑。
##ARP缓存的数据结构及初始化过程
ARP缓存使用 struct arp_table 数据结构表示,这个结构体在 net/ipv4/arp.h 文件中定义。
初始化过程在 arp_init 函数中进行,这个函数在 net/ipv4/arp.c 文件中定义。
将IP地址解析为MAC地址的过程涉及发送ARP请求,这在 net/ipv4/arp.c 文件中的 arp_send 函数中实现。
void arp_send(int type, int ptype, __be32 dest_ip,
struct net_device *dev, __be32 src_ip,
const unsigned char *dest_hw, const unsigned char *src_hw,
const unsigned char *target_hw)
{
arp_send_dst(type, ptype, dest_ip, dev, src_ip, dest_hw, src_hw,
target_hw, NULL);
}
可以看到相应的封装
在 tcp_write_xmit 中,数据被封装成TCP段。
然后调用 ip_local_out 进行路由查询,这在 net/ipv4/ip_output.c 文件中的 ip_local_out 函数中实现。
如果目标IP地址不在本地网络中,内核会调用 arp_send_request 来解析目标IP地址对应的MAC地址,这在 net/ipv4/arp.c 文件中的 arp_send_request 函数中实现。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.