首页 > 编程知识 正文

tcp发送窗口由什么决定,inaddr

时间:2023-05-03 08:17:10 阅读:111098 作者:4962

在标准的TCP确认机制中,如果发送方发送0-1000的序列号之间的数据,而接收方收到0-100,300-1000,则接收方只能向发送方确认101。 此时,发送方重新发送所有101-1000之间的数据。 实际上,这个是没有必要的。 这是因为可能丢失了一点点,但是在标准的TCP确认中

为了优化这种情况,开发了SACK选项,因为必须向发送方告知更多的接收信息。 关于SACK的标准,请参照RFC 2018。

SACK在实际使用中是比较普遍的选择,涉及的内容也很多,所以我们打算用三个笔记本记录相关的内容。

摘要:生成SACK选项介绍基本概念; 在发送方处理SACK选项。 概述SACK安装的发送方和接收方的合作是必要的。 因此,TCP标头实际上定义了两个选项:允许SACK选项和SACK选项。

1.1 SACK允许选项SACK特性是TCP的可选特性,是否启用需要发送和接收双工发送才能进行协商。 通信双工发送在SYN或SYN ACK段中添加SACK允许选项,以通知对方是否支持SACK。 如果支持双工发送,则可以在后续的连接状态通信中使用SACK选项。 因此,SACK允许的选项仅显示在SYN段中。

SACK可以使用如下图所示的选项格式。

1.2在建立SACK选项连接后,如果出现以上情况,接收方可以通过SACK选项通知发送方字节的实际接收情况。 SACK选项的格式如下。

整个TCP标头的可选部分长度不能超过40个字节,因此一个ACK段最多可以存储四对SACK信息。

Left Edge表示接收到的不连续块的第一个序列号,而Right Edge表示接收到的不连续块的最后一个序列号1,即左闭右开区间。 ACK和SACK消息可确保接收方没有具体收到的数据是从ACK到最不小心的山水消息之间的空号码。

内核定义了表示这种左右边界组合的两个数据结构。

//大端序显示,即,作为在网络上传送数据的直接表现的struct TCP _ sack _ block _ wire { _ be32 start _ seq; __be32end_seq; (; sruct TCP _ sack _ block { u32 start _ seq; u32end_seq; (; 2 .发送SACK允许选项让我们看看在TCP链构建期间如何处理SACK允许选项。

2.1与syn段发送的SACK允许选项相关的处理是在tcp_transmit_skb )中进行的,如以下代码所示:

staticinttcp _ transmit _ skb (struct sock * sk,struct sk_buff *skb,int clone_it,gfp_t gfp_mask ) { . ints 根据unlikely (TC B-flagstcpcb _ flag _ syn ) ) /,是否启用SACK选项取决于系统参数sysctl _ TCP _ sack/proc/因为可以组合SACK允许选项和时间戳选项以节省头部空间if ((sysctl _ flags sysctl _ flag _ tstamps ) (TCP _ header _ size=TCP olp olps ) } . if (unlikely (TC B-flagstcpcb _ flag _ syn ) (TCP_syn_build_options ) __be32* ) (th 1 ),TCP )。//识别sack是否有效,如果为1,则tcp_syn_build_options )为sack允许选项(sysctl_flags SYSCTL_FLAG_SACK )、(sysctl ) MD5 _ hash _ location : # endif null; } . 2.2在接收syn段的过程中,与SACK允许选项相关的内容主要是可选分析(tcp_parse_options ) )。 但是,收到的所有TCP选项都被解析为struct tcp_options_received结构,所以我们先来看看与此结构的SACK相关的字段定义。

2.2.1 struct TCP _ options _ receivedstructtcp _ options _ received { . u 16 dsack :/* d-sackisscheduled */./* sizeofsackarraytosendwithnextpacket */u8num _ sacks; /*numberofsackblocks*//; 2.2.2 TCP _ parse _ options (void TCP _ parse _ options ) structsk_buff*skb、 structTCP_options_received* ) skb int estab ) { . casetcpopt _ sack _ perm ://分析sack允许选项包括SYN段、未连接状态、 sysctl_tcp_sack必须是if(opsize==TCPOlen_ )的estab sysctl _ TCP _ sack {//sack _ ol集1必须是sack特性opt _ ol集1 TCP_sack_reset(opt_rx; }break; caseTCPopt_sack://sack信息if (op size=(TCP olen _ sack _ basetcpolen _ sack _ per block ) ) )进行分析! (opsize - TCPOLEN_SACK_BASE ) % TCPOLEN_SACK_PERBLOCK ) opt_rx-SACK_ok )//TCB记录在控制块的sacked中. 2.3发送synack段显然与发送syn段的过程相同,都是通过tcp_transmit_skb )来完成的。

3 .为了使D-SACK更好地响应网络情况,RFC 2883基于SACK选项提出了D-SACK (即双工堆栈)。 接收方接收的无序消息中也可能有重复段,在SACK选项的第一个块中具有该重复段的序列号。 这个序号可能已经确认(小于ACK序号),或大于随后的其他SACK的序号,而发送方可以从最初块更精细地确定网络状况),例如,数据段可以由一个或多个块来确定

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。