[checksum offload 기능에 대하여]


요즘 나오는 Network Adapter는 checksum offload라는 기능을 제공하고 있습니다. IP, TCP, UDP 등의 header에는 checksum이라는 field가 들어가 있는데, packet을 전송(Tx)할 때에는 해당 checksum field에 올바른 정보가 들어가 있어야 합니다. 예전에는 이 checksum field 값의 계산을 OS(network kernel)에 해 주었는데, 요즘에는 NIC H/W adapter가 자동으로 해 주는 기능이 들어가 있습니다.


NIC card가 checksum offload 기능이 탑재되어 있고, OS가 이를 인지하고 있을 경우 OS(network) stack에서는 checksum field 값을 설정해 주지 않은 상태(쓰레기 값이 들어 감)에서 해당 packet을 H/W에게 넘겨 주게 됩니다. 그러면 NIC은 자동으로 checksum field 값을 계산하여 실제적으로 physical하게 packet을 전송하게 되죠. 이러한 기능은 대용량 멀티미디어 서버와 같이 packet을 다량으로 많이 보내야 하는 시스템에서 CPU의 부하를 조금이라도 줄일 수 있는 방법입니다.




[Wireshark으로 packet을 잡을 때 checksum과 관련되어 빨간 줄이 보이는 현상]


그런데, checksum offload 기능이 탑재된 시스템에서 Wireshark를 이용하여 packet을 잡는 경우에는 이 checksum 정보가 잘못된 경우를 보게 됩니다( checksum_offload.pcap ).


checksum_incorrect.png


이러한 현상이 나타나는 것은 엄밀히 말해서 Wireshark(pcap)에서 packet을 잡는 위치는 physical(H/W)하게 밖으로 나가는(혹은 들어 오는) 부분을 잡는 것이 아니라 NIC driver 레벨에서 잡기 때문입니다(Wireshark에서는 checksum이 잘못되었다고는 나오지만 실제로 물리적으로 전송되는 packet에서는 checksum 값이 올바르게 들어 가게 됩니다). 이러한 경우 Wireshark에서 위에서 보이는 바와 같이 빨간 줄이 보이기 때문에 packet 분석할 때 그리 썩 보기 좋아 보이지는 않습니다.




[NIC card에서 Checksum offload 기능을 빼는 방법]


대용랑 멀티미디어 서버가 아니라면 checksum offload 기능을 빼더라도 CPU에 그리 큰 부담이 없습니다. packet 분석을 많이 하는 경우라면, NIC에서 제공하는 checksum offload 기능을 모두 disable시켜 주는 것이 좋습니다.


NIC card 설정 : 어댑터 설정 변경 > 각강의 NIC에 대하여 오른쪽 클릭하여 속성 > 구성 > 고급 탭에서 offload와 관련된 모든 기능을 off해 준다.


network_adapter_all_offload_disable.png




[Wireshark에서 checksum valiNIC card에서 Checksum offload 기능을 빼는 방법]


이러한 checksum offload 기능이 탑재된 시스템에서 packet을 잡아서 pcap file로 저정된 packet을 분석할 때에는 checksum이 잘못된 정보가 들어 가게 됩니다. 이러한 pcap file을 Wireshark에서 분석을 할 때 checksum validte 기능을 disable 시켜 버리는 게 좋습니다.


Wireshark 설정 : Edit > Preference > Protocols에서 IPv4 선택 > Validate the IPv4 checksum if possible 옵션을 disable 시킨다. TCP 및 UDP도 동일하게 disable 시켜 준다.


IPv4_checksum_offload_disable.png


TCP_checksum_offload_disable.png


UDP_checksum_offload_disable.png