linux下IPROTO_TCP,TCP/IP协议栈在Linux内核中的运行时序分析

可选题目三:TCP/IP协议栈在Linux内核中的运行时序分析

在深入理解Linux内核任务调度(中断处理、softirg、tasklet、wq、内核线程等)机制的基础上,分析梳理send和recv过程中TCP/IP协议栈相关的运行任务实体及相互协作的时序分析。

编译、部署、运行、测评、原理、源代码分析、跟踪调试等

应该包括时序

一, 基础概念简介

1.什么是TCP/IP?

TCP/IP 也即传输控制协议/网际协议(Transmission Control Protocol / Internet Protocol),是一类通信协议,也是因特网种最根本的协议,用于提供已连接因特网的计算机进行通信。TCP/IP 定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。当然,TCP/IP协议不仅仅是指TCP和IP两个协议,而是指一类协议,如下图所示,对于四层模型,应用层中Telnet、FTP、SMTP等协议及传输层TCP/UDP协议也包括其中。以此命名,也只是因为在TCP/IP协议中TCP协议和IP协议最具代表性。

0ddfc99ffd07f03d415953d077bf0db5.png

2.osi七层模型

OSI参考模型将网络结构划分为七层,即物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。每一层均有自己的一套功能集,并与紧邻的上层和下层交互作用。在顶层,应用层与用户使用的软件进行交互,在七层模型中,每个分层都接受由它下一层所提供的特定服务,并且负责为自己的上一层提供特定的服务。需要注意的是OSI为理论参考模型,现在普遍采用的是下面介绍的四层模型。

539dd816b9407853ff4f6b27a5a31225.png

3. TCP/IP四层模型

基于TCP/IP的参考模型将网络结构分成四层,分别是网络访问层、网际层、传输层和应用层。相对于OSI参考模型,去掉了会话层和表示层(这两层的功能被合并到应用层实现)。同时将OSI参考模型中的数据链路层和物理层合并为网络访问层。

32e4ee2ce65a6ee4e819f29db3fe0c8b.png

4.Socket

Socket接口是TCP/IP网络的API,独立于具体协议的网络编程接口,在TCP/IP模型中,socket套接字主要位于传输层和应用层之间。Socket接口定义了许多函数或例程,可以用它们来开发TCP/IP网络上的应用程序,事实上,它是设计模式的一种应用,用于让编程变的更简单。

二、套接口层相关结构

1.socket结构

9d822bfb7788107f96c5fc43c5ff60ac.png

2.proto_ops 结构:套接口系统调用到传输层函数的跳转表,完成从套接口层到传输层的映射功能

3.sock结构:公用的网络描述块,定义了基本的传输控制块结构。与具体的协议无关。

4.proto结构:在proto_ops 结构的基础上,进一步将传输层和网络层之间进行映射

5.net_proto_family:每一个协议族都会用net_porto_family结构的一个实例进行表示,在初始化时,会调用sock_register函数进行统一的注册

三、Socket系统调用

1.sys_socketcall

在Linux系统中,所有的socket系统的调用总入口都为sys_socketcall,其函数原型为:

5e8d80a0efc9a834ae1d219e4311050b.png

函数的两个形参含义如下:

*call:每个数字代表一个操作码,一共17种,具体操作码对应情况如下:

96e37e74df3a28fdcace7fda268c59ec.png

对一些常用操作的说明:

SYS_SOCKET: 创建一个套接口,若创建成功,返回一个打开的文件描述符

SYS_BIND:将套接字地址与套接字号相绑定

SYS_CONNECT: 建立连接

SYS_LISTEN: 仅在TCP服务器端调用,将套接字转换到LISTEN状态

SYS_ACCEPT: 用于面向对象的连接器,用于接受新的连接

SYS_SEND:见下分析

SYS_RECV:见下分析

*args参数:为一个指针,指向数组,其可以根据不同的操作码要求,从用户态复制相应长度的数据,结构如下:

7875eff54955ffd0aaf647be5ab9421a.png

2.SYS_SOCKET()函数分析:

