首页 > 编程知识 正文

can报文字节顺序,incorrect padding

时间:2023-05-06 01:15:15 阅读:111089 作者:3412

内核的初始优先级级别为TCP_fastretrans_thresh(3),最大值为300。 也就是说,当接收到三个重复的ACK消息时,触发快速重发。

# define TCP _ fast retrans _ thresh3static int _ net _ init TCP _ sk _ init { struct net * net } { net-IP v4.sysctl _ } net-IP v4.sysctl _ TCP _ max _ reordering=300; 1 -要手动调整顺序扰动级别,请使用以下PROC文件tcp_reordering和tcp_max_reordering调整顺序扰动的当前级别和最大顺序扰动级别:

$ cat/proc/sys/net/IP v4/TCP _ reordering3$ cat/proc/sys/net/IP v4/TCP _ max _ reordering 300界面可用于

void TCP _ init _ sock (struct sock * sk ) struct inet _ connection _ sock * icsk=inet _ csk ) sk ); sructTCP_sock*TP=TCP_sk(sk; TP-reordering=sock_net(sk )-ipv4.sysctl_tcp_reordering; 2 - SACK顺序混乱调整当前的未确认号码low_seq (也未重发)不在最高的SACK确认号码之前的情况下,表示没有发生顺序混乱,不调整reordering。 否则,顺序混乱为最高SACK确认号码减去当前号码low_seq。 接口的未排序级别reordering的单位为MSS,检查当前的未排序metric是否超过记录值。如果为true,则更新未排序级别reordering(MSS的整数倍),以获取未排序级别受限的最大值

staticvoidtcp _ check _ sack _ reordering (struct sock * sk,const u32 low_seq,const int ts ) constu 32m ss=TP-MSS _ ff if (! before(low_seq,fack ) )返回; metric=fack - low_seq; if((metricTP-reordering*MSS ) )…TP-reordering=min_t ) U32,) metric mss - 1 )/mss,sock_net ) sk }/* TP/net_Inc_stats(sock_net ) sk ),ts? Linux _ MIB _ tcptsreorder : Linux _ MIB _ tcpsackreorder; 如果3 - SACK失序检测SACK处理函数tcp_sacktag_write_queue中当前拥塞状况等于TCP_CA_Loss,并且不需要更新失序级别。 否则,就更新。

staticinttcp _ sack tag _ write _ queue (struct sock * sk,const struct sk_buff *ack_skb,u32 prior_snd_una,ST=TCP _ ca _ loss|| TP-undo _ marker (TCP _ check _ sack _ reordering (sk,state-reord,0 ); 在初始状态下,reord的值被设定为SND.NXT的值、即发送消息的最大序号,但在这里首先假设顺序不混乱。 在SACK处理函数tcp_sacktag_one中,如果接收到D-SACK并重新发送了消息(例如,由于重新发送导致的DSACK、排除网络中的错误复制消息等),则该消息的起始编号可能早于reord

static u8 TCP _ sack tag _ one (struct sock * sk,struct tcp_sacktag_state *state,u8 sacked,u32 sta

rt_seq, u32 end_seq, int dup_sack, int pcount, u64 xmit_time){ struct tcp_sock *tp = tcp_sk(sk); /* Account D-SACK for retransmitted packet. */ if (dup_sack && (sacked & TCPCB_RETRANS)) { if (tp->undo_marker && tp->undo_retrans > 0 && after(end_seq, tp->undo_marker)) tp->undo_retrans--; if ((sacked & TCPCB_SACKED_ACKED) && before(start_seq, state->reord)) state->reord = start_seq; }

另外,如果报文没有被重传过,这里接收到对其SACK确认,如果其序号小于已经存在的最高SACK确认序号,表明发生了乱序,因为其本应当已经被SACK确认。更新乱序源头reord。

if (!(sacked & TCPCB_SACKED_ACKED)) { if (sacked & TCPCB_SACKED_RETRANS) { ... } else { if (!(sacked & TCPCB_RETRANS)) { /* New sack for not retransmitted frame, * which was in hole. It is reordering. */ if (before(start_seq, tcp_highest_sack_seq(tp)) && before(start_seq, state->reord)) state->reord = start_seq; 4 - 拥塞撤销与SACK乱序

在TCP_CA_Recovery拥塞状态,如果接收到推进SND.UNA的ACK确认报文,执行部分拥塞撤销,如下函数tcp_try_undo_partial。如果此ACK报文由于延时,导致了套接口进入TCP_CA_Recovery状态,而其又未能确认进入TCP_CA_Recovery状态时的全部发送报文。这里,将乱序的源头设置为接收到此ACK报文之前的SND.UNA,也即此ACK报文的起始序号。

static bool tcp_try_undo_partial(struct sock *sk, u32 prior_snd_una){ struct tcp_sock *tp = tcp_sk(sk); if (tp->undo_marker && tcp_packet_delayed(tp)) { /* Plain luck! Hole if filled with delayed * packet, rather than with a retransmit. Check reordering. */ tcp_check_sack_reordering(sk, prior_snd_una, 1); 5 - 重传队列中检查乱序

在清理重传队列时,如果其中的某个报文即没有被重传过,也没有被SACK确认过,而是直接由TCP头部的ACK字段所确认,更新reord乱序源头。如果此序号值小于在接收到此报文之前的最yhdkh确认序号,表明发生了乱序。

static int tcp_clean_rtx_queue(struct sock *sk, u32 prior_fack, u32 prior_snd_una, struct tcp_sacktag_state *sack){ u32 reord = tp->snd_nxt; /* lowest acked un-retx un-sacked seq */ for (skb = skb_rb_first(&sk->tcp_rtx_queue); skb; skb = next) { ... if (unlikely(sacked & TCPCB_RETRANS)) { ... } else if (!(sacked & TCPCB_SACKED_ACKED)) { ... if (before(start_seq, reord)) reord = start_seq; } ... if (flag & FLAG_ACKED) { if (tcp_is_reno(tp)) { ... } else { /* Non-retransmitted hole got filled? That's reordering */ if (before(reord, prior_fack)) tcp_check_sack_reordering(sk, reord, 0);

内核版本 5.0

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