Chinaunix

标题: tcp loss 状态 [打印本页]

作者: 魔鬼的惊叹    时间: 2015-08-12 10:26
标题: tcp loss 状态
最近看到了tcp拥塞方面的知识。
  1. void tcp_enter_loss(struct sock *sk, int how)
  2. {
  3.         const struct inet_connection_sock *icsk = inet_csk(sk);
  4.         struct tcp_sock *tp = tcp_sk(sk);
  5.         struct sk_buff *skb;
  6.         int cnt = 0;

  7.         /* Reduce ssthresh if it has not yet been made inside this window. */
  8.         if (icsk->icsk_ca_state <= TCP_CA_Disorder || tp->snd_una == tp->high_seq ||
  9.             (icsk->icsk_ca_state == TCP_CA_Loss && !icsk->icsk_retransmits)) {
  10.                 tp->prior_ssthresh = tcp_current_ssthresh(sk);
  11.                 tp->snd_ssthresh = icsk->icsk_ca_ops->ssthresh(sk);
  12.                 tcp_ca_event(sk, CA_EVENT_LOSS);
  13.         }
  14.         tp->snd_cwnd           = 1;
  15.         tp->snd_cwnd_cnt   = 0;
  16.         tp->snd_cwnd_stamp = tcp_time_stamp;

  17.         tp->bytes_acked = 0;
  18.         tcp_clear_retrans(tp);

  19.         /* Push undo marker, if it was plain RTO and nothing
  20.          * was retransmitted. */
  21.         if (!how)
  22.                 tp->undo_marker = tp->snd_una;

  23.         sk_stream_for_retrans_queue(skb, sk) {
  24.                 cnt += tcp_skb_pcount(skb);
  25.                 if (TCP_SKB_CB(skb)->sacked&TCPCB_RETRANS)
  26.                         tp->undo_marker = 0;
  27.                 TCP_SKB_CB(skb)->sacked &= (~TCPCB_TAGBITS)|TCPCB_SACKED_ACKED;
  28.                 if (!(TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_ACKED) || how) {
  29.                         TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_ACKED;
  30.                         TCP_SKB_CB(skb)->sacked |= TCPCB_LOST;
  31.                         tp->lost_out += tcp_skb_pcount(skb);
  32.                 } else {
  33.                         tp->sacked_out += tcp_skb_pcount(skb);
  34.                         tp->fackets_out = cnt;
  35.                 }
  36.         }
  37.         tcp_sync_left_out(tp);

  38.         tp->reordering = min_t(unsigned int, tp->reordering,
  39.                                              sysctl_tcp_reordering);
  40.         tcp_set_ca_state(sk, TCP_CA_Loss);
  41.         tp->high_seq = tp->snd_nxt;
  42.         TCP_ECN_queue_cwr(tp);

  43.         clear_all_retrans_hints(tp);
  44. }
复制代码
上面代码中经常要设置一些标志位,我对什么时候,为什么要设置这些标志位搞不清楚,总觉得上面的这些代码是tcp拥塞中某些算法的实现,但是以前学习的网络知识没有讲的这么细,恳请大家指点下,应该看哪方面的资料?困惑中。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2