前面有同学对该函数进行了一定的分析,但是仍不够全面,在此做一定的补充。首先对源码进行分析:

d29310770a578f5949e18a2417862b3b.png

我们发现在sys_socket函数中,还调用了两个函数:socket_create()以及socket_mp_fd(),下面我们进一步对这两个函数进行进一步的解析:

sock_create()

6ccd487e0064adfa9f6903fc5d507cac.png

事实上,我们可以看到该函数只是将__socket_create()进行了简单封装,并将最后一个参数默认设置为0,所以我们这里将对__socket_create()做解析即可。

__socket_create()函数解析:

4430f6bf6c220a0eaa3d759b916f0003.png

eb38faf35b73e76eb557ec4b0a7ae0d3.png

21bce828217d1e9ecea5370305aff328.png

9f5278615dc23578f987fc06afe3965e.png

2.socket_mp_fd()

socket_map_fd的功能实际上是将socket套接口与文件描述符进行绑定(实际上我们从函数名也可以推测出)。

综上所述,由此我们可以得到sys_socket的函数调用时序图大致如下:

8c9219d8a72270dac073eedb1569de1a.png

跟踪调试结果:

083bba1b3d0eefd4a242521ebeea73c0.png

四、Send系统调用分析:

事实上sys_send只是对sys_sendto函数的简单封装:

d3fe04d39278f56bda8accc38d473d1e.png

同时未指定数据输出的目的地址(参数为NULL),所以采取默认地址,即connect函数连接的那个地址。

所以我们对sys_sendto函数进行分析即可,实际上该函数的作用是将数据报发送至指定的目的地址,下面对源码进行分析:

92fe0ee376db88d48aa1583187d20c81.png

003cd4eb67f49f592e37182613144f28.png

6622b9b5a14a9484241fc3b693cdc48b.png

我们发现在sys_sendto函数种最终还是通过调用SYS_SENDMSG函数进行发送数据,所以我们接着对SYS_SENDMSG函数做分析。该函数的主要工作是将用户空间的信息复制到内核空间中,然后再逐级调用发包接口发送数据。具体到源码的解析如下:

3134e95ce0613c9d8d8c9f01ec85e19b.png

779ffeaac1101b37509df2f0f8a13a63.png

2ad18db0b6312d34e59f9b7ff4a6f367.png

241ac69b337cd544185226ae301945f2.png

通过上述源码的分析,我们大致可以画出sendmsg函数的系统调用过程

3d3f886d992863b952383c42f8b40a63.png

调试结果:

50338ce027d47978157d68c0fed7b934.png

五、RECV系统调用分析:

与send过程类似,相当于镜像操作。这里就没必要详细展开了。直接给出调用过程图如下:

794ba039dcb0b557c8b3fb213fa5135a.png

调试结果:

7e831684f87b910fdb82b8fb314428e0.png

五、传输层部分

网际层向传输层方向:

cc4e3bd571a52b7ffe2eaf0e2bde039d.png

各调用函数作用说明:

1.tcp_v4_rcv():充当网络层与传输层的接口,传输层报文处理入口函数

2.__inet_lookup_v4_lookup():在ehash或者bhask中查找传输控制块,若无找到则进行退出, 并通过tcp_v4_send_reset(skb)发送RST段给对方,如果报文被损坏则无法发送rst,直接丢包

3.xfrm4_policy_check():进行安全检查

4.sk_filter():看是否符合过滤器规则

5.tcp_v4_do_rcv():传输层处理TCP段的主入口

6.tcp_rcv_established():当连接已经建立时,用快速路径处理报文

7. tcp_v4_hnd_req():为侦听套口,处理半连接状态的ACK消息

8. tcp_child_process():不是侦听套接字,说明已经建立了半连接。调用此函数初始化子传输控制块,如果失败则向客户端发送rst段,即tcp_v4_send_reset()

调试结果:

a11e5f4aeeb6bec548ca636bec89597a.png

传输层向网际层方向:

大致经历了以下几个步骤:

