- 论坛徽章:
- 4
|
最近看到了tcp拥塞方面的知识。- void tcp_enter_loss(struct sock *sk, int how)
- {
- const struct inet_connection_sock *icsk = inet_csk(sk);
- struct tcp_sock *tp = tcp_sk(sk);
- struct sk_buff *skb;
- int cnt = 0;
- /* Reduce ssthresh if it has not yet been made inside this window. */
- if (icsk->icsk_ca_state <= TCP_CA_Disorder || tp->snd_una == tp->high_seq ||
- (icsk->icsk_ca_state == TCP_CA_Loss && !icsk->icsk_retransmits)) {
- tp->prior_ssthresh = tcp_current_ssthresh(sk);
- tp->snd_ssthresh = icsk->icsk_ca_ops->ssthresh(sk);
- tcp_ca_event(sk, CA_EVENT_LOSS);
- }
- tp->snd_cwnd = 1;
- tp->snd_cwnd_cnt = 0;
- tp->snd_cwnd_stamp = tcp_time_stamp;
- tp->bytes_acked = 0;
- tcp_clear_retrans(tp);
- /* Push undo marker, if it was plain RTO and nothing
- * was retransmitted. */
- if (!how)
- tp->undo_marker = tp->snd_una;
- sk_stream_for_retrans_queue(skb, sk) {
- cnt += tcp_skb_pcount(skb);
- if (TCP_SKB_CB(skb)->sacked&TCPCB_RETRANS)
- tp->undo_marker = 0;
- TCP_SKB_CB(skb)->sacked &= (~TCPCB_TAGBITS)|TCPCB_SACKED_ACKED;
- if (!(TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_ACKED) || how) {
- TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_ACKED;
- TCP_SKB_CB(skb)->sacked |= TCPCB_LOST;
- tp->lost_out += tcp_skb_pcount(skb);
- } else {
- tp->sacked_out += tcp_skb_pcount(skb);
- tp->fackets_out = cnt;
- }
- }
- tcp_sync_left_out(tp);
- tp->reordering = min_t(unsigned int, tp->reordering,
- sysctl_tcp_reordering);
- tcp_set_ca_state(sk, TCP_CA_Loss);
- tp->high_seq = tp->snd_nxt;
- TCP_ECN_queue_cwr(tp);
- clear_all_retrans_hints(tp);
- }
复制代码 上面代码中经常要设置一些标志位,我对什么时候,为什么要设置这些标志位搞不清楚,总觉得上面的这些代码是tcp拥塞中某些算法的实现,但是以前学习的网络知识没有讲的这么细,恳请大家指点下,应该看哪方面的资料?困惑中。 |
|