통신과정(PING, ARP를 이용하여 통신하는 과정)
일단 과정은 이렇다.
xp가 설치된 PC와 BT5가 설치된 PC가 있다.
(어떠한 운영체제 장비든 2개의 장비만 있으면 된다.)
장비 사이에 어떠한 정보도 있지 않고 ping통신을 한다고 하였을때 어떻게 ping통신이 가능하게 되는지 알아본다.
이 포스팅을 접하기 전에 먼저 Encapsulation과정과, Decapsulation과정을 먼저 숙지하고,
OSI 7 Layer(OSI 7계층)에 대해서 먼저 공부하길 바란다.
1. xp -> BT5(backtrack5) (icmp request)
xp가 BT5에 ip외엔 아무것도 모르는 상태에서 ping을 보낸다고 하자.
icmp(4계층)
echo request data[abcdef...]
ip(3계층)
src ip : 200.200.200.42(xp)
dst ip : 200.200.200.41(BT5)
[data(icmp)]
Ethernet(2계층)
dst MAC : ?
========== STOP =========
2계층 장비에서는 MAC주소를 이용하여 프레임을 완성 시켜야 하는데, BT5에 대한 MAC주소를 알지 못한다.
</▲>
xp에서 BT5에 대한 MAC주소를 모르게 때문에
ARP 프로토콜을 이용하여 MAC주소를 알아오는 단계로 넘어가게 된다.
2. xp -> BT5 (arp request)
</▲>
ARP는 Ethernet(2계층)보다는 높고 ip(3계층)보다는 낮은 계층으로 2.5계층정도 라고 생각하면 된다.
ARP는 ip주소로 MAC주소를 알아오는 프로토콜이다.
또한, ARP는 ip와 MAC소를 모두 이용한다.
ARP에서 목적지 주소를 모를때는 00:00:00:00:00:00으로 MAC주소를 채워 달라는 의미로 0을 넣는다.
arp(2.5계층)
H/W Type : eth(1)
Protocol Type : ipv4(0x0800)
H/W size : 6
Protocol size : 4
Request(1)
sender MAC : XP의MAC
sender IP : 200.200.200.42(xp ip)
dst MAC : 00:00:00:00:00:00 (모르니까 채워달라는 의미)
dst IP : 200.200.200.41(BT5 ip)
ethernet(2계층)
dst MAC : FF:FF:FF:FF:FF:FF(브로드캐스트로...)
src MAC : XP의 MAC
Type : ARP(0x0806)
data(ARP) - 28Byte
PAD(18Byte)
FCS
xp에서는 ARP Cache Table에 200.200.200.41 00:00:00:00:00:00 으로 갱신
ARP는 브로드캐스트로 네트워크안에 모든 장비에게 뿌리기 때문에
Ethernet계층의 MAC주소를 FF:FF:FF:FF:FF:FF로 사용한다.
</▲>
3. BT5(arp 받음)
이제 xp에서 보낸 ARP패킷을 BT5에서 받았다고 생각해보자.
받은 파일을 열때는 Decapsulation하기 때문에 Encapsulation과 반대로 진행한다.
Ethernet(2계층)
dst MAC : FF:FF:FF:FF:FF:FF
src MAC : XP의 MAC
Type : ARP(0x0806)
data(ARP) - 28Byte
PAD(18Byte)
FCS
ARP(2.5계층)
H/W Type : eth(1)
Protocol Type : ipv4(0x0800)
H/W size : 6
Protocol size : 4
Request(1)
sender MAC : XP의MAC
sender IP : 200.200.200.42(xp ip)
dst MAC : 00:00:00:00:00:00
dst IP : 200.200.200.41(BT5 ip)
4. BT5 -> XP(arp Reply)
BT5에서 ARP를 받고 자신에게 온것이 받다면 자신(BT5)의 MAC주소를 채워서 ARP Reply를 xp에게 보내준다.
arp(2.5계층)
H/W Type : eth(1)
Protocol Type : ipv4(0x0800)
H/W size : 6
Protocol size : 4
Reply(2)
sender MAC : BT5_MAC
sender IP : 200.200.200.41(BT5)
dst MAC : XP_MAC
dst IP : 200.200.200.42(xp)
ethernet(2계층)
dst MAC : XP_MAC
src MAC : BT5_MAC
Type : ARP(0x0806)
PAD(18Byte)
FCS
</▲>
5. XP(arp 받음)
Ethernet(2계층)
dst MAC : XP_MAC
src MAC : BT5_MAC
Type : ARP(0x0806)
PAD(18Byte)
FCS
ARP(2.5계층)
H/W Type : eth(1)
Protocol Type : ipv4(0x0800)
H/W size : 6
Protocol size : 4
Reply(2)
sender MAC : BT5_MAC
sender IP : 200.200.200.41(BT5)
dst MAC : XP_MAC
dst IP : 200.200.200.42(xp)
6. xp->BT5 (icmp request)
이제 xp에서 BT5에 MAC주소를 알아 왔기 때문에 xp와 BT5는 통신이 가능하다.
ARP로 얻어온 정보를 가지고 xp는 다시 ICMP(request)를 만들어 BT5와 통신한다.
icmp(4계층)
echo request data[abcd...]
ip(3계층)
src IP : 200.200.200.42(xp)
dst IP : 200.200.200.41(BT5)
[data(icmp)]
Ethernet(2계층)
dst MAC : BT5_MAC
src MAC : XP_MAC
Type : ipv4(0x0800)
</▲>
7. BT5->xp (icmp reply)
xp에서 보낸 ICMP를 BT5가 받고 xp에게 ICMP(Reply)를 보내준다.
icmp(4계층)
echo reply data[abcd...]
ip(3계층)
src IP : 200.200.200.41(BT5)
dst IP : 200.200.200.42(xp)
[data(icmp)]
Ethernet(2계층)
dst MAC : XP_MAC
src MAC : BT5_MAC
Type : ipv4(0x0800)
</▲>
# 통신과정헤더구조 #
XP(200.42)->BT(200.41) - icmp(request)
icmp : echo | request | data[abcd...]
ip : 200.200.200.41(BT) | 200.200.200.42(xp) | [data(icmp)]
eth : DST_MAC(?)
==== STOP ====
XP->BT - arp(request)
arp : eth(1) | ipv4(0800) | 6 | 4 | Request(1) | XP_MAC | 200.200.200.42(xp) | 00:00:00:00:00:00 | 200.200.200.41(BT5)
eth : PRE | SFD | FF:FF:FF:FF:FF:FF | XP_MAC | ARP(0806) | [data(arp)] | PAD(18Byte) | FCS
-> xp에서는 ARP Cache Table에 200.200.200.2 00:00:00:00:00:00 갱신 (0~0은 채워달라는 의미 F-F는 브로드캐스트)
BT - arp받음
eth : PRE | SFD | F-F | XP_MAC | ARP(0806) | [data(ARP)] | PAD(18Byte) | FCS
arp : eth(1) | ipv4(0800) | 6 | 4 | Request(1) | XP_MAC | 200.200.200.42(xp) | 00:00:00:00:00:00 | 200.200.200.41(BT5)
BT(200.41)->XP(200.42) - arp(reply)
arp : eth(1) | ipv4(0800) | 6 | 4 | Reply(2) | BT_MAC | 200.200.200.41(BT5) | XP_MAC | 200.200.200.42(xp)
eth : PRE | SFD | XP_MAC | BT_MAC | ARP(0806) | [data(arp)] | PAD(18Byte) | FCS
XP - arp받음
eth : PRE | SFD | XP_MAC | BT_MAC | ARP(0806) | [data(ARP)] | PAD(18Byte) | FCS
arp : eth(1) | ipv4(0800) | 6 | 4 | Reply(2) | BT_MAC | 200.200.200.41(BT5) | XP_MAC | 200.200.200.42(xp)
XP(200.42)->BT(200.41) - icmp(reqeust)
icmp : echo | request | data[abcd...]
ip : 200.200.200.41(BT) | 200.200.200.42(xp) | [data(icmp)]
eth : PRE | SFD | BT_MAC | XP_MAC | ip(0800) | [data(ip)] | PAD(18Byte) | FCS
BT(200.41)->XP(200.42) - icmp(reply)
icmp : echo | reply | data[abcd...]
ip : 200.200.200.42 | 200.200.200.41 | [data(icmp)]
eth : PRE | SFD | BT_MAC | XP_MAC | ip(0800) | [data(ip)] | PAD(18Byte) | FCS