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语言函数的调用——比较两个数的大小

**目录**一、先写好框架二、然后定义我们需要的变量三、这里就要写函数的部分四、函数部分写完了,但是还一个地方,要值得注意一、常规方法比较大小二、指针操作比较大小--------------------今天我们要写的是用**调用函数**的方法来 比较两个数字的大小我…

c语言爱心代码空心,c语言心形图案代码,是什么?

#include int main(){int i,j;printf(" ****** ******\n"" ********** **********\n"" ************* *************\n");//前三排的规律性不强 所以直接显示就好了for(i0;i<3;i)//显示中间三排{for(j0;j<29;j)printf(&quo…

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

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

快速排序c语言实现,快速排序的C语言代码实现

快速排序实质上是对“冒泡排序”的一种改进&#xff0c;整个排序过程可概括为&#xff1a;通过N趟的排序将原本的排序数据分为若干块进行分块排序&#xff0c;而在每趟排序过程中&#xff0c;以指定的关键字将待排数据分别分为比关键字大的部分和比关键字小的部分&#xff0c;反…

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应用中Back键的监听及处理实例

MainActivity如下:复制代码 代码如下:package cn.testnbackpressed;import android.os.Bundle;import android.view.KeyEvent;import android.app.Activity;/*** Demo描述:* 处理Back键按下事件** 注意事项:* 以下两种方法勿一起使用*/public class MainActivity extends Activ…

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

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

android获取3g或wifi流量信息,Android代碼----android獲取3G或wifi流量信息

Android代碼----android獲取3G或wifi流量信息日期&#xff1a;2017/2/23 18:01:39 &nbsp 編輯&#xff1a;關於Android編程android獲取3G或wifi流量信息&#xff1a;[java]IBatteryStats battryStats IBatteryStats.Stub.asInterface(ServiceManager.getService("…

如何在android进行ltp测试,Android系统完整性度量架构IMA-EVM

错误2&#xff1a;/bin/bash:m4: command not found解决 &#xff1a;sudo apt-get install m4错误3&#xff1a;prebuilts/misc/linux-x86/bison/bison:No such file or directory原因 &#xff1a;ubuntu64位系统运行32位程序的问题&#xff0c;需要安装运行32位程序的兼容…

android 如何 root权限获取,如何获取android手机root权限获取

安卓手机的卡与不卡&#xff0c;和是否root无关。安卓的卡&#xff0c;是其开发时就注定的&#xff0c;其原因如下&#xff1a;1.内存小/少手机内存在手机出厂的时候就已经固定了&#xff0c;其总量无法调整&#xff0c;不能像电脑一样加内存条。所以想提升可用内存&#xff0c…

日语输入法 android8.0,讯飞输入法发布 AndroidV8.0.6855 专注提升输入效率

作为最懂用户的讯飞输入法&#xff0c;近日发布全新 Android V8.0.6855 版本&#xff0c;坚持以用户体验为基础&#xff0c;不断优化产品性能&#xff0c;提升用户体验。本次新版更加专注于输入效率&#xff0c;带来了 BiuBiu 键盘、离线语音等多个输入功能的提升。BiuBiu 键盘…

imx6 android快速启动,freescale imx6 开机启动速度优化之Bootchart工具的使用问题

之前有安装bootchart&#xff0c;先执行以下命令&#xff0c;卸载掉bootchart工具sudo apt-get autoremove bootchartbootchart安装1、安装$sudo apt-get install bootchart$sudo apt-get install pybootchartgui2、编写android 上log文件的打包和自动生成bootchart.png的脚本文…

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

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

html 输入框 相加,JS中,如何实现两个输入框中内容的数字相加?

事件function count(){var adocument.getElementById("txt1").value;var bdocument.getElementById("txt2").value;var fdocument.getElementById("select").value;switch(f){case :document.getElementById("fruit").valueab;break;c…

多层html怎么找到密码输入框,Vant PasswordInput 密码输入框

介绍带网格的输入框组件&#xff0c;可以用于输入支付密码、短信验证码等&#xff0c;通常与数字键盘组件配合使用引入import Vue from vue;import { PasswordInput, NumberKeyboard } from vant;Vue.use(PasswordInput);Vue.use(NumberKeyboard);代码演示基础用法:value"…

2021曾都二中高考成绩查询入口,2021高考-随州设4个考区11个考点·

今起距2021年高考还有9天学子们也将进入最后的冲刺时间距离高考还有9天近日随州日报记者从市招生考试委员会获悉2021年随州市普通高考考试报名人数14010人共设四个考区11个考点组织考试随州2021年普通高考报名人数14010人&#xff0c;其中市直5639人&#xff0c;随县1632人&…

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

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

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

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

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

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