`
sabolasi
  • 浏览: 909791 次
文章分类
社区版块
存档分类
最新评论

Linux UDP协议栈中的片段分析 - udp_recvmsg

 
阅读更多

  1. udp_recvmsg(structkiocb*iocb,structsock*sk,structmsghdr*msg,
  2. size_tlen,intnoblock,intflags,int*addr_len)
调用了:
  1. err=skb_copy_datagram_iovec(skb,sizeof(structudphdr),msg->msg_iov,copied);
调用了:
  1. memcpy_toiovec(to,skb->data+o,copy);
调用了:
  1. /*
  2. *Copykerneltoiovec.Returns-EFAULTonerror.
  3. *
  4. *Note:thismodifiestheoriginaliovec.
  5. */
  6. intmemcpy_toiovec(structiovec*iov,unsignedchar*kdata,intlen)
  7. {
  8. while(len>0){
  9. if(iov->iov_len){
  10. intcopy=min_t(unsignedint,iov->iov_len,len);
  11. if(copy_to_user(iov->iov_base,kdata,copy))
  12. return-EFAULT;
  13. kdata+=copy;
  14. len-=copy;
  15. iov->iov_len-=copy;
  16. iov->iov_base+=copy;
  17. }
  18. iov++;
  19. }
  20. return0;
  21. }

在udp_recvmsg中,随着不断地recv,内部会自动修改iov->iov_base,也就是说,在内核态,多个消息可以累积接收的。
这一点正是我们曾经期待过而又否定过的。

期待在于:如果内部能一次性收多个包,那么就可以大大节省系统调用开销了。
否定在于:系统如何知晓数据的结构呢?比如每个包的大小等。OS提供的接口属于通用型接口,不能期望它做太多的优化。

现在好了,在内核态,如果添加适当的协议及数据头,就可以让系统一次性收多个数据包,然后一次性返回给用户层!

Very Nice~

要点:提供足够缓冲区、设计适当的数据头(由发送端打包)



分享到:
评论

相关推荐

    linux_net.pdf

    linux tcp/ip分析 两台主机建立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 | ...

    tcp_recvmsg

    tcp_recvmsg,网上关于tcp_recvmsg的文章,感觉解释的不太到位,现在重新总结了一下

    linux网络编程-宋敬彬-part1

    5.2.1 TCP/IP协议栈参考模型 141 5.2.2 主机到网络层协议 143 5.2.3 IP协议 144 5.2.4 网际控制报文协议(ICMP) 146 5.2.5 传输控制协议(TCP) 150 5.2.6 用户数据报文协议(UDP) 154 5.2.7 地址解析...

    TCP-IP详解卷2_2.rar

    1.9.3 添加IP和UDP首部 13 1.9.4 IP输出 14 1.9.5 以太网输出 14 1.9.6 UDP输出小结 14 1.10 输入处理 15 1.10.1 以太网输入 15 1.10.2 IP输入 15 1.10.3 UDP输入 16 1.10.4 进程输入 17 1.11 网络实现概述(续) 17 ...

    Linux网络编程 视频 教程

    Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章。 Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP...

    TCP-IP详解卷2_1.rar

    1.9.3 添加IP和UDP首部 13 1.9.4 IP输出 14 1.9.5 以太网输出 14 1.9.6 UDP输出小结 14 1.10 输入处理 15 1.10.1 以太网输入 15 1.10.2 IP输入 15 1.10.3 UDP输入 16 1.10.4 进程输入 17 1.11 网络实现概述(续) 17 ...

    C++教程网《Linux网络编程》视频百度云地址

    Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章。 Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP...

    TCPIP协议详解卷2:实现

    本卷的特点是使用大量的源代码来讲述TCP/IP协议族中的各协议是怎样实现的。这些内容对于编写TCP/IP网络应用程序的程序员和负责维护基于TCP/IP协议的计算机网络的系统管理员来说,应当是必读的。 参加本书翻译的有:...

    c++教程网的linux网络编程视频下载

    消息队列在内核中的表示 消息队列函数 26System V消息队列(二) msgsnd函数 msgrcv函数 27System V消息队列(三) 消息队列实现回射客户/服务器 28共享内存介绍 共享内存 共享内存示意图 管道、消息队列...

    [免费]2018年C++教程网的linux网络编程视频百度云下载链接.rar

    消息队列在内核中的表示 消息队列函数 26System V消息队列(二) msgsnd函数 msgrcv函数 27System V消息队列(三) 消息队列实现回射客户/服务器 28共享内存介绍 共享内存 共享内存示意图 管道、消息队列...

    linux网络编程

    udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域字节流回射客户/服务 UNIX域套接字编程注意点 22socket编程(十七) socketpair sendmsg/recvmsg UNIX域套接字传递描述符字 Linux网络编程...

    C++教程网视频:linux网络编程

    Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章。 Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP...

    2018年C++教程网的linux网络编程视频共41集百度云下载链接.rar

    Linux网络编程(总共41集) 讲解Linux网络编程知识,分以下四个篇章。 Linux网络编程之TCP/IP基础篇 Linux网络编程之socket编程篇 Linux网络编程之进程间通信篇 Linux网络编程之线程篇 Linux网络编程之TCP/IP基础篇...

    linux programming instances网络编程教程 附源代码

    全书由13章组成,内容涉及到Lindx系统编程基础、TCP/UDP协议、套接字编程概念及I/O模型、高级编程中需要用到的进程问通信同步、多路复用、多线程编程和一些高级套接字控制方法、IPv6介绍以及网络安全等。...

    tcp-ip详解2:协议的实现

    1.9.3 添加IP和UDP首部 13 1.9.4 IP输出 14 1.9.5 以太网输出 14 1.9.6 UDP输出小结 14 1.10 输入处理 15 1.10.1 以太网输入 15 1.10.2 IP输入 15 1.10.3 UDP输入 16 1.10.4 进程输入 17 1.11 网络实现概述(续) 17 ...

    TCP-IP详解卷2:实现.part1

    本书完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15 000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。本书不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别...

    TCP_IP详解卷1

    描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者用Lawrence Berkeley实验室的tcpdump程序来捕获不同操作系统和TCP/IP实现之间传输的不同分组。对tcpdump输出的研究可以帮助理解不同协议如何工作...

    TCP/IP详解part_2

    描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者用Lawrence Berkeley实验室的tcpdump程序来捕获不同操作系统和TCP/IP实现之间传输的不同分组。对tcpdump输出的研究可以帮助理解不同协议如何工作...

    TCP-IP详解卷2:实现.part2

    本书完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15 000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。本书不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别...

Global site tag (gtag.js) - Google Analytics