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

最新文章

  1. 数位DP bzoj1026
  2. mac上一键配置和安装adb驱动或者环境
  3. JSP注意点
  4. 由window.history.back()引发的问题
  5. Android开发UI之textview实现高亮显示并点击跳转
  6. varnish、squid、apache、nginx缓存的对比&lt;转&gt;
  7. 分享5个主流的HTML5开发工具
  8. hdu4324 Triangle LOVE (拓扑排序)
  9. 自适应滤波:最小均方误差滤波器(LMS、NLMS)
  10. ubuntu中切换到root账号方法
  11. 限定textbox中只能输入数字的小方法
  12. 美国康奈尔大学BioNB441元胞自动机MATLAB应用
  13. 微信小程序之菜鸟选手入门教学(一)
  14. 另一个画风的GSS1 - Can you answer these queries I(猫树)
  15. 在WPF中调用另存为对话框
  16. Loading Xps from MemoryStream
  17. AJAX初尝试——ACM/ICPC类比赛气球管理系统
  18. (转)CentOS 7 单用户模式+救援模式
  19. MapReduce编程之Map Join多种应用场景与使用
  20. linux使用vi浏览python源码

热门文章

  1. [NOIP2017]逛公园(DP)
  2. 如何配置 SpaceVim
  3. 5 多进程copy文件
  4. C#调用大漠插件,发送QQ和微信消息
  5. nested class 例子
  6. grep命令及正则
  7. Python 发邮件例子
  8. redis集群搭建(伪集群)
  9. HDU - 6409:没有兄弟的舞会(数学+思维)
  10. ZOJ 3686 A Simple Tree Problem(线段树)