linux工作在传输层,linux net子系统-协议层(传输层与网络层)
传输层
struct proto
struct tcp_prot位于文件net/ipv4/tcp_ipv4.c
struct proto tcp_prot = {
.name = "TCP",
.owner = THIS_MODULE,
.close = tcp_close,
.connect = tcp_v4_connect,
.disconnect = tcp_disconnect,
.accept = inet_csk_accept,
.ioctl = tcp_ioctl,
.init = tcp_v4_init_sock,
.destroy = tcp_v4_destroy_sock,
.shutdown = tcp_shutdown,
.setsockopt = tcp_setsockopt,
.getsockopt = tcp_getsockopt,
.recvmsg = tcp_recvmsg,
.sendmsg = tcp_sendmsg,
.sendpage = tcp_sendpage,
...
};
tcp_sendmsg
tcp_sendmsg
//向队列尾添加一个struct sk_buff *skb
struct sk_buff *skb = tcp_write_queue_tail(sk);
//并使用sk中的数据初始化这个skb
skb_add_data_nocache(sk, skb, from, copy);
tcp_init_xmit_timers
inet_csk_init_xmit_timers(sk, &tcp_write_timer...) => tcp_write_timer
tcp_write_timer_handler(sk)
tcp_retransmit_timer(sk)
//从队列尾取出一块skb进行传输
tcp_retransmit_skb(sk, tcp_write_queue_head(sk))
__tcp_retransmit_skb(sk, skb)
tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC)
struct inet_connection_sock *icsk = inet_csk(sk);
icsk->icsk_af_ops->queue_xmit(skb, ...)
网络层
struct inet_connection_sock_af_ops
tcp_sendmsg最终调用了结构体icsk_af_ops中queue_xmit来传输队列中的skb,结构体icsk_af_ops是这么来的:
const struct inet_connection_sock_af_ops ipv4_specific = {
.queue_xmit = ip_queue_xmit,
.send_check = tcp_v4_send_check,
.rebuild_header = inet_sk_rebuild_header,
.sk_rx_dst_set = inet_sk_rx_dst_set,
.conn_request = tcp_v4_conn_request,
.syn_recv_sock = tcp_v4_syn_recv_sock,
.net_header_len = sizeof(struct iphdr),
.setsockopt = ip_setsockopt,
.getsockopt = ip_getsockopt,
.addr2sockaddr = inet_csk_addr2sockaddr,
.sockaddr_len = sizeof(struct sockaddr_in),
.bind_conflict = inet_csk_bind_conflict,
};
tcp_v4_init_sock(struct sock *sk)
struct inet_connection_sock *icsk = inet_csk(sk);
icsk->icsk_af_ops = &ipv4_specific;
ip_queue_xmit
//dst.output赋值
tcp_v4_conn_request
inet_csk_route_req
ip_route_output_flow
__ip_route_output_key
__mkroute_output
rth->dst.output = ip_output
//使用dsp.output=ip_out来发送数据
ip_queue_xmit
ip_local_out(skb)
dst_output(skb)
skb_dst(skb)->output(skb) == ip_out
ip_finish_output
ip_fragment(skb, ip_finish_output2)
ip_finish_output2(skb)
dst_neigh_output
neigh_hh_output
dev_queue_xmit(skb)
linux工作在传输层,linux net子系统-协议层(传输层与网络层)相关推荐
- Linux工作笔记037---Centos下Linux创建用户_用户组_删除用户
JAVA技术交流QQ群:170933152 这里主要是生成环境的机器中病毒了,病毒会自动创建一个免密登录的账户,所以才查了查,这个... 唉,平时用内网,后来用云服务器,云服务器,有些厂商是提供安全框 ...
- C++|Linux工作笔记-C++获取Linux中shell命令结果
目录 基本概念 代码与实例 基本概念 这里首先介绍一条Linux函数: ps -ef | awk '{print $2,$8,$9,$10}' 这个可以当前Linux系统运行的进程 另外一个知识点: ...
- Linux工作笔记038---Centos下Linux下解决root用户Operation not permitted
JAVA技术交流QQ群:170933152 Linux中的一些病毒,经常会修改,文件的权限为特殊权限,就连root用户也动不了这个 在文件,所以这个命令需要记一下 ----------------- ...
- linux abs函数怎么用,Linux输入子系统详解
原标题:Linux输入子系统详解 纯手工打造每一篇开源资讯与技术干货,数十万程序员和Linuxer已经关注. 导读 linux输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如 ...
- Linux输入事件类型EV_SW,Linux的input输入子系统:总体框架
一.input输入子系统总体框架 Linux输入子系统将输入驱动抽象为三层:设备驱动层.核心层.事件处理层. 设备驱动层:将底层的硬件输入事件转化为统一事件形式,向输入核心(Input Core)汇报 ...
- 完全用GNU/Linux工作(一)
完全用GNU/Linux工作 完全用GNU/Linux工作 我相信这是一篇好文章所以我想大家都应该看看并且它应该被推荐 <完全用GNU/Linux工作>-- 转贴自 http://www. ...
- Linux时间子系统之高分辨率定时器层(HR Timer)
在前面介绍定时器层的文章中我们已经知道了在Linux内核中已经存在了一个管理定时器的通用框架.不过它也有很多不足,最大的问题是其精度不是很高.哪怕底层的定时事件设备精度再高,定时器层的分辨率只能达到T ...
- Linux时间子系统之Tick广播层(Tick Broadcast)
在分析Tick模拟层的时候曾经提到过,当系统中没有别的进程需要处理的时候,会将当前CPU切换到NO_HZ状态,不会每一个Tick都收到定时中断,从而达到节电的目的.但此时,当前CPU上的定时事件设备还 ...
- Linux时间子系统之Tick模拟层(Tick Sched)
在分析高分辨率定时器的时候曾经提到过,一旦切换到高精度模式后,原来的Tick层就失去作用了,高分辨率定时器层将"接管"对底层定时事件设备的控制.这时,也就意味着,系统中原有的Tic ...
- Linux运维系列总结-Linux系统启动过程、WEB工作原理、DHCP工作原理、DNS解析原理、NFS网络文件系统、FTP文件传输协议、PXE+KICKSTART自动安装系统
Linux运维系列总结-Linux系统启动过程.WEB工作原理.DHCP工作原理.DNS解析原理.NFS网络文件系统.FTP文件传输协议.PXE+KICKSTART自动安装系统 1.Linux系统的启 ...
最新文章
- 父类的析构函数定义为虚函数
- saiku添加mysql数据源_Saiku连接mysql数据库(二)
- Unity Pixel 人物设计(1)
- Zabbix触发器配置指定生效星期监控CPU使用率
- Eclipse发布Web项目
- HTML:canvas画圆形加矩形组合
- 不学点《近世代数》怎么学好现代密码学
- 铁威马NAS使用docker安装全网音乐教程
- 如何批量将图片转换为 Word 文档
- coldwallet java eth,使用Web3j(JAVA)开发ETH钱包-2
- 超全Python图像处理讲解(多图预警)
- SQL 向上取整、向下取整、四舍五入取整的实例!round、rounddown、roundup
- 展示一下基于flask框架的网页播放器的代码
- python根据视频帧按秒从视频中提取图片
- 蓝海创意云丨产品日志:安捷秀(Agileshot)4.0 版本全新上线
- 串口控制语音模块XY-V17B
- iOS获取设备信息和获取当前屏幕状态
- 报数游戏(约瑟夫环问题)
- sqlserver服务器主体 “Jack-PC/Jack“ 无法在当前安全上下文下访问数据库 “model“。 (Microsoft SQL Server,错误: 916)
- 阿里云rds for mysql 大表添加字段复制到自建备库报错,解决过程
热门文章
- 网络四.通过接入网进入互联网内部
- android换台电脑打包签名,Android 使用Android Studio + Gradle 或 命令行 进行apk签名打包 -电脑资料...
- 多行文字cad提取数据_CAD中使用多行文字标尺的技巧
- tp5 日期范围查询_tp5(thinkPHP5框架)时间查询操作实例分析,tp5thinkphp5
- leetcode_650. 2 Keys Keyboard_dp
- 将光盘中的cda保存到电脑中
- 变量与常量的本质区别,以及由此引出的深入思考(纯文字解释,不附图,图像自己在大脑中构建)
- 简单介绍以下金山重装高手的缺点
- 高数第十二章 级数12.1 常数项级数
- SpringMVC基础---案例:web提交学生信息数据到数据库