调用Tcp_sendmsg函数检查链接状态,并同时获取链接的MSS。创建该数据包的 sk_buffer 数据结构实例 skb,从 userspace buffer 中拷贝 packet 的数据到 skb 的 buffer。构造数据包头部,接而计算 TCP 校验和(ack)和顺序号(seq)。最后调用ip_queue_xmit函数将数据包传输到网际层进行处理。

这里主要对Tcp_sendmsg函数的调用逻辑进行补充分析,该函数只要检查已经建立的 TCP connection 的状态,然后获取有效的 MSS,Tcp_sendmsg函数的内部调用顺序如下:

903f785464fce664878adb6dae8487e6.png

各调用函数作用说明:

1.Tcp_sendmsg分析:sendmsg系统调用在TCP层的实现

2.lock_sock():获取套接口的锁

3.sock_sndtimeo()根据标志计算阻塞超时时间

4.sk_stream_wait_connect():对于不能发送信息状态须等待连接正确建立,超时

5.tcp_current_mss():获得有效的MSS

六、网际层:

网际层到传输层方向:

f9c427f901c5301910bb41682b3f22b9.png

各调用函数作用说明:

1.Ip_rcv函数:对IP头部合法性进行严格检查,如数据报文长度、首部长度、是否为共享数据包,然后把具体功能交给ip_rcv_finish

2.ip_rcv_finish函数:如果还未为该数据报查找输入路由缓存,调用ip_route_input为其查找输入的路由缓存,接着处理IP数据报首部中的选项,最后根据输入路由缓存输入到本地或转发。

3.Ip_forward: 数据报转发的接口函数。

4.Ip_forward_finish:完成输入ip数据报的转发

5.Ip_local_deliver:处理输入到本地的IP数据报,将分片进行重组,获得完整数据报,之后调用ip_local_deliver_finish函数进行数据传输。

6.ip_local_deliver_finish:将数据报从网络层传递到传输层。

调试结果:

861362c817aad774b9f346cbd7b66925.png

同时发现了传输层与网络层接口部分·:

5cd2aeb9fb4ddf519bc0b2c3b1a18972.png

网际层到网络访问层方向:

c8365ee0c6f1d91564cbffb7b80a4ddd.png

各调用函数作用说明:

Ip_queue_xmit:将TCP端打包成IP数据报

Dst_output:封装了输出数据报目的路由缓存项中的输出端口(分为两类:单播,组播)

Ip_output: 处理单播数据报,设置数据报的输出网络设备以及网络层协议类型参数。

Ip_finish_output:观察数据报长度是否大于MTU,若大于,则调用ip_fragment分片,否则调用ip_finish_output2输出;

Ip_ finish_output2: 对skb的头部空间进行检查,看是否能够容纳下二层头部,若空间不足,则需要重新申请skb;然后,获取邻居子系统,并通过邻居子系统输出

调试结果:

f5061a88a9685ea1a246eda9b7afb940.png

网络层与传输层的接口部分:

ba0bca0cedb07f36ddf509b22b2ad7ab.png

七、网络访问层:

从网际层接受数据方向:

数据包传输过程:

启用软中断后,调用dev_queue_xmit函数对数据包进行处理,主要处理依据为是否采用了Generic Segmentation Offload技术,是否采用了QoS技术进行处理。对函数dev_queue_xmit的源码分析如下:

17fcd1990cfe0e0e760a6859c03db6d6.png

00702ff347c514801bb06dc54d387459.png

c51926944eb078d30afaebc8c787f54f.png

a156afd648d34ee929e10293facf67dc.png

666cdba9b552782aeb3cea34a208b155.png

从网络接口层向网际层方向:

主要实现函数为softnet_data,前面有同学也提到,但未做出详细分析,所以下面部分就softnet_data结构及其工作原理加以说明补充。该结构实质上描述的是与软中断相关的输入及输出队列。该结构的源码如下:

5fbcddc2d4bfd747184ca4cb1a388b45.png

结构的参数说明:

Throttle:该参数与后面avg_blog、cng_level参数配合使用,实现拥塞管理算法,throttle的值实际为bool值,其含义是,当CPU是超载时,为true,否则为false。

