目录
1 UDP报文接收概述
2 从IP层接收数据包 udp_rcv()
2.1 查找数据包所属套接字 __udp4_lib_lookup_skb()
2.2 数据包进入队列 udp_queue_rcv_skb()
2.2.1 数据包进接收队列 sk_receive_queue
2.2.2 唤醒阻塞进程 sock_def_readable(进接收队列唤醒)
2.2.3 数据包进后备队列 sk_backlog
UDP数据报的接收要分两部分来看:
- 网络层接收完数据包后递交给UDP后,UDP的处理过程。该过程UDP需要做的工作就是接收数据包并对其进行校验,校验成功后将其放入接收队列 sk_receive_queue 中等待用户空间程序来读取。
- 用户空间程序调用read()等系统调用读取已经放入接收队列 sk_receive_queue 中的数据。

该函数是在AF_INET协议族初始化时,由UDP注册给网络层的回调函数,当网络层代码处理完一个输入数据包后,如果该数据包是发往本机的,并且其上层协议就是UDP,那么会调用该回调函数。
疑惑:为何校验和的计算和验证要分udp4_csum_init()和udp_lib_checksum_complete()两步完成???
如上,非常关键的一步就是根据数据包中目的地址信息寻找应该由谁来处理该数据包。
疑惑:查个表为什么这么复杂,这个分值什么鬼???
找到数据包目的端口对应的传输控制块后,会调用该函数接收该数据包。

2.2.1 数据包进接收队列 sk_receive_queue
2.2.2 唤醒阻塞进程 sock_def_readable(进接收队列唤醒)
将数据放入接收队列后,需要唤醒那些因为数据不足而阻塞的进程,这是通过上面的sk->sk_data_ready()回调实现的,对于UDP,该函数就是 sock_def_readable。
2.2.3 数据包进后备队列 sk_backlog
在下半部接收时,如果传输控制块已经被进程锁定,那么会先将数据放入到后备队列中,等进程释放传输控制块时再进行处理,这种设计可以使得软中断能够尽快的结束。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/179914.html