tcp syn handle

SYN handling for PAWS. and  SYN+ACK for simultaneous connect

 

/* Does PAWS and seqno based validation of an incoming segment, flags will
 * play significant role here.
 */
static bool tcp_validate_incoming(struct sock *sk, struct sk_buff *skb,
                  const struct tcphdr *th, int syn_inerr)
{
    struct tcp_sock *tp = tcp_sk(sk);
    bool rst_seq_match = false;

    /* RFC1323: H1. Apply PAWS check first. */
    if (tcp_fast_parse_options(sock_net(sk), skb, th, tp) &&
        tp->rx_opt.saw_tstamp &&
        tcp_paws_discard(sk, skb)) {
        if (!th->rst) {
            NET_INC_STATS(sock_net(sk), LINUX_MIB_PAWSESTABREJECTED);
            if (!tcp_oow_rate_limited(sock_net(sk), skb,
                          LINUX_MIB_TCPACKSKIPPEDPAWS,
                          &tp->last_oow_ack_time))
                tcp_send_dupack(sk, skb);
            goto discard;
        }
        /* Reset is accepted even if it did not pass PAWS. */
    }

  目前查看当前报文如果进入到PAWS; 但是如果是syn 的报文进入到paws,就只会发送 dupack;实际上应该发送syn_challenge;

所以改动后为:

         tcp_paws_discard(sk, skb)) {
         if (!th->rst) {
+            if (unlikely(th->syn))
+                goto syn_challenge;
             NET_INC_STATS(sock_net(sk), LINUX_MIB_PAWSESTABREJECTED);
             if (!tcp_oow_rate_limited(sock_net(sk), skb,
                           LINUX_MIB_TCPACKSKIPPEDPAWS,

 

 

https://www.rfc-editor.org/rfc/rfc9293.html#name-establishing-a-connection

 

Simultaneous initiation is only slightly more complex, as is shown in Figure 7. Each TCP peer's connection state cycles from CLOSED to SYN-SENT to SYN-RECEIVED to ESTABLISHED.

    TCP Peer A                                       TCP Peer B

1.  CLOSED                                           CLOSED

2.  SYN-SENT     --> <SEQ=100><CTL=SYN>              ...

3.  SYN-RECEIVED <-- <SEQ=300><CTL=SYN>              <-- SYN-SENT

4.               ... <SEQ=100><CTL=SYN>              --> SYN-RECEIVED

5.  SYN-RECEIVED --> <SEQ=100><ACK=301><CTL=SYN,ACK> ...

6.  ESTABLISHED  <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED

7.               ... <SEQ=100><ACK=301><CTL=SYN,ACK> --> ESTABLISHED

such a SYN+ACK is dropped in tcp_validate_incoming() and responded with Challenge ACK.

 

posted @ 2024-10-08 16:54  codestacklinuxer  阅读(8)  评论(0)    收藏  举报