리눅스 이상한데?

오늘 보니 리눅스에서 사용하는 ping은 수신한 echo reply 메시지의 ICMP checksum을 확인하지 않는 듯하다.

커널 코드를(2.6.10)을 확인해 봤는데 통상 ICMP 패킷 수신을 위해 사용하는 raw socket으로 수신한 패킷을 복사해주는 시점은 IP header를 처리하는 와중.

결과적으로 수신한 echo reply에 대해서는 kernel도 ICMP checksum을 확인하지 않고, ping application도 확인하지 않는 듯. 뭐 이래.

반면 FreeBSD에서는 raw socket으로 패킷을 전달하는 시점이 ICMP protocol 처리한 후에 있는 듯하다. 그래서 ICMP checksum 에러난 패킷은 비정상적인 패킷이므로 application에게 주지도 않는 듯.

이게 맞다면 리눅스 좀 실망인데…

ip_icmp.c
> 313 /*
> 314 * Process a received ICMP message.
> 315 */
> 316 void
> 317 icmp_input(struct mbuf *m, int off)
> 318 {
> ..
> 355 if (in_cksum(m, icmplen)) {
> 356 ICMPSTAT_INC(icps_checksum);
> 357 goto freeit;
> 358 }
> …
> 400 switch (icp->icmp_type) {
> 401
> ….
> 622 /*
> 623 * No kernel processing for the following;
> 624 * just fall through to send to raw listener.
> 625 */
> 626 case ICMP_ECHOREPLY:
> 627 case ICMP_ROUTERADVERT:
> 628 case ICMP_ROUTERSOLICIT:
> 629 case ICMP_TSTAMPREPLY:
> 630 case ICMP_IREQREPLY:
> 631 case ICMP_MASKREPLY:
> 632 default:
> 633 break;
> 634 }
> 635
> 636 raw:
> 637 rip_input(m, off);
> 638 return;
> 639
> 640 freeit:
> 641 m_freem(m);
> 642 }

FreeBsd 커널 소스 볼 수 있는 곳. [http://www.freebsd.org][1]
FreeBsd 커널 소스만 다운 받을 수는 없을까?

[1]: http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.