tcp_v4_connect函数的解析
源码:
int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
{// 解析输入的地址结构struct sockaddr_in *usin = (struct sockaddr_in *)uaddr;// 获取 TCP 协议栈的全局 death_row 对象struct inet_timewait_death_row *tcp_death_row;// 获取输入的套接字的 inet_sock 和 tcp_sock 结构struct inet_sock *inet = inet_sk(sk);struct tcp_sock *tp = tcp_sk(sk);// 获取输入套接字的 IP 选项struct ip_options_rcu *inet_opt;// 获取套接字的网络命名空间struct net *net = sock_net(sk);__be16 orig_sport, orig_dport;__be32 daddr, nexthop;struct flowi4 *fl4;struct rtable *rt;int err;// 检查地址的有效性if (addr_len < sizeof(struct sockaddr_in))return -EINVAL;if (usin->sin_family != AF_INET)return -EAFNOSUPPORT;// 获取目标地址和下一跳地址nexthop = daddr = usin->sin_addr.s_addr;inet_opt = rcu_dereference_protected(inet->inet_opt,lockdep_sock_is_held(sk));if (inet_opt && inet_opt->opt.srr) {if (!daddr)return -EINVAL;nexthop = inet_opt->opt.faddr;}// 保存原始的源端口号和目的端口号orig_sport = inet->inet_sport;orig_dport = usin->sin_port;// 获取并设置用于连接的路由fl4 = &inet->cork.fl.u.ip4;rt = ip_route_connect(fl4, nexthop, inet->inet_saddr,sk->sk_bound_dev_if, IPPROTO_TCP, orig_sport,orig_dport, sk);// 检查路由连接的结果if (IS_ERR(rt)) {err = PTR_ERR(rt);if (err == -ENETUNREACH)IP_INC_STATS(net, IPSTATS_MIB_OUTNOROUTES);return err;}// 检查路由是否指向多播或广播地址if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) {ip_rt_put(rt);return -ENETUNREACH;}// 更新目标地址为路由的目标地址if (!inet_opt || !inet_opt->opt.srr)daddr = fl4->daddr;// 获取 TCP 协议栈的 death_row 对象tcp_death_row = &sock_net(sk)->ipv4.tcp_death_row;// 更新源 IP 地址if (!inet->inet_saddr) {err = inet_bhash2_update_saddr(sk, &fl4->saddr, AF_INET);if (err) {ip_rt_put(rt);return err;}} else {sk_rcv_saddr_set(sk, inet->inet_saddr);}// 重置 TCP 相关的状态if (tp->rx_opt.ts_recent_stamp && inet->inet_daddr != daddr) {tp->rx_opt.ts_recent = 0;tp->rx_opt.ts_recent_stamp = 0;if (likely(!tp->repair))WRITE_ONCE(tp->write_seq, 0);}// 设置目的端口号和目标地址inet->inet_dport = usin->sin_port;sk_daddr_set(sk, daddr);// 设置扩展头长度inet_csk(sk)->icsk_ext_hdr_len = 0;if (inet_opt)inet_csk(sk)->icsk_ext_hdr_len = inet_opt->opt.optlen;// 设置最大报文段长度tp->rx_opt.mss_clamp = TCP_MSS_DEFAULT;// 设置套接字的状态为 SYN-SENT,并将其插入哈希表tcp_set_state(sk, TCP_SYN_SENT);err = inet_hash_connect(tcp_death_row, sk);if (err)goto failure;// 设置套接字的转发散列值sk_set_txhash(sk);// 设置新的端口并更新路由表rt = ip_route_newports(fl4, rt, orig_sport, orig_dport,inet->inet_sport, inet->inet_dport, sk);// 检查路由表更新的结果if (IS_ERR(rt)) {err = PTR_ERR(rt);rt = NULL;goto failure;}// 设置套接字的 GSO 类型并设置能力sk->sk_gso_type = SKB_GSO_TCPV4;sk_setup_caps(sk, &rt->dst);rt = NULL;// 设置初始化的 TCP 序列号和时间戳if (likely(!tp->repair)) {if (!tp->write_seq)WRITE_ONCE(tp->write_seq,secure_tcp_seq(inet->inet_saddr,inet->inet_daddr,inet->inet_sport,usin->sin_port));tp->tsoffset = secure_tcp_ts_off(net, inet->inet_saddr,inet->inet_daddr);}// 为套接字分配一个随机的标识符inet->inet_id = get_random_u16();// 如果启用了 TCP 快速打开,进行相应处理if (tcp_fastopen_defer_connect(sk, &err))return err;if (err)goto failure;// 发送 TCP 连接请求err = tcp_connect(sk);if (err)goto failure;return 0;failure:// 失败时处理的操作tcp_set_state(sk, TCP_CLOSE);inet_bhash2_reset_saddr(sk);ip_rt_put(rt);sk->sk_route_caps = 0;inet->inet_dport = 0;return err;
}EXPORT_SYMBOL(tcp_v4_connect);
tcp_v4_connect() 函数是在 Linux 内核中的 net/ipv4/tcp_ipv4.c 文件中定义的。它用于在 IPv4 网络上建立 TCP 连接。
该函数接受一个 TCP 套接字(sock)、目标地址(uaddr)和地址长度(addr_len)作为参数。
函数的主要功能包括解析地址、配置路由、设置套接字状态、分配序列号、设置时间戳、发送连接请求等步骤,最终返回连接的结果。
问题1:TCP 协议栈的 death_row 对象是什么?
TCP 协议栈的 death_row 对象是一个全局的数据结构,用于管理网络连接的生命周期。它的主要作用是处理关闭的连接,并在适当的时间回收连接资源。
在 TCP 协议中,当一条连接结束时(如连接被关闭或出现错误),该连接不会立即被释放,而是被放置在 death_row 中。death_row 在一段时间后会检查这些连接,并判断是否可以安全地回收它们。这段时间通常称为 “TIME_WAIT” 状态的时间。
在 TIME_WAIT 状态下,TCP 协议栈会保留连接的信息,以便处理网络中可能延迟到达的重复数据包。这样可以确保在网络中的所有数据包都被正确处理,从而保证可靠的连接关闭。
death_row 对象负责管理 TIME_WAIT 状态的连接。它维护了一个定时器,定期检查连接是否可以被回收。当连接经过一定时间后,death_row 将安全地释放这些连接占用的资源,以便可以重用这些资源来建立新的连接。
总的来说**,TCP 协议栈的 death_row 对象是用于管理关闭的 TCP 连接,并实现连接的安全释放和资源回收。**
问题2:struct flowi4在哪定义的?
struct flowi4
结构体是在 Linux 内核的头文件 include/net/flow.h
中定义的。该头文件是网络子系统中的一个重要头文件,包含了与网络流量处理相关的结构体和函数的声明。
下面是 struct flowi4
结构体的定义:
struct flowi4 {__aligned_u32 daddr; /* Destination address */__aligned_u32 saddr; /* Source address */__aligned_u16 flowi4_oif; /* Output interface index */__aligned_u8 flowi4_tos; /* TOS / traffic class */
#define FLOWI4_TOS_MASK 0x1E
#define FLOWI4_TOS_SHIFT 1__aligned_u8 flowi4_scope; /* Scope */
#define FLOWI4_SCOPE_MASK 0x0F
#define FLOWI4_SCOPE_SHIFT 0__aligned_u32 flowi4_proto; /* Protocol */__aligned_u8 flowi4_flags; /* Flags */__aligned_u8 flowi4_secid; /* SELinux security ID */
};
struct flowi4
结构体用于表示 IPv4 流量的路由查找信息。它的成员变量包括目标地址(daddr)、源地址(saddr)、输出接口索引(flowi4_oif)、TOS/流量类别(flowi4_tos)、作用域(flowi4_scope)、协议(flowi4_proto)、标志(flowi4_flags)和 SELinux 安全标识符(flowi4_secid)等。
该结构体提供了描述和标识 IPv4 流量路由的必要信息,用于在网络栈中进行路由查找和转发决策。
问题3:sk_daddr_set是什么?inet_csk是什么?在哪里定义的?
sk_daddr_set()
是 Linux 内核中的一个函数,用于设置套接字(socket)的目标地址(destination address)。它在文件 net/core/sock.c
中定义。
sk_daddr_set()
函数的定义如下:
static inline void sk_daddr_set(struct sock *sk, __be32 daddr)
{sk->__sk_common.skc_daddr = daddr;
}
sk_daddr_set()
函数通过修改套接字的 skc_daddr
成员变量来设置目标地址。这个成员变量保存了套接字关联的目标 IP 地址。
inet_csk
是一个宏,用于获取 TCP 套接字(struct sock)中 inet 控制块(struct inet_connection_sock)的指针。它定义在 include/net/inet_connection_sock.h
中。
下面是 inet_csk
宏的定义:
#define inet_csk(sk) ((struct inet_connection_sock *)(sk)->sk_prot->data)
通过这个宏,可以方便地访问和操作与 TCP 连接相关的状态和参数,例如 TCP 的扩展头长度、SACK(Selective Acknowledgment)选项等。
相关文章:
tcp_v4_connect函数的解析
源码: int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) {// 解析输入的地址结构struct sockaddr_in *usin (struct sockaddr_in *)uaddr;// 获取 TCP 协议栈的全局 death_row 对象struct inet_timewait_death_row *tcp_death_row;// …...
go-channel
设计原理 Go 提及的设计模式就是:不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存。 共享内存方式:多个协程共享同一块内存,但是多个协程中读写变量是操作同一块内存,会产生多线程问题的并发问题&am…...
K8s操作命令
生命周期管理 1. 创建 1. 创建资源 kubectl run 创建并运行一个或多个容器镜像。*创建一个deployment或job来管理容器*。 语法:kubectl run NAME --imageimage [–env“keyvalue”] [–portport] [–replicasreplicas] [–dry-runbool] [–overridesinline-jso…...
【MySQL】 MySQL数据库基础
文章目录 🐱👓数据库的操作📌显示当前的数据库📌创建数据库🎈语法:🎈语法说明🎈示例: 🌴使用数据库🎋删除数据库🐱🏍语…...
vscode 下载安装
vscode 下载安装常用插件 vscode 官网: https://code.visualstudio.com/ 点击右上角 Download 进入下载选择页面 选择自己使用操作对应 CPU 架构 下载 本文使用 x86 架构 64位 windows 系统为例 跳转下载页面 自动 开始下载 下载不开始?试试这个直…...
springboot对接postgres
安装postgres 注意:下述链接方式会自动创建数据库steven_russell,若需要创建其他数据库,可以手动执行命令创建数据库 docker run --name postgres \ -p 5432:5432 \ -e POSTGRES_USERsteven_russell \ -e POSTGRES_PASSWORD123456 \ -itd --privilegedtrue postgre…...
[python 刷题] 242 Valid Anagram
[python 刷题] 242 Valid Anagram 题目: Given two strings s and t, return true if t is an anagram of s, and false otherwise. An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the o…...
算法通过村第七关-树(递归/二叉树遍历)青铜笔记|手撕递归
文章目录 前言1. 递归的特征2. 如何写出好的递归3. 怎么看懂递归的代码总结 前言 提示:我们生活在24小时不眠不休的社会里但是没有24小时不眠不休的身体有些东西必须舍弃 -- 马特海格 这一关,我看要谈论的是递归问题,说到它就牵扯到很多问题了…...
#循循渐进学51单片机#点亮你的LED#not.2
1、深刻理解电容的意义,并且在今后的电路学习过程中要多多注意参考别人电路中去耦电路的处理方法,积累经验。 1)电容缓冲电压,抗电磁干扰; 2)低频率电容,一般用的最多的是钽电容,电…...
基于Java+SpringBoot+Vue+uniapp点餐小程序(亮点:协同过滤算法、会员系统,购物车结算、在线聊天)
校园点餐小程序 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序(小蔡coding)2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 系统功能结构设计4.2 主要功能描述 五…...
深度学习-全连接神经网络-详解梯度下降从BGD到ADAM - [北邮鲁鹏]
文章目录 参考文章及视频导言梯度下降的原理、过程一、什么是梯度下降?二、梯度下降的运行过程 批量梯度下降法(BGD)随机梯度下降法(SGD)小批量梯度下降法(MBGD)梯度算法的改进梯度下降算法存在的问题动量法(Momentum)目标改进思想为什么有效动量法还有什么效果&…...
数据结构--二叉排序树
目录 二叉排序树的定义 二叉排序树的查找 二叉排序树的插入 二叉排序树的构造 二叉排序树的删除 查找效率分析 回顾 二叉排序树的定义 二叉排序树的查找 查找成功的情况 查找失败的情况 二叉排序树的插入 注意 (1)二叉排序树不允许出现重复的值…...
Python | 根据子列表中的第二个元素对列表进行排序
在本文中,我们将学习如何根据主列表中存在的子列表的第二个元素对任何列表进行排序。 比如 Input : [[‘rishav’, 10], [‘akash’, 5], [‘ram’, 20], [‘gaurav’, 15]] Output : [[‘akash’, 5], [‘rishav’, 10], [‘gaurav’, 15], [‘ram’, 20]] Input …...
qsort函数详细讲解以及利用冒泡排序模拟实现qsort函数
个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.qsort函数 1.1qsort函数的参数 …...
C++QT day6
1> 将之前定义的栈类和队列类都实现成模板类 栈: #include <iostream> #define MAX 128 using namespace std; template<typename T> class Stack_s { private:T *pnew T[MAX];//栈的数组int top;//记录栈顶的变量 public://构造函数Stack_s(int t…...
List与ArrayList
目录 一、List及其使用 1.1 List的概念 1.2 常见接口的介绍 1.3 List的使用 二、线性表和顺序表 2.1 线性表 2.2 顺序表 三、ArrayList介绍 四、ArrayList的使用 4.1 ArrayList构造 4.2 ArrayList的常用方法 4.3 ArrayList的遍历 4.4 ArrayList的扩容机制 五、ArrayList的具…...
【C++】特殊类的设计
文章目录 1. 设计一个类, 不能被拷贝2. 设计一个类, 不能被继承3. 设计一个类, 只能在堆上创建对象3. 设计一个类, 只能在栈上创建对象4. 创建一个类, 只能创建一个对象(单例模式)饿汉模式懒汉模式 1. 设计一个类, 不能被拷贝 💕 C98方式: 在C11之前&a…...
机器学习:PCA(Principal Component Analysis主成分)降维
参考:PCA降维原理 操作步骤与优缺点_TranSad的博客-CSDN博客 PCA降维算法_偶尔努力翻身的咸鱼的博客-CSDN博客 需要提前了解的数学知识: 一、PCA的主要思想 PCA,即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想…...
linux服务器slab缓存回收方案设计
背景 自己写的回收slab内存ko,insmod报错“shrink_slab:unknown symbol _x86_indirect_thunk_rax(err 0)””; 分析 1.名词解释 在 x86 架构中,函数调用通常使用 call 指令来直接跳转到目标函数的地址。但是,当需要通过函数指针或动态链接调用函数时,就需要使用__x86_…...
Apache Spark 的基本概念
Apache Spark 是一种快速、可扩展、通用的数据处理引擎。它是一种基于内存的计算框架,支持分布式数据处理、机器学习、图形计算等多种计算任务。与传统的 Hadoop MapReduce 相比,Spark 具有更高的性能和更广泛的应用场景。 Spark 中的基本概念包括&…...
通讯协议介绍CoAP 协议解析
目录 1 通讯协议 2 TCP/IP 网络模型 2.1 TCP协议 2.1.1 TCP 连接过程 2.1.2 TCP 断开连接 2.1.3 TCP协议特点 2.2 UDP协议 2.2.1 UDP 协议特点 3 应用层协议简介 3.1 HTTP 协议 3.2 CoAP 协议 3.3 MQTT 协议 4 CoAP 协议详解 4.1 REST 风格 4.2 CoAP 首部分析 4…...
React 开发一个移动端项目(2)
配置基础路由 目标:配置登录页面的路由并显示在页面中 步骤: 安装路由: yarn add react-router-dom5.3.0 5 和 6 两个版本对组件类型的兼容性和函数组件支持有所改变,在这里使用的是 5。 和路由的类型声明文件 yarn add types…...
51单片机 点阵矩阵 坤坤代码
真正的黑子 #include <REGX52.H>void Delay(unsigned int xms); void _74HC595_WriteByte(unsigned char byte); void LED(unsigned char Y,DATA); void LED_Init();sbit RCKP3^5; //RCLK sbit SCKP3^6; //SRCL sbit SERP3^4; //SER //坤坤矩阵 unsigned char code D…...
Android13-图片视频选择器
在compileSDK 33 时,谷歌在安卓新增了 图片选择器 功能,支持单选、多选、选图片、视频等操作,并且不需要额外获取照片/音频权限。 具体实现如下: 1:请求 Log.d(TAG, "Build.VERSION.SDK_INT" Build.VERS…...
【问题处理】GIT合并解决冲突后,导致其他人代码遗失的排查
GIT合并解决冲突后,导致其他人代码遗失的排查 项目场景问题描述分析与处理:1. 警告分析2. 文件分析3. 问题关键4. 验证 解决策略总结 📕作者简介:战斧,从事金融IT行业,有着多年一线开发、架构经验ÿ…...
H264视频压缩格式
H264简介 H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准里称为H.264, 在MPEG的标准里是MPEG-4的一个组成部分-MPEG-4 Part 10,又叫Advanced Video Codec,因此常常称为MPEG-4AVC或直接叫AVC。 压缩算…...
动态的中秋爱心演示送女友用python生成爱心软件文末附c++语言写法
用python生成爱心软件 用python生成动态爱心软件 目录 用python生成爱心软件 完整代码 代码解释 逐句解释 效果展示: 如何打包 c写法 完整代码 import turtledef draw_heart():love turtle.Turtle()love.getscreen().bgcolor("black")love.…...
macOS - 使用VLC
文章目录 关于 VLC安装查看帮助流媒体 MRL 语法:URL 语法:主程序 (core)音频视频截图:窗口属性: 子画面屏幕显示(OSD):字幕:覆盖:轨道设置:播放控制:默认设备:高级: 输入播放列表性能选项: 热键跳跃大小: 关于 VLC VLC media player VLC 是一款自由、开…...
java微服务项目整合skywalking链路追踪框架
skywalking官网网址:Apache SkyWalking 目录 1、安装skywalking 2、微服务接入skywalking 3、skywalking数据持久化 1、安装skywalking 下载skywalking,本篇文章使用的skywalking版本是8.5.0 Index of /dist/skywalkinghttps://archive.apache.org/…...
pandas 笔记: interpolate
一个用于填充 NaN 值的工具 1 基本用法 DataFrame.interpolate(methodlinear, *, axis0, limitNone, inplaceFalse, limit_directionNone, limit_areaNone, downcast_NoDefault.no_default, **kwargs) 2 主要参数 method 多种插值技术 linear: 默认值,使用线性插…...
云网站7china/营销活动推广策划
前言 面试大概九十分钟,问的东西很全面,需要做充足准备,就是除了概念以外问的有点懵逼了。回来之后把这些题目做了一个分类并整理出答案(强迫症的我~狂补知识)分为MySQLJavaRedis算法网络Linux等六类,接下…...
广州网站建设费/郑州seo排名优化
为什么80%的码农都做不了架构师?>>> 在上一篇文章《》中,我们详细说明了一下如何创建一个可以使用增删改操作的jqGrid。 但是在实际的修改、新增保存中,会看到如下的错误提示:error Status:"OK".Error code…...
顶级复刻手表网站/推蛙网络
转载于:https://www.cnblogs.com/viplued/p/7765149.html...
网站开发php工程师/线上营销策略有哪些
CREATE procedure News_Class --资讯新闻百万级分页 ( StrWhere varchar(100),--条件 PageSize int, --页面大小 PageIndex int --页面索引 ) AS declare strSQL varchar(2000) -- 主语句 declare strCountSQL varchar(2000) -- 总记录主语句 declare strTmp varchar(1000) -- …...
广西网站/2022真实新闻作文400字
前些天,测试人员向我反映有一家企业的通讯录同步接口不返回数据,我查日志nginx的相应access.log状态码是499,请求超时,从网上查找资料分析有两种可能:1.客户端主动断开连接2.服务端响应超时造成客户端连接中断问了客户…...
做ppt的网站/网络营销的基本特征
简介:本文将介绍Solidity语言的调用数据的布局和ABI详解。其中调用数据的布局将主要介绍以太坊合约间调用时的消息格式ABI。 好久时间没有更新文章,前文中我们介绍了Solidity的特性与内部机制,本文我们将Solidity的调用数据的布局和ABI详解。…...