libnids 분석(7)
첫 번째 악수: 연결을 만들 때 클라이언트가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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.