tcp_v4_rcv函数位于net/ipv4/tcp_ipv4.c文件中,是处理TCP数据包的入口函数。当一个TCP数据包到达网卡后,经过网络层和传输层的处理后,最终会到达tcp_v4_rcv函数进行处理。该函数主要完成对TCP数据包的解析、数据包校验以及与已经建立的TCP连接进行匹配等操作。 在tcp_v4_rcv函数中,首先会进行数据包的基本校验,...
本文假设读者已经对Linux的TCP实现源码有了足够清晰的理解,因此不会大量篇幅分析Linux内核关于TCP的源代码,比如tcp_v4_rcv的流程之类的。 1.Linux的TCP实现 1.1.Linux的TCP实现在协议层面分为两个部分 1).连接握手处理 TCP首先会通过三次握手建立一个连接,然后就可以传输数据了。TCP规范并没有指定任何的实现方式,当...
最后在分析tcp_v4_rcv和tcp_recvmsg之前,我们要知道tcp_v4_rcv还是处于软中断上下文,而tcp_recvmsg是处于进程上下文,因此比如socket_lock_t才会提供一个owned来锁住对应的sock。而我们也就是需要这3个队列来进行软中断上下文和进程上下文之间的通信。最终当数据拷贝到对应队列,则软中断调用返回。这里要注意的是相同的函...
如果是本地接收的数据包,会进入ip_local_deliver函数完成IP协议的进一步处理;从IP分组解析出数据内容后,数据包会被iplocal_delive_finish 函数递交给传输层的接收函数(TCP协议是tcp_v4_rcv数,UDP协议是udp_rcv数)。如果ip_rcv_finish 判断是转发的数据包,需要调用路由模块的iprouteinput 查找路由表,确定数据转发路径...
在深入理解Linux内核任务调度(中断处理、softirg、tasklet、wq、内核线程等)机制的基础上,分析梳理send和recv过程中TCP/IP协议栈相关的运行任务实体及相互协作的时序分析。 编译、部署、运行、测评、原理、源代码分析、跟踪调试等 应该包括时序图 一、TCP/IP协议介绍 ...
接收队列包含了处理过的TCP数据段,也就是说,去除了全部的协议头,正准备将数据复制到用户应用程序。接收队列包含了所有按顺序接收的数据段,在其他两个队列中的TCP数据段则需要进一步处理。 TCP报文首先由tcp_v4_rcv()进行处理。该函数要决定是否需要处理报文或者在待处理队列和预排队队列中排队。
pr_crit("%s: Cannot add TCP protocol\n", __func__); ... dev_add_pack(&ip_packet_type); } 上面的代码中我们可以看到,udp_protocol 结构体中的 handler 是 udp_rcv,tcp_protocol 结构体中的 handler 是 tcp_v4_rcv,通过 inet_add_protocol 被初始化了进来。 int ...
->tcp_v4_do_rcv ->tcp_rcv_established, 在tcp_rcv_establisheed函数中处理TCP_ESTABLISHED状态的包,并根据pred_flags预测字段来选择着采用快路径或慢路径。 二、首部预测字段-pred_flags 预测字段存储在struct tcp_sock中,pred_flag为0表示关闭首部预测使用慢速路径,非0表示开启快速路径的前提,如果开启会对该变量...
inttcp_v4_connect(struct sock *sk, struct sockaddr *uaddr,intaddr_len) { //设置 socket 状态为 TCP_SYN_SENT tcp_set_state(sk, TCP_SYN_SENT); //动态选择一个端口 err = inet_hash_connect(&tcp_death_row, sk); //函数用来根据 sk 中的信息,构...
tcp_v4_do_rcv()是TCP模块接收的入口函数,客户端发起请求的对象是listen fd,所以sk->sk_state == TCP_LISTEN,调用tcp_v4_hnd_req()来检查是否处于半连接,只要三次握手没有完成,这样的连接就称为半连接,具体而言就是收到了SYN,但还没有收到ACK的连接,所以对于这个查找函数,如果是SYN报文,则会返回listen的...