发送数据包的时候,用户态的数据包是如何拷贝到内核的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的时候,数据包是如何拷贝的的更多相关文章

  1. TCP、UDP数据包大小的限制(UDP数据包一次发送多大为好)——数据帧的物理特性决定的,每层都有一个自己的数据头,层层递减

    1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...

  2. (转)tcp和udp能否发送0字节的数据包

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转自:http://blog.csdn.net/wzx19840423/article/details/6643094  最近去一家牛逼的公司面试 ...

  3. [转]SOCKET通信中TCP、UDP数据包大小的确定

    TCP.UDP数据包大小的确定 UDP和TCP协议利用端口号实现多项应用同时发送和接收数据.数据通过源端口发送出去,通过目标端口接收.有的网络应用只能使用预留或注册的静态端口:而另外一些网络应用则可以 ...

  4. [转]TCP、UDP数据包大小的确定

       TCP.UDP数据包大小的确定   http://blog.163.com/jianlizhao%40126/blog/static/1732511632013410101827640/   U ...

  5. TCP传输小数据包效率问题(译自MSDN)

    TCP传输小数据包效率问题(译自MSDN) http://www.ftpff.com/blog/?q=node/16 摘要:当使用TCP传输小型数据包时,程序的设计是相当重要的.如果在设计方案中不对T ...

  6. TCP、UDP数据包大小的限制

    版权声明:本文为灿哥哥http://blog.csdn.net/caoshangpa 原创文章,转载请标明出处. https://blog.csdn.net/caoshangpa/article/de ...

  7. 【转】TCP、UDP数据包大小的限制

    来自:https://blog.csdn.net/caoshangpa/article/details/51530685 1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层 ...

  8. TCP和UDP数据包大小限制

    1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...

  9. TCP,UDP,IP数据包的大小限制

    1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Da ...

随机推荐

  1. 关于 ssh 连接较慢的解决办法

    1. 概述 使用 ssh 软件连接 linux 时, 会碰到很慢的情况 2. 场景 概述 ssh 连接很慢 大概步骤 使用 xshell6 免费版, 连接 主机 一个小等待, 弹出 用户名 输入框 输 ...

  2. Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天、消息模块

    原文:Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天.消息模块 中秋节假期没事继续搞了搞 做了各聊天的模块,需要继续优化 第一步画页面 页面参考https://github.c ...

  3. MapWinGIS介绍

    MapWinGIS是一个不错的开源组件GIS项目,基于微软的COM思想编写,团队的开发人员主要来自爱荷华大学,而且开发团队中还有一位中国人.它的功能类似于AO(当然没有AO那么强大),其核心是一个名字 ...

  4. BZOJ1053_反素数_KEY

    题目传送门 初看这道题,以为是一道挺难的题目,但仔细看发现,不是只要爆搜就好了吗? 只需要对前12个素数进行爆搜即可. 一个数的因数个数=素数次数+1全部乘起来. code: /*********** ...

  5. 北京Uber优步司机奖励政策(2月27日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. stm32 nucleo系列开发板的接口

    1. 首先说的是 Arduino接口,所有的nucleo系列都支持这个接口,而且像F767这种尺寸长的板子也有的,不过是双排排针,其实就是外侧也是 Arduino接口 2. 板子接上电脑之后有个串口

  7. php webservice 可能存在的坑

    场景: 今天在生产机器上调用webservice失败 报 ...failed to load external entity... wget一下地址发现报500错误  把wsdl去掉再wget 发现就 ...

  8. nodejs 文件系统

    nodejs访问文件系统   所有的文件系统的调用,都需要加载fs模块,即var fs=require('fs'); nodejs提供的fs模块几乎所有的功能都有两种形式选择:异步和同步,如异步的wr ...

  9. 基于Spring的最简单的定时任务实现与配置(二)

    接上一篇,原本我以为我实现的方式很简单了,在准备写(一)的时候,就去查了查别人是怎么实现定时任务的.不查还好,这一查,发现还有更简单的.所以就会有这篇文章. 本文主要是讨论,在完成Spring 项目搭 ...

  10. web漏洞原理 (需要每周更新此篇文章)

    SQL注入攻击简介 结构化查询语言SQL是用来和关系数据库进行交互的文本语言.它允许用户对数据进行有效的管理,包含了对数据的查询.操作.定义和控制等几个方面,例如向数据库写入.插入数据,从数据库读取数 ...