Chapter 11. ICMP: Internet Control Message Protocol
11.1 introduction
ICMP๋?
๐๐ป TCP/IP์์ IP ํจํท์ ์ฒ๋ฆฌํ ๋ ๋ฐ์๋๋ ๋ฌธ์ ๋ฅผ ์๋ ค์ฃผ๋ ํ๋กํ ์ฝ์ด๋ค.
๊ฐ ์ด์ ๋ด์ฉ
PRC_ | Net/3์์ ์ฒ๋ฆฌํ ICMP ๋ฉ์์ง์ ํ๋กํ ์ฝ ๋ ๋ฆฝ ์ค๋ฅ ์ฝ๋ ๊ฐ์ ๋งคํ์ ๋ณด์ฌ์ค๋ค. |
icmp_imput | ๊ฐ ICMP ๋ฉ์์ง์ ๋ํด icmp_input์ ์ํด ํธ์ถ๋ ํจ์๋ฅผ ๋ณด์ฌ์ค๋ค. |
UDP | UDP ์์ผ์ ๋ํ ICMP ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ด๋ค. |
TCP | TCP ์์ผ์ ๋ํ ICMP ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ด๋ค. |
errno | ์ด ์ด์ด ๋น์ด์์ผ๋ฉด ์ปค๋์ ICMP ๋ฉ์์ง๋ฅผ ํ๋ก์ธ์ค์ ๋ณด๊ณ ํ์ง ์๋๋ค. |
ICMP message type
8๋ฒ | echo request | ๋ฉ์์ง ์์ฒญ |
0๋ฒ | echo reply | ๋ฉ์์ง ์๋ต |
3๋ฒ | destination unreachable | ๋๋ฌ ๋ถ๊ฐ ์๋ฌ |
11๋ฒ | time exceeded | TTL์ด ์ด๊ณผ๋ ๊ฒฝ์ฐ |
๊ทธ๋ฆผ 11.3์ ์ ํ(๊ทธ๋ฆผ 11.1, 11.2)์์ ๋ถ์์ ๋ฐ์ค๋ก ํ์๋ ๋ถ๋ถ์ ๋ด์ฉ์ ์๋ฏธํ๋ค.
๊ทธ๋ฆผ 11.4๋ ๋ค์ด์ค๋ ICMP ์์ฒญ์ ์ ์ ํ ICMP ์๋ต์ผ๋ก ์๋ตํจ์ ์๋ฏธํ๋ค.
11.2 Code Introduction
๊ทธ๋ฆผ 11.5๋ ICMP ๋ฐ์ดํฐ ๊ตฌ์กฐ, ํต๊ณ ๋ฐ ์ฒ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํฌํจํ๋ ํ์ผ์ด๋ค.
Global Variables
๊ทธ๋ฆผ 11.6์ ์ด ์ฅ์์ ์ค๋ช ํ๋ ์ ์ญ๋ณ์์ด๋ค.
statistics
๊ทธ๋ฆผ 11.7์ ๊ทธ๋ฆผ 11.6์ icmpstat ๊ตฌ์กฐ์ฒด ๋ณ์์ ๋ด์ฉ์ด๋ค.
๊ทธ๋ฆผ 11.8์ netstat -s๋ฅผ ์ ๋ ฅํ์ ๋ ๋ํ๋๋ ๊ฒฐ๊ณผ์ด๋ค.
SNMP Variables
๊ทธ๋ฆผ 11.9๋ SNMP variable๊ณผ icmpstat member ์ฌ์ด์ ๊ด๊ณ๋ฅผ ๋ณด์ฌ์ค๋ค.
11.3 icmp Structure
์ฒซ ๋ฒ์งธ ๋ฐ์ค [42-45]
- icmp_type์ ํน์ ๋ฉ์์ง๋ฅผ ์๋ณํ๋ค.
- icmp_code๋ ๋ฉ์์ง๋ฅผ ์ถ๊ฐ๋ก ์ง์ ํ๋ค.
- icmp_cksum์ IPํค๋ ์ฒดํฌ์ฌ๊ณผ ๋์ผํ๋ค.
๋ ๋ฒ์งธ, ์ธ ๋ฒ์งธ ๋ฐ์ค [46-59], [67-79]
- ๋ union์ ๋ค์ํ ICMP์ accessํ๋ค.
- ICMP ๋ฉ์์ง๋ icmp_type๊ณผ icmp_code๋ฅผ ๋ฐ๋ฅธ๋ค.
- ๋ชจ๋ ICMP ๋ฉ์์ง๋ icmp_hun์ ์ด์ฉํ๊ณ , ์ผ๋ถ๋ icmp_dun์ ์ฌ์ฉํ๋ค.
- ์ฌ์ฉํ์ง ์๋ ํ๋๋ 0์ผ๋ก ์ค์ ํด์ผ ํ๋ค.
๊ทธ๋ฆผ 11.11์ ICMP ๋ฉ์์ง์ ๊ตฌ์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋ณด์ฌ์ค๋ค.
11.4 ICMP protosw structure
๊ทธ๋ฆผ 11.12๋ inetsw[4]์ protosw ๊ตฌ์กฐ์ด๋ค.
icmp_input : ์ปค๋๋ก ๋ค์ด์จ ICMP ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ค. (IP๊ณ์ธต → ์ปค๋)
rip_output : ํ๋ก์ธ์ค์์ ๋ง๋ค์ด์ ธ ๋๊ฐ๋ ICMP ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ค. (ํ๋ก์ธ์ค → IP๊ณ์ธต)
11.5 Input Processing: icmp_input Function
ip_p : ์์ ๋ ๋ฒจ ํ๋กํ ์ฝ์ ๋ํด ๋ํ๋ (ICMP : 1)
ip_p๊ฐ 1์ด๋ฉด ip_protox[] ๊ตฌ์กฐ์ ๋ฐ๋ผ *inetsw[4]*๊ฐ ์ ํ๋๋ค.
*inetsw[4]*์ pr_input์ ํตํด icmp_input์ ํธ์ถํ๋ค.
๊ทธ๋ฆผ 11.14๋ ICMP input์ ์ ๋ฐ์ ์ธ ๊ณผ์ ์ ๋ณด์ฌ์ค๋ค.
- ์์ ๋ ๋ฉ์์ง ํ์ธ
- ICMP error ๋ฉ์์ง
- ICMP request ๋ฉ์์ง
- ICMP redirect ๋ฉ์์ง
- ICMP reply ๋ฉ์์ง
Static structures
์ฒซ ๋ฒ์งธ ๋ฐ์ค [131-134]
- 4๊ฐ์ ๊ตฌ์กฐ๋ icmp_input์ด ํธ์ถ๋ ๋๋ง๋ค 1) ๋์ ํ ๋น์ ์ง์ฐ์ ํผํ๊ณ 2) ์คํ์ ํฌ๊ธฐ๋ฅผ ์ต์ํ ํ๊ธฐ ์ํด ์ ์ ์ผ๋ก ํ ๋นํ๋ค.
Validate message
๋ ๋ฒ์งธ ๋ฐ์ค [135-139]
- icmp_input์ ์์ ๋ ICMP ๋ฉ์์ง์ ๋ฐ์ดํฐ๊ทธ๋จ์ IP ํค๋๊ธธ์ด๋ฅผ ํฌํจํ๋ค.
- ๊ทธ๋ฆผ 11.16์ ๋ฉ์์ง์ ์ ํจ์ฑ์ ํ์ธํ๊ธฐ ์ํด ICMP์์ ์ฐธ์กฐํ๋ ์์ ๋ฐ ๋งคํฌ๋ก์ด๋ค
์ธ ๋ฒ์งธ ๋ฐ์ค [140-160]
- icmplen์ ๋ฉ์์ง ํฌ๊ธฐ๋ฅผ ์ ์ฅํ๋ค.
- ๋ฉ์์ง๊ฐ ๋๋ฌด ์งง์์ ์ ํจํ ICMP ๋ฉ์์ง๊ฐ ๋ ์ ์์ผ๋ฉด icps_tooshort๋ฅผ ์ฆ๊ฐ์์ผ ๋ฉ์์ง๋ฅผ ์ญ์ ํ๋ค.
Verify checksum
๋ค ๋ฒ์งธ ๋ฐ์ค [161-170]
- icmp_input์ in_chsum์ ์ฌ์ฉํ์ฌ ICMP ์ฒดํฌ์ฌ์ ํ์ธํ๋ค.
- ๋ฉ์์ง๊ฐ ์์๋๋ฉด icps_checksum์ด ์ฆ๊ฐํ์ฌ ๋ฉ์์ง๊ฐ ์ญ์ ๋๋ค.
Verify type
๋ค์ฏ ๋ฒ์งธ ๋ฐ์ค [171-175]
- ์ธ์๊ฐ๋ฅํ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด goto raw์ผ๋ก ์ด๋
- ์ธ์๊ฐ๋ฅํ ๋ฒ์์ ์์ผ๋ฉด icmp_code๋ฅผ ๋ณต์ ํ๊ณ icmp_type์ ๋ฐ๋ผ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌ
Raw ICMP input
์ฌ์ฏ ๋ฒ์งธ ๋ฐ์ค [317-325]
- raw : ๋ค์ฏ ๋ฒ์งธ ๋ฐ์ค goto๋ฌธ
- freeit : ์ธ ๋ฒ์งธ ๋ฐ์ค goto๋ฌธ
11.6 Error Processing
ํธ์คํธ๊ฐ ๋ณด๋ธ ๋ฐ์ดํฐ๊ทธ๋จ์ ๋ชฉ์ ์ง ํธ์คํธ๋ก ์ ๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, ๋์ ํธ์คํธ ๋๋ ์ค๊ฐ ๋ผ์ฐํฐ๋ ์ด๋ฌํ ํจํท์ ์์ฑํ์ฌ ์๋ ์์คํ ์ผ๋ก ๋ฐํํ๋ค.
๊ทธ๋ฆผ 11.17์ ICMP ์ค๋ฅ๋ฉ์์ง ํ์์ด๋ค.
์ฒซ ๋ฒ์งธ ๋ฐ์ค [176-216]
- ์ ํ๊ณผ ์ฝ๋๊ฐ ์ธ์๋๋ฉด deliver๋ก ์ด๋
- ์ ํ๊ณผ ์ฝ๋๊ฐ ์ธ์๋์ง ์์ผ๋ฉด badcode๋ก ์ด๋
๋ ๋ฒ์งธ ๋ฐ์ค [217-225]
- ๋ฉ์์ง ๊ธธ์ด๊ฐ ์ฌ๋ฐ๋ฅด์ง ์์ผ๋ฉด icps_badlen์ ์ฆ๊ฐ์์ผ ๋ฉ์์ง๋ฅผ ์ญ์ ํ๋ค.
- ์ด๋ฅผ ํตํด ๋ ๊ฐ์ ์๋ชป๋ ๊ตฌํ ์ฌ์ด์ ๋ฌดํ ์ํ์ค์ ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์ฑ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค.
์ธ ๋ฒ์งธ ๋ฐ์ค [226-231]
- pr_clinput์ 1) code(์ค๋ฅ์ฝ๋), 2) icmpsrc(์๋ณธ IP ๋ฐ์ดํฐ๊ทธ๋จ์ ๋์), 3) icmp_ip(์๋ชป๋ ๋ฐ์ดํฐ๊ทธ๋จ์ ๋ํ ํฌ์ธํฐ)๋ฅผ ์ ๋ฌํ๋ค.
๋ค ๋ฒ์งธ ๋ฐ์ค [232-234]
- icps_badcode๊ฐ ์ฆ๊ฐํด ์ค์์น๋ฌธ์์ ์ ์ด๊ฐ ์ค๋จ๋๋ค.
๊ทธ๋ฆผ 11.19๋ ํ๋กํ ์ฝ์ ๋ถํฉํ๋ ์ค๋ฅ ์ฝ๋์ด๋ค.
- PRC_์์๋ ํ๋ฉด์ ์ผ๋ก๋ ํ๋กํ ์ฝ์ ๋ ๋ฆฝ์ ์ด์ง๋ง ์ฃผ๋ก ์ธํฐ๋ท ํ๋กํ ์ฝ์ ๊ธฐ๋ฐ์ ๋๋ค.
- ์ด๋ ์ธํฐ๋ท ๋๋ฉ์ธ ์ธ๋ถ์ ํ๋กํ ์ฝ์ด ์ค๋ฅ๋ฅผ PRC_ ์์์ ๋งคํํ ๋ ์ด๋์ ๋ ํน์์ฑ์ ์์ค์ ์ด๋ํ๋ค.
11.7 Request Processing
- Net/3๋ ์ฌ๋ฐ๋ฅธ ํ์์ ICMP ์์ฒญ ๋ฉ์์ง์ ์๋ตํ์ง๋ง ์๋ชป๋ ICMP ์์ฒญ ๋ฉ์์ง๋ฅผ rip_input์ ์ ๋ฌํ๋ค.
- Net/3์ ์ํด ์์ ๋ ๋๋ถ๋ถ์ ICMP ์์ฒญ ๋ฉ์์ง๋ ์๋ต ๋ฉ์์ง๋ฅผ ์์ฑํ๋ค.
- ์๋ต์ ์ํ mbuf ํ ๋น์ ํผํ๊ธฐ ์ํด, icmp_input์ ๋ค์ด์ค๋ ์์ฒญ์ ํฌํจํ๋ mbuf๋ฅผ ์๋ต์ผ๋ก ๋ณํํ๊ณ ์ก์ ์์๊ฒ ๋ฐํํ๋ค.
Echo Query: ICMP_ECHO and ICMP_ECHOREPLY
- ICMP์ ECHO์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ Ping์ด๋ผ๊ณ ํ๋ค.
- ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- icmp_code๋ ํญ์ 0์ด๋ค
- icmp_id์ icmp_seq๋ ์์ฒญ์ ๋ฐ์ ์ธ์ ์ํด ์ค์ ๋๊ณ ์๋ต์์ ์์ ์์ด ๋ฐํ๋๋ค.
- icmp_data์ ๋์ฐฉํ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ ๋ฐ์๋๋ค.
์ฒซ ๋ฒ์งธ ๋ฐ์ค [235-237]
- icmp_type์ ICMP_ECHOREPLY๋ก ๋ณ๊ฒฝํ๋ค.
๋ ๋ฒ์งธ ๋ฐ์ค [277-282]
- ์ฌ๋ฐ๋ฅธ ๋ฐ์ดํฐ๊ทธ๋จ ๊ธธ์ด๊ฐ ๋ณต์๋๋ค.
- icps_reflect๋ฅผ ์ฆ๊ฐ์์ผ ์์ฒญ์๋ฅผ ๊ณ์ฐํ๋ค.
- *icps_outhist[icp→icmp_type]++*๋ฅผ ์ฆ๊ฐ์์ผ ICMP ๋ฉ์์ง์ ์ ํ์ ๊ณ์ฐํ๋ค.
- ์์ฒญ์์๊ฒ ์๋ต์ ๋ค์ ๋ณด๋ธ๋ค.
Timestamp Query: ICMP_TSTAMP and ICMP_TSTAMPREPLY
๊ทธ๋ฆผ 11.22๋ ICMP timestamp ์์ฒญ,์๋ต์ด๋ค.
- icmp_code๋ ํญ์ 0์ด๋ค.
- icmp_id์ icmp_seq๋ ICMP ์์ฝ๋ฉ์์ง์ ๋ชฉ์ ๊ณผ ๋์ผํ๋ค.
- icmp_otime์ ์์ฒญ์ด ์์๋ ์๊ฐ์ผ๋ก ์์ฒญํ๋ ์ฌ๋์ด ์ค์ ํ๋ค.
- icmp_rtime์ ์์ฒญ์ด ์์ ๋ ์๊ฐ์ผ๋ก ์์ฒญ์ ์๋ตํ๋ ์ฌ๋์ด ์ค์ ํ๋ค.
- icmp_ttime์ ๋ต์ ์ด ์ ์ก๋ ์๊ฐ์ผ๋ก ์์ฒญ์ ์๋ตํ๋ ์ฌ๋์ด ์ค์ ํ๋ค.
์ฒซ ๋ฒ์งธ ๋ฐ์ค [238-246]
- ICMP_TSTAMPREPLY๋ก ํ์ ์ ๋ณ๊ฒฝํ๋ค. - icmp_rtime๊ณผ icmp_ttime์ ํ์ฌ์๊ฐ์ ๊ธฐ๋กํ๋ค.๐ค
- ์๋ต์ ์ ์กํ๋ค.
Address Mask Query: ICMP_MASKREQ and ICMP_MASKREPLY
๊ทธ๋ฆผ 11.24๋ ICMP ์ฃผ์์ ์์ฒญ๊ณผ ์๋ต์ด๋ค.
- ์์คํ ์ด ์๋ตํ ๊ด๋ฆฌ ๊ถํ์ด ์์ผ๋ฉด ์ฃผ์ ๋ง์คํฌ ์์ฒญ์ ๋ฌด์ํด์ผํ๋ค.
- global integer icmpmaskrepl์ด 0์ด ์๋ ๊ฒฝ์ฐ Net/3๋ ์ฃผ์ ๋ง์คํฌ ์์ฒญ์ ์๋ตํ๋ค.
- ๊ธฐ๋ณธ๊ฐ์ 0์ด๋ฉฐ sysctl(8) ํ๋ก๊ทธ๋จ์ ํตํด icmp_sysctl๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
์ฒซ ๋ฒ์งธ ๋ฐ์ค [247-256]
- ์์ฒญ์ด 0์ด๊ฑฐ๋ ๋๋ฌด ์งง์ผ๋ฉด ์ค์์น๋ฌธ์ ๋น ์ ธ๋๊ฐ๋ค.
Select subnet mask
๋ ๋ฒ์งธ ๋ฐ์ค [257-267]
- ์์ฒญ์ด 0.0.0.0 ๋๋ 255.255.255.255๋ก ์ ์ก๋ ๊ฒฝ์ฐ ์๋ณธ ์ฃผ์๋ ifaof_ifpforaddr์์ ์๋ณธ ์ฃผ์์ ๋์ผํ ๋คํธ์ํฌ์ in_ifaddr ๊ตฌ์กฐ๋ฅผ ์ฐพ๋๋ฐ ์ฌ์ฉ๋๋ค.
- ์์ค ์ฃผ์๊ฐ 0.0.0.0 ๋๋ 255.255.255.255์ธ ๊ฒฝ์ฐ ifaof_ifpforaddr๋ ์์ ์ธํฐํ์ด์ค์ ์ฐ๊ฒฐ๋ ์ฒซ ๋ฒ์งธ IP ์ฃผ์๋ก ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค.
Convert to reply
์ธ ๋ฒ์งธ ๋ฐ์ค [269-270]
- icmp_type์ ICMP_MASKREPLY๋ก ๋ณ๊ฒฝํ๋ค.
- icmp_mask์ ์์์ ์ ์ฅํ ia→ia_sockmask.sin_addr.s_addr์ ์ ์ฅํ๋ค.
Select destination address
๋ค ๋ฒ์งธ ๋ฐ์ค [271-276]
- ์์ฒญ์ ์ฃผ์๊ฐ 0์ด๋ผ๋ฉด ์กฐ๊ฑด๋ฌธ์ ์ฑ๋ฆฝํ๋ค.
- ์์ ์ธํฐํ์ด์ค๊ฐ BROADCAST์ด๋ฉด ia_broadaddr๋ก ์๋ตํ๋ค.
- ์์ ์ธํฐํ์ด์ค๊ฐ POINTTOPOINT์ด๋ฉด ia_dstaddr๋ก ์๋ตํ๋ค.
Information Query: ICMP_IREQ and ICMP_IREQREPLY
- ICMP ์ ๋ณด ๋ฉ์์ง๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋๋ค.
- ์์ค์ ๋์ ์ฃผ์ ํ๋์ ๋คํธ์ํฌ ๋ถ๋ถ์ 0์ด ์๋ ์์ฒญ์ broadcastํ์ฌ ํธ์คํธ๊ฐ ์ฐ๊ฒฐ๋ IP๋คํธ์ํฌ์ ์๋ฅผ ๊ฒ์ํ ์ ์๋๋ก ํ๊ธฐ ์ํ ๊ฒ์ด์๋ค.
- ์์ฒญ์ ์๋ตํ๋ ํธ์คํธ๋ ์ ์ ํ ๋คํธ์ํฌ ๋ฒํธ๊ฐ ์ฑ์์ง ๋ฉ์์ง๋ฅผ ๋ฐํํ๋ค.
- ํธ์คํธ๊ฐ ์ฃผ์์ ํธ์คํธ ๋ถ๋ถ์ ๊ฒ์ํ๋ ค๋ฉด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
- ์ด์ : RARP์ BOTP๊ฐ ์ฃผ์ ๊ฒ์์ ๋ ์ ํฉํ๊ธฐ ๋๋ฌธ์ ํธ์คํธ๊ฐ ICMP ์ ๋ณด ๋ฉ ์์ง๋ฅผ ๊ตฌํํ์ง ์์ ๊ฒ์ ๊ถ์ฅํ๋ค.
Router Discovery: icmp_routeradvert and icmp_routersolicit
- RFC 1256์ ICMP ๋ผ์ฐํฐ ๊ฒ์ ๋ฉ์์ง๋ฅผ ์ ์ํ๋ค.
- Net/3 ์ปค๋์ ์ด๋ฌํ ๋ฉ์์ง๋ฅผ ์ง์ ์ฒ๋ฆฌํ์ง ์๊ณ rip_input์ ํตํด ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ์๋ตํ๋ user-level daemon์ผ๋ก ์ ๋ฌํ๋ค.
11.8 Redirect Processing
Redirect๋?
๋ฆฌ๋ค์ด๋ ํธ๋ ๋ง ๊ทธ๋๋ก re(๋ค์) + ์ง์ํ๋ค(direct) ๋ค์ ์ง์ํ๋ ๊ฒ์ ๋งํ๋ค.
ex) ๋ธ๋ผ์ฐ์ ๊ฐ A URL์ ์น ์๋ฒ์ ์์ฒญํ๋ค๊ณ ํ๋ค.
์๋ฒ๋ HTTP ์๋ต ๋ฉ์์ง๋ฅผ ํตํด B URL๋ก ๋ค์ ์์ฒญํ๋ผ๊ณ ๋ธ๋ผ์ฐ์ ์๊ฒ ๋ค๋ฅธ URL(๊ธธ, ๋ฐฉํฅ) ์ ์ง์ํ ์ ์๋ ๊ฒ์ ๋ฆฌ๋ค์ด๋ ํธ๋ผ ํ๋ค.
๊ทธ๋ฆผ 11.26์ ICMP redirect ๋ฉ์์ง์ ํ์์ ๋ณด์ฌ์ค๋ค.
- ํจํท์ด ์๋ชป๋ ๋ผ์ฐํฐ๋ก ์ ์ก๋ ๋ redirect ๋ฉ์์ง๊ฐ ๋์ฐฉํ๋ค.
- ๋ผ์ฐํฐ๋ ํจํท์ ์ฌ๋ฐ๋ฅธ ๋ผ์ฐํฐ์ forwardํ๊ณ ์์คํ ์ด ๋ผ์ฐํ ํ ์ด๋ธ์ ํตํฉํ๋ ICMP redirect ๋ฉ์์ง๋ฅผ ๋ค์ ๋ณด๋ธ๋ค.
Validate
์ฒซ ๋ฒ์งธ ๋ฐ์ค [283-290]
- icmp_code๋ 0-3์ด๋ฏ๋ก code>3์ด๋ฉด ์ธ์ํ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ๋ค. ์ด๋ badcode๋ก ์ด๋ํ๋ค.
- ๋ฉ์์ง ๊ธธ์ด๊ฐ ์๋ชป๋๊ฑฐ๋ IPํจํท ํค๋ ๊ธธ์ด๊ฐ ์๋ชป๋๋ฉด switch๋ฌธ์ ๋น ์ ธ๋๊ฐ๋ค.
- ICMP_ADVLENMIN : ICMP ์ค๋ฅ ๋ฉ์์ง์ ์ต์ ํฌ๊ธฐ ICMP_ADVLEN : icp๋ก ๊ฐ๋ฆฌํค๋ ํจํท์ ์์ ์ ์๋ IP์ต์ ์ ํฌํจํ ICMP ์ค๋ฅ ๋ฉ์์ง์ ์ต์ ํฌ๊ธฐ์ด๋ค.
๋ ๋ฒ์งธ ๋ฐ์ค [291-300]
- icmpgw : redirect ๋ฉ์์ง์ ์์ค์ฃผ์ (๋ฉ์์ง๋ฅผ ๋ณด๋ธ ๊ฒ์ดํธ์จ์ด)
- icmpdst : ์๋ ํจํท์ ๊ถ์ฅ ๋ผ์ฐํฐ (์ฒซ ๋ฒ์งธ ํ ๋์)
- icmpsrc : ์๋ณธ ํจํท์ ์ต์ข ๋์
Update routes
์ธ ๋ฒ์งธ ๋ฐ์ค [301-306]
- Net/3๋ network redirect์ host redirect๋ฅผ ๋์ผํ๊ฒ ์ทจ๊ธํ๋ค.
- redirect ์ ๋ณด๋ ๋ผ์ฐํ ํ ์ด๋ธ์ ์ ๋ฐ์ดํธํ๋ rtredirect๋ก ์ ๋ฌ๋๋ค.
- redirect๋ ๋์์ด pfctlinput์ผ๋ก ์ ๋ฌ๋์ด ๋ชจ๋ ์ฌ์ฉ์๋ค์๊ฒ ์๋ฆฐ๋ค.
11.9 Reply Processing
- ์ปค๋์ ICMP ์๋ต ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ์ง ์๋๋ค.
- ICMP request๋ ํ๋ก์ธ์ค์ ์ํด ์์ฑ๋๋ฏ๋ก ์ปค๋์ ICMP ๋ฉ์์ง๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก์ธ์ค์ ์์ ๋๋ reply๋ฅผ ์ ๋ฌํ๋ค.
- ICMP ๋ผ์ฐํฐ discovery ๋ฉ์์ง๋ rip_input์ผ๋ก ์ ๋ฌ๋๋ค.
์ฒซ ๋ฒ์งธ ๋ฐ์ค [307-322]
- ์ปค๋์์ ICMP ์๋ต ๋ฉ์์ง์ ๋ํ ์์ ์ด ํ์ํ์ง ์์ผ๋ฏ๋ก raw ์ํ์ switch๋ฌธ ์ดํ์ ์คํ์ด ๊ณ์๋๋ค.
- switch๋ฌธ์ ๊ธฐ๋ณธ ์ฌ๋ก(์ธ์๋์ง ์๋ ICMP ๋ฉ์์ง)๋ ์์ ์ํ์ ์ฝ๋๋ก ์ ์ด๋ฅผ ์ ๋ฌํ๋ค.
11.10 Output Processing
๊ทธ๋ฆผ 11.29๋ ICMP์ถ๋ ฅ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ํ๋ธ๋ค.
11.11 icmp_error Function
icmp_errorํจ์๋ IP ๋๋ ์ ์ก ํ๋กํ ์ฝ์ ์์ฒญ์ ๋ฐ๋ผ ICMP ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ icmp_reflect๋ก ์ ๋ฌํ์ฌ ์ ํจํ์ง ์์ ๋ฐ์ดํฐ๊ทธ๋จ ์์ค๋ก ๋ฐํํ๋ค.
์ฒซ ๋ฒ์งธ ๋ฐ์ค [46-57]
- n : argument (์ ํจํ์ง ์์ ๋ฐ์ดํฐ๊ทธ๋จ์ ํฌํจํ๋ mbuf์ ์ฒด์ธ์ ๋ํ ํฌ์ธํฐ )
- type, code : ICMP ์ค๋ฅtype๊ณผ code ๊ฐ
- dest : ICMP ๋ฆฌ๋๋ ์ ๋ฉ์์ง์ ํฌํจ๋ ๋ค์ ํ ๋ผ์ฐํฐ ์ฃผ์
- destifp : ์๋ณธ IP ํจํท์ ์ํ ์ก์ ์ธํฐํ์ด์ค์ ๋ํ ํฌ์ธํฐ
๋ ๋ฒ์งธ ๋ฐ์ค [58-75]
- redirect ๋ฉ์์ง๋ฅผ ์ ์ธํ ๋ชจ๋ ICMP ์ค๋ฅ๋ icps_error๋ก ๊ณ์ฐ๋๋ค.
- Net/3๋ redirect ๋ฉ์์ง๋ฅผ ์ค๋ฅ๋ก ๊ฐ์ฃผํ์ง ์๋๋ค.
- IP_MF์ IP_DF๋ก ํ์๋๋ ๋นํธ๋ฅผ ์ ์ธํ ip_off์ ์ผ๋ถ ๋นํธ๋ 0์ด ์๋๋ค.
- ICMP_INFOTYPE์ ICMP ์์ฒญ ๋๋ ์๋ต ์ ํ์ด๋ฉด true, ์๋๋ฉด false๋ฅผ ๋ฐํํ๋ค.
- ๋ฐ์ดํฐ๊ทธ๋จ์ ๋งํฌ ๊ณ์ธต ๋ธ๋ก๋์บ์คํธ ๋๋ ๋ฉํฐ์บ์คํธ๋ก ๋์ฐฉํ๋ค.
๊ทธ๋ฆผ 11.31์ ์ค๋ฅ ๋ฉ์์ง์ ๊ตฌ์ฑ์ ๋ณด์ฌ์ค๋ค.
์ฒซ ๋ฒ์งธ ๋ฐ์ค [76-106]
- m_gethdr์ ์ ํจํท ํค๋ mbuf๋ฅผ ํ ๋นํ๋ค.
- MH_ALIGN์ mbuf์ ๋ฐ์ดํฐ ํฌ์ธํฐ๋ฅผ ๋ฐฐ์นํ์ฌ ICMP ํค๋, ์ ํจํ์ง ์์ ๋ฐ์ดํฐ๊ทธ๋จ์ IPํค๋, ์ ํจํ์ง ์์ ๋ฐ์ดํฐ๊ทธ๋จ์ ์ต๋ 8๋ฐ์ดํธ๊ฐ mbuf ๋์ ์์นํ๋๋ก ํ๋ค.
- icmp_type, icmp_code, icmp_gwaddr, icmp_pptr, icmp_nexymtu๊ฐ ์ด๊ธฐํ ๋๋ค.
์ฒซ ๋ฒ์งธ ๋ฐ์ค [107-125]
- IPํค๋, ์ต์ , ๋ฐ์ดํฐ๊ฐ ์๋ชป๋ ๋ฐ์ดํฐ๊ทธ๋จ์์ ICMP ์ค๋ฅ ๋ฉ์์ง๋ก ๋ณต์ฌ๋๋ค.
- ํค๋๊ธธ์ด๋ ์ ํจํ์ง ์์ ๋ฐ์ดํฐ๊ทธ๋จ์ ip_len์ ๋ค์ ์ถ๊ฐ๋๋ค.
- ์ฌ๋ฐ๋ฅธ ๋ฐ์ดํฐ๊ทธ๋จ ๊ธธ์ด(ip_len), ํค๋๊ธธ์ด(ip_hl), ํ๋กํ ์ฝ(ip_p)์ ๋ณต์ํ๊ณ TOS ํ๋(ip_tos)๋ฅผ ์ง์ด๋ค.
๋ ๋ฒ์งธ ๋ฐ์ค [126-129]
- ์์ฑ๋ ๋ฉ์์ง๋ icmp_reflect๋ก ์ ๋ฌ๋๋ค.
- ์๋ชป๋ ๋ฐ์ดํฐ๊ทธ๋จ์ ์ญ์ ๋๋ค.
11.12 icmp_reflect Function
- ICMP_reflect๋ ICMP ์๋ต๊ณผ ์ค๋ฅ๋ฅผ ์์ฒญํ ๊ณณ์ผ๋ก ๋ค์ ๋ณด๋ด๊ฑฐ๋ ์๋ชป๋ ๋ฐ์ดํฐ๊ทธ๋จ์ผ๋ก ๋ค์ ๋ณด๋ธ๋ค.
- ์ ์กํ๊ธฐ ์ ์๋ icmp_reflect๋ ๋ฐ์ดํฐ๊ทธ๋จ์ source์ ๋ชฉ์ ์ง ์ฃผ์๋ฅผ ๋ฐ์ ์ํจ๋ค.
๊ทธ๋ฆผ 11.34๋ ICMP ์ญ์ ์ ์ฃผ์ ์์ฝ์ด๋ค.
Set destination address
์ฒซ ๋ฒ์งธ ๋ฐ์ค [329-345]
- icmp_reflect๋ ip_dst์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๊ณ ip_src(์๋ณธ)๋ก ์ด๋ํ๋ ๊ฒ์ผ๋ก ์์ํ๋ค.
- icmp_error์ icmp_reflect๋ ip_src๊ฐ ์ค๋ฅ๋ฉ์์ง์ ์ ํจํ ๋์ ์กฐ์์ธ์ง ํ์ธํ๋ค.
- ip_output์ ๋ธ๋ก๋์บ์คํธ ์ฃผ์๋ก ์ ์ก๋ ๋ชจ๋ ํจํท์ ์ญ์ ํ๋ค.
Select source address
๋ ๋ฒ์งธ ๋ฐ์ค [346-371]
- icmp_reflect๋ in_ifaddr์์ ๋ฉ์์ง์ ์์ค ์ฃผ์๋ฅผ ์ ํํ๋ค.
- ์ผ์นํ๋ ํญ๋ชฉ์ด ์์ผ๋ฉด ์์ ์ธํฐํ์ด์ค์ in_ifaddr ๊ตฌ์กฐ๊ฐ ์ ํ๋๊ฑฐ๋ in_ifaddr์ ์ฒซ ๋ฒ์งธ ์ฃผ์๊ฐ ์ ํ๋๋ค.
- ip_src๋ฅผ ์ ํํ ์ฃผ์๋ก ์ค์ ํ๊ณ ์ค๋ฅ๊ฐ ์ ๋ฐ์ดํฐ๊ทธ๋จ์ด๊ธฐ ๋๋ฌธ์ ip_ttl์ 255(MAXTTL)๋ก ๋ณ๊ฒฝํ๋ค.
Get reversed source route
์ฒซ ๋ฒ์งธ ๋ฐ์ค [372-385]
- cp๋ ์๋ต ์ ํ์ฌํญ์ ์์์ ๊ธฐ๋ฆฌํจ๋ค.
- ip_srcroute๋ ipintr๊ฐ ๋ฐ์ดํฐ๊ทธ๋จ์ ์ฒ๋ฆฌํ ๋ ์ ์ฅ๋ ์์ค ๊ฒฝ๋ก ์ต์ ์ ๋๋๋ฆฌ๊ณ ๋ฐํํ๋ค.
- ip_srcroute๊ฐ 0์ ๋ฐํํ๋ฉด icmp_reflect๋ mbuf๋ฅผ ํ ๋นํ๊ณ ์ด๊ธฐํํ์ฌ ๋น ipoption๊ตฌ์กฐ๋ก ์ด๋ํ๋ค.
Add record route and timestamp options
๋ ๋ฒ์งธ ๋ฐ์ค [386-416]
- mbuf๋ฅผ ๊ฐ๋ฆฌํค๋ฉด for๋ฌธ์ ์๋ IPํค๋์์ ์ต์ ์ ๊ฒ์ํ๊ณ ๋ ์ฝ๋ ๊ฒฝ๋ก์ ํ์์คํฌํ ์ต์ ์ ip_srcroute์ ์ํด ๋ฐํ๋๋ ์์ค ๊ฒฝ๋ก์ ์ถ๊ฐํ๋ค.
- ICMP ๋ฉ์์ง๋ฅผ ์ ์กํ๊ธฐ ์ ์ ์๋ ํค๋์ ์ต์ ์ ์ ๊ฑฐํด์ผํ๋ค.
Remove original options
์ฒซ ๋ฒ์งธ ๋ฐ์ค [417-429]
- icmp_reflect๋ IP ํค๋์ ๋์ผ๋ก ICMP ๋ฉ์์ง๋ฅผ ์ด๋ํ์ฌ ์๋ ์์ฒญ์์ ์ต์ ์ ์ ๊ฑฐํ๋ค.
- mbuf์ ์๋ ์๋ก์ด ์ต์ ๋ค์ opts์ ์ํด ๊ฐ๋ฆฌ์ผ์ง๋ฉฐ ip_output์ ์ํด ๋ค์ ์ฝ์ ๋๋ค.
Send message and cleanup
๋ ๋ฒ์งธ ๋ฐ์ค [430-435]
- ๋ธ๋ก๋์บ์คํธ์ ๋ฉํฐ์บ์คํธ ํ๋๊ทธ๋ icmp_send์ ๋ฉ์์ง์ ์ต์ ์ ์ ๋ฌํ๊ธฐ ์ ์ ๋ช ์์ ์ผ๋ก ์ง์์ง๋ฉฐ, ๊ทธ ํ์ ์ต์ ์ ํฌํจํ๋ mbuf๊ฐ ํด์ ๋๋ค.
11.13 icmp_send Function
- icmp_send๋ ๋ชจ๋ ์ก์ ICMP ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๊ณ IP ๊ณ์ธต์ ์ ๋ฌํ๊ธฐ ์ ์ ICMP ์ฒดํฌ์ฌ์ ๊ณ์ฐํ๋ค.
์ฒซ ๋ฒ์งธ ๋ฐ์ค [440-457]
- Net/3๋ mbuf ๋ฐ์ดํฐ ํฌ์ธํฐ์ ๊ธธ์ด๋ฅผ ์กฐ์ ํ์ฌ IP ํค๋๋ฅผ ์จ๊ธฐ๊ณ in_cksum์ด ICMP ๋ฉ์์ง๋ง ๋ณด๋๋ก ํ๋ค.
- ๊ณ์ฐ๋ ์ฒดํฌ์ฌ์ icmp_cksum์ ํค๋์ ๋ฐฐ์น๋๊ณ ๋ฐ์ดํฐ๊ทธ๋จ๊ณผ ๋ชจ๋ ์ต์ ์ ip_output์ผ๋ก ์ ๋ฌ๋๋ค.
- ICMP ๊ณ์ธต์ ๊ฒฝ๋ก ์บ์๋ฅผ ์ ์งํ์ง ์์ผ๋ฏ๋ก icmp_send๋ ์ธ ๋ฒ์งธ ์ธ์๋ฅผ null๋ก ์ค์ ํ๋ค.
- icmp_send๋ ip_output์ ์ ์ดํ๋๊ทธ๋ฅผ ์ ๋ฌํ์ง ์์ผ๋ฏ๋ก ๋ค ๋ฒ์งธ ์ธ์๋ฅผ 0์ผ๋ก ์ค์ ํ๋ค.
11.14 icmp_sysctl Function
- IP์ ๋ํ icmp_sysctl ํจ์๋ ๋จ์ผ์ต์ ์ ์ง์ํ๋ค. (๊ทธ๋ฆผ 11.41 ์ฐธ๊ณ )
- ์์คํ ๊ด๋ฆฌ์๋ sysctl(8) ํ๋ก๊ทธ๋จ์ ํตํด ์ต์ ์ ์์ ํ ์ ์๋ค.
๊ทธ๋ฆผ 11.40์ icmp_sysctl parameters๋ฅผ ๋ํ๋ ๋๋ค.
์ฒซ ๋ฒ์งธ ๋ฐ์ค [467-478]
- ํ์ํ ICMP sysctl ์ด๋ฆ์ด ์์ผ๋ฉด ENOTDIR์ด ๋ฐํ๋๋ค.
๋ ๋ฒ์งธ ๋ฐ์ค [479-486]
- ICMP ์์ค ์๋์๋ ์ต์ ์ด ์์ผ๋ฏ๋ก sysctl_int๋ฅผ ํธ์ถํ์ฌ icmpmaskrepl์ ์์ ํ๊ฑฐ๋ ์ต์ ์ด ์ธ์๋์ง ์์ผ๋ฉด ENOPROTOOPT๋ฅผ ๋ฐํํ๋ค.
11.15 Summary
- ICMP ํ๋กํ ์ฝ์ IP ์ ์ก๊ณ์ธต์ผ๋ก ๊ตฌํ๋์ง๋ง IP๊ณ์ธต๊ณผ ๊ธด๋ฐํ๊ฒ ํตํฉ๋๋ค.
- ์ปค๋์ด ICMP ์์ฒญ ๋ฉ์์ง์ ์ง์ ์๋ตํ์ง๋ง ์ค๋ฅ์ ์๋ต ์ฒ๋ฆฌ๋ฅผ ์ํ ์ ์ ํ ์ ์ก ํ๋กํ ์ฝ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ๋ค.
- ์ปค๋์ ICMP ๋ฆฌ๋๋ ์ ๋ฉ์์ง๊ฐ ๋์ฐฉํ๋ฉด ๋ผ์ฐํ ๋ฐ์ด๋ธ์ ์ฆ์ ๋ณ๊ฒฝํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๋ผ์ฐํ darmon๊ณผ ๊ฐ์ ๋๊ธฐ ํ๋ก์ธ์ค์๋ redirect๋ฅผ ์ ๋ฌํ๋ค