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