libnids 분석(7)

3049 단어
TCP 재구성 과정에서 세 번의 악수를 살펴보겠습니다.
첫 번째 악수: 연결을 만들 때 클라이언트가syn 패키지(syn=j)를 서버에 보내고 SYN_SEND 상태, 서버 확인 대기;SYN: 일련 번호 동기화(Synchronize Sequence Numbers).
두 번째 악수: 서버가 syn 패키지를 받으면 고객의 SYN(ack=j+1)을 확인하고 자신도 SYN 패키지(syn=k), 즉 SYN+ACK 패키지를 보내야 합니다. 이때 서버가 SYN_에 들어갑니다.RECV 상태;
세 번째 악수: 클라이언트가 서버의 SYN+ACK 패키지를 받고 서버에 확인 패키지 ACK(ack=k+1)를 보내면 이 패키지가 발송되고 클라이언트와 서버가 ESTABLISHED 상태로 들어가 세 번째 악수를 완성합니다.
세 번의 악수를 마친 후 데이터 전송을 시작한다.
/*******************************************************************************************************************
첫 악수
*******************************************************************************************************************/
if (!(a_tcp = find_stream(this_tcphdr, this_iphdr, &from_client))) {
  
   /* */
  /*tcp : tcp (syn=1 && ack==0 && rst==0) , tcp */
 /*tcp */
    if ((this_tcphdr->th_flags & TH_SYN) &&
    !(this_tcphdr->th_flags & TH_ACK) &&
    !(this_tcphdr->th_flags & TH_RST))
    /* th_rest  */
      add_new_tcp(this_tcphdr, this_iphdr);/* */
  
   /* */
    return;
  }
  
    
  if (from_client) { /* client --> server */
    snd = &a_tcp->client;
    rcv = &a_tcp->server;
  }
  else {/* server --> client  */
    rcv = &a_tcp->client;
    snd = &a_tcp->server;
  } 

/*******************************************************************************************************************
두 번째 악수
*******************************************************************************************************************/
/*tcp  , SYN ==1,ACK==1,tcp (server -> client )*/
  if ((this_tcphdr->th_flags & TH_SYN)) {
    if (from_client || a_tcp->client.state != TCP_SYN_SENT ||
      a_tcp->server.state != TCP_CLOSE || !(this_tcphdr->th_flags & TH_ACK))
      return;
  
  
/* ACK  +1, */
    if (a_tcp->client.seq != ntohl(this_tcphdr->th_ack))
      return;
       
       
    /* */
    /*a_tcp  ,*/
  
    a_tcp->server.state = TCP_SYN_RECV;
    a_tcp->server.seq = ntohl(this_tcphdr->th_seq) + 1;
    a_tcp->server.first_data_seq = a_tcp->server.seq;
    a_tcp->server.ack_seq = ntohl(this_tcphdr->th_ack);
    a_tcp->server.window = ntohs(this_tcphdr->th_win);
  
  
  /* tcp  */
  // 

    if (a_tcp->client.ts_on) {
        a_tcp->server.ts_on = get_ts(this_tcphdr, &a_tcp->server.curr_ts);
    if (!a_tcp->server.ts_on)
        a_tcp->client.ts_on = 0;
    } else a_tcp->server.ts_on = 0;
  
  
// 

    if (a_tcp->client.wscale_on) {
        a_tcp->server.wscale_on = get_wscale(this_tcphdr, &a_tcp->server.wscale);
    if (!a_tcp->server.wscale_on) {
        a_tcp->client.wscale_on = 0;
        a_tcp->client.wscale = 1;
        a_tcp->server.wscale = 1;
    }
    } else {
        a_tcp->server.wscale_on = 0;
        a_tcp->server.wscale = 1;
    }
 /* , */
       
    return;
  } 

좋은 웹페이지 즐겨찾기