cng_level:用于表示拥塞级别,在处理每一帧时会重新进行计算。

avg_blog:表示的是后面参数input_pkt_queue队列的平均长度

input_pkt_queue:数据包排列形成的队列结构

poll_list:等待处理入帧的双向设备链表。

output_queue:记录了需要发送数据包的设备列表。

completion_queue:记录了已经成功发送可以释放的缓冲区。

backlog_dev:表示与CPU相关的的设备

数据包传输过程:

若采取非NAPI方式,首先会通过硬中断读取数据包。再调用netif_rx函数将收到的数据包添加到input_pkt_queue队列结构中,最后通过产生一个软中断的方式,依次将数据传输到网络层。

若采取NAPI方式,相较于非NAPI方式,可以有效的减少硬中断的数量。首先会将网络设备添加到poll_list结构中,再通过软中断的方式将网络设备中的报文传输到网络层中。

标签:调用,函数,IP,TCP,Linux,传输层,socket

来源: https://www.cnblogs.com/PaddyPan/p/14312038.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vs2019Linux守护,Visual Studio 2019将支援Ninja显着提升Linux专案建置效率

微软更新Visual Studio 2019,新增多个可提升Linux开发体验的功能,包括在Linux上支援建置系统Ninja,以及更完整地支援gdbserver,而且现在开发者也可以使用连接管理器(Connection Manager),编辑和配置预设的远端连接。使…

c语言程序中必不可少的,C语言程序设计(第3章程序控制语句)2

3.2 数据的输入与输出在程序的运行过程中,往往需要由用户输入一些数据,而程序运算所得到的计算结果等又需要输出给用户,由此实现人与计算机之间的交互,所以在程序设计中,输入输出语句是一类必不可少的重要语句&#xf…

android 九宫格封装,Android 九宫格布局

演示image需求满足0-9个图的适配图数量演示1image2image3image4image5image6image7image8image9image使用手动设置android:layout_width"match_parent"android:layout_height"wrap_content"app:ngl_gridSpace"10dp"app:ngl_oneChildHeight"…

android放大镜无广告,Android放大镜的实现代码

快三个月了没写博客了,因为工作调动,很多经验、心得都没有时间记录下来。现在时间稍微充裕了点,我会尽量抽时间将之前想写而没写的东西补上。进入正题。去年某个时候,我偶然看到一篇文章,讲android里面放大镜的实现。文…

鸿蒙和宙斯谁厉害,漫威宇宙宙斯vs奥丁,到底谁更强

宙斯在漫威里,是希腊神话中的众神之王,奥林匹斯十二主神之一,也是奥林匹斯大部分神和神奇女侠戴安娜的父亲,同时也是沙赞的力量来源之一能力:不朽(只有宙斯的血能杀死宙斯)宙斯神力雷霆之怒控制天气宙斯的力量并不是某…

背计算机专业英语词汇,计算机专业英语词汇1500词(五)

201. exit n. & vi. 出口;退出202. report vt. & n. 报告,报表203. execution n. 执行204. backup n. 备份,后备,后援205. version n. 版本206. find v. 寻找,发现207. pointer n. 指针,指示字208.…

优考试在线考试系统计算机,使用优考试在线考试系统解决企业员工考核评比

随着信息时代的高速发展,很多实体传统的东西已经慢慢搬到网络上了,在线考试就是在其中发展的很迅速的一种,企业的员工考核、员工的培训、评比都可以使用企业在线考试系统来解决了,电脑微信小程序手机考试相结合,让考试…

计算机专业申请phd美国,美国计算机专业博士的申请个人陈述范文

美国计算机专业博士的申请个人陈述范文2020-08-24 618人阅读摘要:美国计算机专业博士的申请个人陈述范文美国计算机专业博士申请个人陈述范文共享,公文个人陈述是美国博士申请公文中非常关键的构成部分,针对计划申请办理美国计算机专业博士研究生的同学们…

计算机桌面壁纸怎样拉伸,win10桌面壁纸怎么拉伸?手把手教你拉伸win10桌面壁纸的方法...

