传输层

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子系统-协议层(传输层与网络层)相关推荐

  1. Linux工作笔记037---Centos下Linux创建用户_用户组_删除用户

    JAVA技术交流QQ群:170933152 这里主要是生成环境的机器中病毒了,病毒会自动创建一个免密登录的账户,所以才查了查,这个... 唉,平时用内网,后来用云服务器,云服务器,有些厂商是提供安全框 ...

  2. C++|Linux工作笔记-C++获取Linux中shell命令结果

    目录 基本概念 代码与实例 基本概念 这里首先介绍一条Linux函数: ps -ef | awk '{print $2,$8,$9,$10}' 这个可以当前Linux系统运行的进程 另外一个知识点: ...

  3. Linux工作笔记038---Centos下Linux下解决root用户Operation not permitted

    JAVA技术交流QQ群:170933152 Linux中的一些病毒,经常会修改,文件的权限为特殊权限,就连root用户也动不了这个  在文件,所以这个命令需要记一下 ----------------- ...

  4. linux abs函数怎么用,Linux输入子系统详解

    原标题:Linux输入子系统详解 纯手工打造每一篇开源资讯与技术干货,数十万程序员和Linuxer已经关注. 导读 linux输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如 ...

  5. Linux输入事件类型EV_SW,Linux的input输入子系统:总体框架

    一.input输入子系统总体框架 Linux输入子系统将输入驱动抽象为三层:设备驱动层.核心层.事件处理层. 设备驱动层:将底层的硬件输入事件转化为统一事件形式,向输入核心(Input Core)汇报 ...

  6. 完全用GNU/Linux工作(一)

    完全用GNU/Linux工作 完全用GNU/Linux工作 我相信这是一篇好文章所以我想大家都应该看看并且它应该被推荐 <完全用GNU/Linux工作>-- 转贴自 http://www. ...

  7. Linux时间子系统之高分辨率定时器层(HR Timer)

    在前面介绍定时器层的文章中我们已经知道了在Linux内核中已经存在了一个管理定时器的通用框架.不过它也有很多不足,最大的问题是其精度不是很高.哪怕底层的定时事件设备精度再高,定时器层的分辨率只能达到T ...

  8. Linux时间子系统之Tick广播层(Tick Broadcast)

    在分析Tick模拟层的时候曾经提到过,当系统中没有别的进程需要处理的时候,会将当前CPU切换到NO_HZ状态,不会每一个Tick都收到定时中断,从而达到节电的目的.但此时,当前CPU上的定时事件设备还 ...

  9. Linux时间子系统之Tick模拟层(Tick Sched)

    在分析高分辨率定时器的时候曾经提到过,一旦切换到高精度模式后,原来的Tick层就失去作用了,高分辨率定时器层将"接管"对底层定时事件设备的控制.这时,也就意味着,系统中原有的Tic ...

  10. Linux运维系列总结-Linux系统启动过程、WEB工作原理、DHCP工作原理、DNS解析原理、NFS网络文件系统、FTP文件传输协议、PXE+KICKSTART自动安装系统

    Linux运维系列总结-Linux系统启动过程.WEB工作原理.DHCP工作原理.DNS解析原理.NFS网络文件系统.FTP文件传输协议.PXE+KICKSTART自动安装系统 1.Linux系统的启 ...

最新文章

  1. 父类的析构函数定义为虚函数
  2. saiku添加mysql数据源_Saiku连接mysql数据库(二)
  3. Unity Pixel 人物设计(1)
  4. Zabbix触发器配置指定生效星期监控CPU使用率
  5. Eclipse发布Web项目
  6. HTML:canvas画圆形加矩形组合
  7. 不学点《近世代数》怎么学好现代密码学
  8. 铁威马NAS使用docker安装全网音乐教程
  9. 如何批量将图片转换为 Word 文档
  10. coldwallet java eth,使用Web3j(JAVA)开发ETH钱包-2
  11. 超全Python图像处理讲解(多图预警)
  12. SQL 向上取整、向下取整、四舍五入取整的实例!round、rounddown、roundup
  13. 展示一下基于flask框架的网页播放器的代码
  14. python根据视频帧按秒从视频中提取图片
  15. 蓝海创意云丨产品日志:安捷秀(Agileshot)4.0 版本全新上线
  16. 串口控制语音模块XY-V17B
  17. iOS获取设备信息和获取当前屏幕状态
  18. 报数游戏(约瑟夫环问题)
  19. sqlserver服务器主体 “Jack-PC/Jack“ 无法在当前安全上下文下访问数据库 “model“。 (Microsoft SQL Server,错误: 916)
  20. 阿里云rds for mysql 大表添加字段复制到自建备库报错,解决过程

热门文章

  1. 网络四.通过接入网进入互联网内部
  2. android换台电脑打包签名,Android 使用Android Studio + Gradle 或 命令行 进行apk签名打包 -电脑资料...
  3. 多行文字cad提取数据_CAD中使用多行文字标尺的技巧
  4. tp5 日期范围查询_tp5(thinkPHP5框架)时间查询操作实例分析,tp5thinkphp5
  5. leetcode_650. 2 Keys Keyboard_dp
  6. 将光盘中的cda保存到电脑中
  7. 变量与常量的本质区别,以及由此引出的深入思考(纯文字解释,不附图,图像自己在大脑中构建)
  8. 简单介绍以下金山重装高手的缺点
  9. 高数第十二章 级数12.1 常数项级数
  10. SpringMVC基础---案例:web提交学生信息数据到数据库