zoukankan      html  css  js  c++  java
  • tcp/ip协议栈调用关系图

    最近阅读了tcp/ip详解卷2,总结一下整个发送过程和接收过程

                        sendmsg

                     /

                   sendit

                     /

                   sosend(这一步将数据从用户空间拷贝到内核空间,并且会在这一步判断发送缓存空间是否充足,是否需要等待缓存空间,循环发送)

                     /

                   tcp_usrreq(将上一步中整理好的数据添加到发送缓冲尾部)

                     /

                   tcp_output(可能会分片发送,这一步会申请新的内存来放置消息体,并未下一步的头部预留空间,避免再次申请新的内

                         存)

                     /

                   ip_output(这一步也会分片,在上一步的mbuf的基础上添加上ip首部,循环发送)

                     /

                   ether_output(添加上以太网首部,并将mbuf放入到网卡接口的发送队列)

      到此,发送就结束了,上面的过程仅仅是一种情况,但是不管是什么协议,最后都是将数据放入网卡接口队列为止。所以另一方面也说明了,sendmsg或者其他函数,回复成功并不代表对端接收消息成功或者其他什么含义,仅仅是将消息放入网卡接口队列而已。

      下面总结一下消息的接收

                    leintr(网卡中断)

                      /

                    lerint(读中断)

                      /

                    leread(构建一个mbuf,在把帧传给bpf之后比较以太网地址是否是本机)

                      /

                    ether_input(调度ip输入中断,当然还有其他的中断如arpa,要看网络层的协议号,将mbuf添加到ip输入队列的尾部)

                      /

                    ipintr(ip中断被调度到,从队列中取下一个消息,这一步包括消息的重组,调用相应运输层协议的input,这一步会判断这个包是不是发给本机)

                      /

                    tcp_input(这一步的处理相当复杂,简单说,找到协议栈控制块,将数据添加到输入缓冲,并且唤醒在等待数据的线程)

       所以这里呢,可以看出输入的话是有多次中断的发生,不是一个同步的过程。

       另外一个,抓包的接口是在lestart和leread函数中被调用的。

       这个过程中还有一些路由的查找,出错等信息并没有细细的研究,还有,网卡结构,地址结构,路由结构,协议控制块等等的关系图没有研究。有必要会再次总结。

  • 相关阅读:
    POJ 3267 The Cow Lexicon(动态规划)
    POJ 1125 Stockbroker Grapevine(最短路径Floyd算法)
    HDU 2374 || SDUT2386 A Game with Marbles(简单题)
    JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
    基于SNMP的MIB库访问实现的研究
    一个兼容大多数浏览器 的 图片滚动的js
    C#获取本地计算机名,IP,MAC地址,硬盘ID
    中文首字母搜素的实现 sql函数
    xml文档的加密与解密
    修改Windows 2003 server远程桌面端口3389
  • 原文地址:https://www.cnblogs.com/leo0000/p/5580849.html
Copyright © 2011-2022 走看看