现在大家喜欢用自己拍摄的照片做电脑桌面壁纸,设置好win10桌面壁纸后,总感觉壁纸很显大,想要重新拉伸一下。那么win10桌面壁纸如何拉伸?针对此疑问,小编手把手教你拉伸win10桌面壁纸的方法。1、首先来看一下原因&#…

html+dom+深入,DOM 深入学习 - 1

本文章记录本人在深入学习Javascirpt DOM中看书理解到的一些东西,加深记忆和并且整理记录下来,方便之后的复习。DOM 版本w3c 指定的DOM规范包括多个版本,不同的版本(或称知为级别)又包含不同的子规法和模块,不同浏览器对DOM的支持…

计算机应用常用的30个函数,Excel中常用函数的使用

ISSN1009—30“咖船rKno别b内eand伯叻肋叻电奠知识…

cam350怎么看顶层_厉害的人是怎么分析问题的?(实操干货)

“经常做一个方案,几十页PPT还没把问题讲清楚,老板一个问题就貌似发现了关键,这到底是一种怎么样的思维方式?”我在职场这么多年,也遇到过很多次这样的问题。在我初入职场时,经领导点拨后,也产生…

抓球球的机器人应该怎么玩_王者荣耀:在游戏中当自己优势队友劣势的时候应该怎么玩?...

游戏里时常会有这么一种情况出现,我们疯狂Carry,一看战绩十几杠几,C得不行,但是队伍就是要输,颓势总是无法挽回。今天我就给大家说一下,是什么样的原因导致这种情况的发生。队友劣势的原因分析:…

ajax获得excel文件流在前端打开_主流前端技术讲解,面试必考!

Vue.js是Web前端的一个框架,用来快速开发单页面应用。当Vue.js开发变成主流的时候,许多公司的技术团队都打算把下一个新项目换成用Vue.js来开发。但是当我们详细了解Vue.js以后,会发现一个很尴尬的问题,那就是Vue.js的页面是采用客…

计算机无法用telnet,telnet不是内部或外部命令解决办法 Windows10开启Telnet功能方法...

一般情况下,Windows10正式版系统的telnet服务都是处于关闭状态的,需要我们手动开启才可以。telnet服务可以调试端口,其重要性不容小视。今天,就告诉教大家Windows如何配置telnet服务?虽然说今天以Windows10来示例&…

计算机主板另一个名称,主板名称太复杂 看这几点就秒懂了

现在的主板厂商特看重个性化和市场细分,恨不得给每个人定制最适合的主板,所以主板型号多到爆,名称还都特别长,看得人眼晕还看不懂。其实这些名字虽然拉拉杂杂一长串,但都带有很好理解的“关键词”,只要扫一…

亚马逊产品描述计算机语言编辑,亚马逊Listing产品描述编辑讲解

烂人的虚伪我从头看到尾优质答主01-24TA获得超过2782个赞自建listing,就是根据自己的产品,自己打造产品客户端的展示内容,让顾客了解自己的产品,有下单的欲望!建好如果效果不好,还要进行优化,最…

计算机的硬盘 内存在哪查到,电脑硬盘内存怎么查看

电脑硬盘内存怎么查看在我们买电脑的时候我们一般都会选择去看看电脑硬盘内存的大小。那么电脑硬盘内存怎么查看呢?下面就由jy135小编来告诉大家吧,欢迎阅读。方法一、在电脑系统中查看1、这里以 Windows7 系统为例,选中桌面的“计算机”图标&#xff0…

linux messages 时间错乱_BATJ 常考的 21 条 Linux 命令,速度收藏!

来源: http://t.cn/EqTIhES一、文件和目录1. cd命令(它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径)cd /home 进入 / home 目录cd .. 返回上一级目录 cd ../.. 返回上两级目录 …

layui导航栏页面滚动固定_网站建设页面导航如何降低用户寻找的时间

做为正确引导客户体验网站的莱单导航栏,从检索视角上而言,也起着关键的功效,莱单导航栏不但联系网站的外界,也联系着网站主页面及其别的网页,是全部网站的“管理中心”,因此网站建设中莱单导航栏设计方案&a…