옵션 |
|
안녕하세요!!
오유 눈팅족 이지만.. 정말로 궁금한게 있어 질문 올립니다. ㅠ
쓰다보니 꽤 장문이 되었지만, C언어에 관심이 있으신 분, 혹은 unix socket을 잘 아시는 분들께 부탁 드립니다..
주제는, 제목과 같이 리눅스 환경에서 raw socket 사용 시 타 프로세스에 미치는 영향 입니다.
일단 수신되는 TCP패킷을 스니핑 하고자 아래 코드를 사용합니다. (중요하지 않은 부분은 생략..)
sock = socket(PF_INET, SOCK_RAW, IPPROTO_TCP)
while(1)
{
recvfrom(sock, rxPacket, rxPacketSize, 0x0, (struct sockaddr *)&sockAddrR, &sockAddrLength)
....수신된 rxPacket 처리
}
위와 같이 수신되는 모든 tcp 패킷을 스니핑 하는데요,
recvfrom 함수가 패킷을 가져오는 로직에 대해 구글링을 열심히 해 보았지만 영알못이라... OTL
궁금한 부분을 아래와 같이 네 가지로 정리해 봤습니다.
[여러 프로세스가 떠 있고, 타 서버와 굉장히 많은 패킷들을 주고받는 서버환경이라 가정(disk io는 낮습니다)]
1. 스니핑 프로세스가 recvfrom 패킷 수신 후 아무것도 하지 않아도, raw 소켓을 listening 하는것 만으로 다른 프로세스들에 영향이 있을까요?
---> 영향이 없을것 같긴 한데..심지어 ping 프로그램도 raw 소켓을 listening 하고 있더라구요..
---> 그래도 커널단에서 원래의 LISTENING 프로세스에 더해 스니핑 프로세스에게 패킷을 전달하기 위해 복사할 것 같은데..
---> 그 과정에서 원래의 프로세스에 전달되는 속도가 지연될지 궁금합니다.
2. 평소 CPU 점유율이 50% 정도이고, 위의 스니핑 데몬을 실행시켰더니 점유율이 70%가 되었다면, 기존의 프로세스들의 통신 속도가 다운될까요?
---> 아니면 어차피 패킷복사의 영향은 크게 없고, cpu 점유율도 100%가 아니니 영향이 거의 없을까요?
3. 패킷 스니핑 후 처리하는 로직이 복잡하여 CPU에 부하가 걸린다면, 원래의 LISTENING 프로세스에 전달되는 패킷이 DROP될 가능성이 있을까요?
---> 이부분도 아닐 것 같긴 한데요..부하가 걸린다면, 스니핑 프로세스에서 모든 패킷을 다 보지 못하고 지나쳐버릴 것 같습니다.
---> 기존 프로세스는 흐름 제어를 하고 있을테니..
4. 마지막으로.. 이전에는 libpcap 라이브러리를 썼었는데요, libpcap 라이브러리도 내부 소스는 recvfrom 시스템콜을 사용하는지 궁금합니다.
---> "tcpdump tcp port 80" 명령어도 내부적으로는 recvfrom 으로 패킷 받은 뒤 헤더 까서 80번 포트인지 확인하는 방식이라면,
---> 궂이 libpcap 안써도 될 것 같아서요.. 간단한 로직이라면 오히려 직접 recvfrom 으로 코딩하는게 빠를 수 있을까요?
질문 글을 작성하다 보니까 궁금한게 좀 더 정리가 되는 것 같습니다.
의견 부탁 드립니다!
출처 | 저 |