发送tcp的时候,数据包是如何拷贝的
发送数据包的时候,用户态的数据包是如何拷贝到内核的kiovec
msghd 结构体
icmp是走sock吗?
每一个skb_buffer的大小都是固定的吗?所以有skb_available这样的函数
1883 /**
1884 * skb_availroom - bytes at buffer end
1885 * @skb: buffer to check
1886 *
1887 * Return the number of bytes of free space at the tail of an sk_ buff
1888 * allocated by sk_stream_alloc()
1889 */
1890 static inline int skb_availroom(const struct sk_buff *skb)
1891 {
1892 if (skb_is_nonlinear(skb))
1893 return 0;
1894
1895 return skb->end - skb->tail - skb->reserved_tailroom;
1896 }
1897
skb->end和skb->tail有什么区别?end tail reserved_room
end 和 tail的设置位于函数__alloc_skb
在分配skb的时候怎么把下层协议的数据全部都考虑在内?
skb_reset_tail_pointer函数中会把函数data和head都是函数头
<head, tail> head是有效数据的头, tail是有效数据尾,是想相对偏移!相对偏移!相对偏移!end是整个skb的最后
看下是如何发送一个数据包的,
skb = alloc_skb_fclone(size + sk->sk_prot->max_header, gfp);
其中sk->sk_prot->max_header = MAX_TCP_HEADER
#define MAX_TCP_HEADER (128 + MAX_HEADER)
150 #if !IS_ENABLED(CONFIG_NET_IPIP) && !IS_ENABLED(CONFIG_NET_IPGRE) && \
151 !IS_ENABLED(CONFIG_IPV6_SIT) && !IS_ENABLED(CONFIG_IPV6_TUNNEL)
152 #define MAX_HEADER LL_MAX_HEADER
153 #else
154 #define MAX_HEADER (LL_MAX_HEADER + 48)
155 #endif
138 #if defined(CONFIG_HYPERV_NET)
139 # define LL_MAX_HEADER 128
140 #elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25)
141 # if defined(CONFIG_MAC80211_MESH)
142 # define LL_MAX_HEADER 128
143 # else
144 # define LL_MAX_HEADER 96
145 # endif
146 #else
147 # define LL_MAX_HEADER 32
148 #endif
用户态的数据都是在内核中有一份拷贝, 每创造一个skb,就把这个skb放到了sock的send_list中去
tcp_write_xmit 函数
顺序问题;丢包问题;链接维护;流量控制;拥塞控制;
顺序问题、丢包问题、流量问题都是通过滑动窗口来解决的。这三个问题都是更和接收端强相关,是因为发送端按部就班地发送,接收端收到的顺序是错乱的,发送端把包发送出去了,是接收端没有接收到包(另外ack包也有可能丢失),流量问题是接收端主动向发送端上报我的接收窗口,从而达到了流量控制的目的; 但是解决方法在发送端解决:(超时重传|快速重传|SACK)。所以丢包和顺序都是通过滑动窗口来解决的!在对包的确认中会携带一个窗口的大小!
拥塞控制更和发送端相关。是因为发送窗口,才会导致网络拥塞啊。
tcp_transmit_skb中是真正发送;
在发送数据包之前什么会导致数据包下发失败呢?发送窗口不允许
有几个重要的概念: tso(tcp segment offload), mss, RTT(round trip time)
内核里面是怎么计算rtt的?超时重传会用到RTT,超时重传时使用!
mss(max segment size)
拥塞窗口:snd_cwnd
滑动窗口是TCP协议中的核心,顺序、丢包都是通过滑动窗口来指导,但是在这个窗口之内的发送的速率呢?确定过了滑动窗口之后,发送端当然可以一股脑把数据全部都送出去啊,此时肯定不会把接收端打满,但是会把网络打满!所以会把网络打满!会把网络打满!所以给了你一个quota,怎么用这个quota,至于你怎么用那就是你的事情了!使用网络拥塞算法解决网络拥堵的问题呀!
函数中:tcp_cwnd_test tcp_packages_in_flight
发送tcp的时候,数据包是如何拷贝的的更多相关文章
- TCP、UDP数据包大小的限制(UDP数据包一次发送多大为好)——数据帧的物理特性决定的,每层都有一个自己的数据头,层层递减
1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...
- (转)tcp和udp能否发送0字节的数据包
版权声明:本文为博主原创文章,未经博主允许不得转载. 转自:http://blog.csdn.net/wzx19840423/article/details/6643094 最近去一家牛逼的公司面试 ...
- [转]SOCKET通信中TCP、UDP数据包大小的确定
TCP.UDP数据包大小的确定 UDP和TCP协议利用端口号实现多项应用同时发送和接收数据.数据通过源端口发送出去,通过目标端口接收.有的网络应用只能使用预留或注册的静态端口:而另外一些网络应用则可以 ...
- [转]TCP、UDP数据包大小的确定
TCP.UDP数据包大小的确定 http://blog.163.com/jianlizhao%40126/blog/static/1732511632013410101827640/ U ...
- TCP传输小数据包效率问题(译自MSDN)
TCP传输小数据包效率问题(译自MSDN) http://www.ftpff.com/blog/?q=node/16 摘要:当使用TCP传输小型数据包时,程序的设计是相当重要的.如果在设计方案中不对T ...
- TCP、UDP数据包大小的限制
版权声明:本文为灿哥哥http://blog.csdn.net/caoshangpa 原创文章,转载请标明出处. https://blog.csdn.net/caoshangpa/article/de ...
- 【转】TCP、UDP数据包大小的限制
来自:https://blog.csdn.net/caoshangpa/article/details/51530685 1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层 ...
- TCP和UDP数据包大小限制
1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...
- TCP,UDP,IP数据包的大小限制
1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...
随机推荐
- docker 环境下创建 overlay 网络方案
一.环境 三台机器,其中一台安装 consul(192.168.1.21), 两台创建网络(192.168.1.32,33) 二.实现步骤 1.构建环境 1)三台机器部署docker环境 2)选择一台 ...
- 【LG4175】[CTSC2008]网络管理
[LG4175][CTSC2008]网络管理 题面 洛谷 题解 感觉就和普通的整体二分差不太多啊... 树上修改就按时间添加,用树状数组维护一下即可 代码 #include<iostream&g ...
- vue.js中引入其他文件export的方法:
import {GetPosition} from '../../lib/utils' //找到 该方法的文件路径,然后 用{}拿到 该方法 var position =GetPosition(); ...
- NSNull Crash处理 (NullSafe 的原理)
问题场景 后端返回的数据中总会出现一些NSNull类型,当我们一处理程序就会崩溃,因此想到把返回的数据中的NSNull类型全部转换成@""空字符串 (1)原始的json串:后端返回 ...
- 初试Docker on Debian on VirtualBox
一直以来都对Docker如雷贯耳,很想尝试一下但都被各种忙给耽误了,最近由于项目调试,需要安装 Oracle 和 SQL Server 数据库,但又不想安装到本机系统里,于是下决心啃一下docker这 ...
- android 学习四 ContentProvider
1.系统自带的许多数据(联系人,本地信息等)保存在sqllite数据库,然后封装成许多ContentProvider来供其他程序访问. 2.对sqllite数据库的操作,可以在命令行通过adb工具登录 ...
- 2019年猪年海报PSD模板-第六部分
14套精美猪年海报,免费猪年海报,下载地址:百度网盘,https://pan.baidu.com/s/1WdlIiIdj1VVWxI4je0ebKw
- Python 的非正式介绍
在下面的例子中,通过提示符 (>>> 与 ...) 的出现与否来区分输入和输出:如果你想复现这些例子,当提示符出现后,你必须在提示符后键入例子中的每一个词:不以提示符开头的那些行是解 ...
- 银行系统ps:不太完善,蟹蟹评论
# 主程序运行 import time from guanli import GuanLi from atm import ATM from user import User def main(): ...
- 转战Java~
记得16年5月份开始学的Java,当时就是为了学Hadoop才学的Java基础,之后Hadoop没学成,倒是学了Java Web的东西,当时就是玩玩,然后弄了个WeChat后台,就完事了.然后就又回到 ...