tcp/ip에 대해서 질문 있습니다.
글쓴이: powerson / 작성시간: 금, 2006/01/13 - 2:26오후
현재 bridge mode로 설정한 상태이고, netif_receive_skb에서 현재 패킷 처리를 하고 있습니다. 이 때 제가 원하는 패킷들에 대해서는 connect terminate 시키고 싶은데요. 다음 코드로 해서 fin 설정을 해주면 바로 종료되지 않고, timeout 걸리면서 retransmission이 이루어지고 있습니다.
아래 코드는 보내온 source 컴퓨터에게 fin 설정을 하고, 그 외에 헤더 정보를 바꿔서 보내도록 socket buffer를 수정한 것입니다.
void connect_reject( struct sk_buff *skb ) { struct ethhdr *eth; struct tcphdr *tcph; struct iphdr *iph; unsigned char temp[ETH_ALEN]; __u16 temp_port; __u32 temp_addr; eth = eth_hdr( skb ); memcpy( temp, eth->h_dest, sizeof(ETH_ALEN) ); memcpy( eth->h_dest, eth->h_source, sizeof(ETH_ALEN) ); memcpy( eth->h_source, temp, sizeof(ETH_ALEN) ); iph = (struct iphdr *) skb->data; temp_addr = iph->saddr; iph->saddr = iph->daddr; iph->daddr = temp_addr; tcph = (struct tcphdr *)(((unsigned char *)iph) + (iph->ihl<<2)); temp_port = tcph->source; tcph->source = tcph->dest; tcph->dest = temp_port; tcph->ack_seq = tcph->seq; tcph->fin = 1; printk( "DEST IP : %u.%u.%u.%u SOURCE IP : %u.%u.%u.%u\n", NIPQUAD(skb->nh.iph->daddr), NIPQUAD(skb->nh.iph->saddr) ); }
혹시 아시는 분 답변 좀 부탁드립니다. ^^
Forums:
1. netif_receive_skb 란게 뭔지는 잘 모르겠는데요...
1. netif_receive_skb 란게 뭔지는 잘 모르겠는데요...
저 코드는... 시퀀스 넘버가 안맞을것 같습니다.
tcph->ack_seq = tcph->seq;
이게 아니라
이런식이 되어야 할것 같은데요...
ethereal같은 걸로 패킷을 분석해보세요.
시퀀스넘버나 Ack넘버까지 알아서 분석하니... 편하죠.
2. 세션을 terminate 시키고 싶으시다면... rst 을 보내는게 더 쉽지 않나요?
----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------
우선 답변 주신것에 대해서 감사합니다.현재 테스트를 해본 결과 마찬가
우선 답변 주신것에 대해서 감사합니다.
현재 테스트를 해본 결과 마찬가지네요.. ㅠㅠ
해당 함수의 argument는 수신된 socket buffer입니다. 제가 질문시에 안 적어놓았군요.. ㅠㅠ
netif_receive_skb는 수신된 socket buffer에 대한 처리를 하는 커널 함수입니다. 현재 수신된 buffer의 header값을 port, ip, mac 값을 수정하고, fin 설정을 하도록 한 것입니다. 현재 seq가 사실 저도 제일 염려하는 부분인데, 해당 코드로 처리한 이유는 수신된 seq값이기 때문에 그걸 바로 ack_seq로 보내면 되는게 아니가 생각하고 저렇게 처리한 것입니다. 그럼 답변 부탁드립니다. 좋은 하루 보내세요~
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
[quote="powerson"] 현재 seq가 사실 저도 제일 염려하는
아마.. 반대로 생각하시면 될겁니다.
ACK란건... 몇번까지 받았다는 확인인 동시에 다음에 니가 몇번부터 보내면 된다라는걸 알려주는 의미가 있습니다.
그러니, 회신하는 seq에는 수신된 ack_seq를 그대로 사용하면 되겠죠.
하지만 회신하는 ack값에는 '다음번에 당신이 보내야 할 seq'를 계산해서 넣어줘야 합니다. 아마도... '수신된 seq + Data의 Byte 수' 정도 되겠지요.
(그런데... ethernet hdr는 세팅 안해줘도 되나요?)
----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------
재전송이 반복되고, .... 이러한 경우는 브리지에서 보낸(만들어
재전송이 반복되고, ....
이러한 경우는 브리지에서 보낸(만들어서) 패킷의 seq가 맞지 않아서, 원격지에서는 이를 이상 패킷으로 감지했다라는 시나리오에 100원 걸겠습니다.
RST나 FIN등의 플래그 문제가 아닌 TCP Sequence 문제일 것이라는 얘기입니다.
[quote="Anonymous"]재전송이 반복되고, .... 이
당연한 말씀입니다.
브릿지에서 만들어서 보낸 FIN 패킷의 TCP Sequence 가 맞지 않아 생기는 문제라는 얘기지요. -_-;;
참고로... RST의 경우에는 seq 넘버가 맞지 않아도 세션을 끊을수 있습니다. seq넘버가 도로 작아지지만 않는다면요.
(게다가 FIN은 HandShake 과정을 거쳐야 하니 더 불편하기도 합니다.)
----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------
* 해당 세션의 패킷들을 ... 그냥 조용히 버리는 것은 어떻습니까? 당
* 해당 세션의 패킷들을 ... 그냥 조용히 버리는 것은 어떻습니까? 당하는 쪽이야 열받겠지만 말이지요.(사실 버릴만 하니까 버리겠지요? 아마도?)
[quote="kuaaan"]참고로... RST의 경우에는 seq 넘버가
rst로도 테스트를 해보았지만, 여전히 재전송이 이루어지곤 있습니다. 열심히 삽질해봐야겠지요. ^^ kuaaan님이 도와주셔서 방향은 알거 같습니다. 감사합니다.
물론 그냥 버려도 되지만, 재전송이 되는걸 막아볼려고 하는것이라서요. ^^
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
[quote="kuaaan"](그런데... ethernet hdr는 세팅
이걸로써 hdr 값은 셋팅 된거 아닌가요? 다른걸 더 해줘야 하는게 있는건가요?
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
[quote="powerson"][quote="kuaaan"](그런데..
아.. 제가 잘못봤네요. 죄송여.. ^^
tcpdump 뜬걸 올려봐주실래요?
----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------
댓글 달기