发送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

原文地址:https://www.cnblogs.com/honpey/p/9191771.html

时间: 2024-10-02 18:20:40

发送tcp的时候,数据包是如何拷贝的的相关文章

TCP和UDP数据包大小限制

1.概述 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在应用层 它们的关系是 数据帧{IP包{TCP或UDP包{Data}}}     不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame).数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后

使用PF_PACKET和SOCK_RAW发送自定义type以太网数据包

本文介绍使用PF_PACKET和SOCK_RAW发送自定义type以太网数据包,使用wireshare抓包可以获取到数据包,为Linux内核增加网络协议做铺垫. 先上码: #include <stdio.h> #include <stdlib.h> #include <unistd.h>           // close() #include <string.h>           // strcpy, memset(), and memcpy() #

TCP/IP协议数据包文件PCAP分析器

一.设计原理 1.PCAP文件构成 参考http://blog.csdn.net/gulu_gulu_jp/article/details/50494909 PCAP文件由一个PCAP文件头和多个PCAP数据包组成,PCAP数据又由数据包头和数据包内容组成.数据包内容才是我们将要进行分析还原的TCP/IP协议数据.PCAP总体结构如图 11所示: 图 11 PCAP文件总体结构 以TCP协议为例,详细解析PCAP文件格式.PCAP前24个字节为文件头,包含了文件信息,其结构如图 11所示.接着1

有趣的tcp交互小数据包-telnet(未完成)

TCP有趣的处理方式: 133 telnet 到 192.168.100.157 后,输入命令ls . 133和157对每个字母单独打包 原文地址:http://blog.51cto.com/jsahz/2062098

TCP/IP数据包处理路径(Ipnat.sys 、Ipfltdrv.sys 、 Ipsec.sys)

转自:https://technet.microsoft.com/library/bb878072 本页内容 简介 用于数据包处理的 TCP/IP 体系结构 数据包处理路径 更多信息 简介 随着 Microsoft® Windows® XP Service Pack 2 和 Windows Server™ 2003 Service Pack 1 新增了 Windows 防火墙,以及 Internet 协议安全 (IPsec) 在公司 Intranet 中日益广泛的应用,信息技术 (IT) 专业人

Linux网络之设备接口层:发送数据包流程dev_queue_xmit

转自:http://blog.csdn.net/wdscq1234/article/details/51926808 写在前面 本文主要是分析kernel-3.8的源代码,主要集中在Network的netdevice层面,来贯穿interface传输数据包的流程,kernel 博大精深,这也仅仅是一点个人愚见,作为一个笔记形式的文章,如有错误或者表述不当之处,还请大家留言批评指正,非常感谢! 主要涉及的file:kernel-3.18/net/core/dev.c kernel-3.18/net

以太网,IP,TCP,UDP数据包分析

http://www.cnblogs.com/feitian629/archive/2012/11/16/2774065.html 1.ISO开放系统有以下几层: 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 2.TCP/IP 网络协议栈分为应用层(Application).传输层(Transport).网络层(Network)和链路层(Link)四层. 通信过程中,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如

基于Jpcap的TCP/IP数据包分析(一)

基于Jpcap的TCP/IP数据包分析原作:赵新辉目 录第一章 以太网的结构和TCP/IP1.1 以太网的结构1.1.1 基于网络架构的以太网1.1.2 以太网的数据交换1.1.3 以太网帧的结构1.2 IP数据报的构成 1.2.1 IP地址1.2.2 路由1.2.3 IP数据报的构成1.2.4 其他报文结构1.3 TCP/UDP1.3.1 TCP/UDP的作用1.3.2 TCP和UDP报文的结构第二章 Jpcap类库2.1 Jpcap的使用2.1.1 Jpcap的运行环境的安装2.1.2 Jp

[RK_2014_0923]wireshark捕捉到的Ethernet II数据包的最小长度为60

一.关于wireshark中以太网数据包的最小长度,请看下面的文字: Packet format A physical Ethernet packet will look like this: Preamble Destination MAC address Source MAC address Type/Length User Data Frame Check Sequence (FCS) 8 6 6 2 46 - 1500 4 As the Ethernet hardware filters