* NAT  환경
NAT 안쪽 : Interner
NAT 밖쪽 : Externer

게이트웨이 : 외부망과 내부망을 연결해주는 라우터이다.

게이트웨이에서 내부망으로 연결되는 사설 ip는
 보통 끝자리가 1 or 254이다.
(주로 그렇다는것이다. 꼭그런건 아니다.)

같은 네트워크에 있지 않으면 맥주소를 알 수 없다.
(같은 네트워크에 있다면  ARP를 통해 맥주소를 알 수 있다.)
이유는

ARP 패킷은 IP 패킷안에 패키징 되지 않기 때문에
라우터를 넘어가지 못한다.
그렇기 때문에 ARP는 같은 네트워크 안에서만 동작한다.

내부망에서는 MAC주소로 통신을 하고
외부망과의 통신은 IP주소만 가지고 통신을 한다.


내부망에서 어떻게 상대방의 맥주소를 알 수 있을까?
-ARP ( Address Resolution Protocol)
내부망에서 상대방의 맥주소를 알아야하는 이유는 게이트웨이까지 통신이 되야하기 때문이다.

1. ARP Request
        - Broadcast

2. ARP Reply



일단,
ARP 패킷을 한번 직접 받아서 분석해보겠다.

먼저 패킷을 덤프받는 코드를 조금 수정하였다.
어제까지 L2의 이더넷 헤더를 덤프받을 수 있었으므로
이더넷 헤더에서 ARP 패킷을 구분할 수 있다.

(마지막 부분에 ARP 표시한 코드)

 

 

 

(덤프받은 ARP 패킷 내용)

 

 

ARP 패킷 받은것
['0x0', '0x1',  '0x8', '0x0',  '0x6', '0x4',  '0x0', '0x1',
'0x90', '0x9f', '0x33', '0xeb','0x3b', '0x42',
'0xc0', '0xa8', '0x3', '0x60',
'0x0', '0x0', '0x0', '0x0', '0x0', '0x0',
'0xc0', '0xa8', '0x3', '0x67',
 '0x0', '0x0', '0x0',
 '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0',
'0x0', '0x0', '0x0', '0x0', '0x0', '0x0']

1. Hardware type (2바이트) : '0x0', '0x1 = 이더넷인터페이스
2. Protocol type (2바이트) : '0x8', '0x0' = 0x0800 = IPv4
3. Hardware length (1바이트) : '0x6'
4. Protocol length (1바이트) : '0x4'
5. Operation (2바이트) : '0x0', '0x1 = 1 : Request
                                                              2 : Reply
6. sender Mac Address (6바이트) : '0x90', '0x9f', '0x33', '0xeb','0x3b', '0x42'
7. sender IP Address (4바이트) : '0xc0', '0xa8', '0x3', '0x60', = 192.168.3.96
8. Target Mac Address (6바이트) : '0x0', '0x0', '0x0', '0x0', '0x0', '0x0',
     -> 모르니까 0으로 비워서 보내는 것이다.
9. Target IP Address (4바이트) : '0xc0', '0xa8', '0x3', '0x67'

그 뒤 0들은 프레임맞추기위해 집어넣은것이다.
-> 윈도우즈는 정기적으로 주기적으로 주변 host들에게 맥주소를 물어보는 작업을 한다. (3분? 정도마다)
  그리고 ARP 캐쉬테이블에 넣어둔다.
   커맨드 창에서 arp -a   로 확인할 수 있다.

 

 

 

(윈도우즈 ARP 캐쉬 테이블을 확인할수있다.)

 

 

다음주부터는 패킷을 직접 만들어볼것이다.

* 팁
 집에 갑자기 인터넷이 안될때 검사
1계층 - 잘 꼽혀있는지
2계층 - 나랑 게이트웨이가 통신이 잘되는지 확인
 - 게이트주소에 ping
게트웨이까지는 잘가는데 인터넷이 안되면
게이트웨이의 포워딩이 문제거나
통신사업자에서의 문제거나
3계층...
핑까지 서버에 잘 되는데 웹툰이 안보일때.
-> 이 때는 DNS 문제일 가능성도 있다.  nsloopup 이 안되는 경우가 있다.


또 오늘은 패킷을 보기 쉽게 한번
디자인해보았다.
코드를..

 

 

 

 (깔끔하게 구성된 화면)

Layer 1 - 물리적인 전송을 담당한다.
            - 전기 신호
 ex) 허브에 스타토폴로지로 host들이 연결되있다.
 한 host에서 전기신호를 보내고 그 전기신호를 수신하여서 데이터를 주고받는다.

Layer 2 - 데이터 링크 계층
 
 - 터널링관련 프로토콜 : PPP, L2TP, ...
 - 라우팅이 필요하지 않는 계층
 - 라우팅없이도 통신이 가능하다.
- 이더넷, 토큰링방식
 토큰링 방식 (토큰을 가진사람만 보낼 수 있고, 그 토큰은 네트워크를 돌아다닌다., 충돌을 예방하는 방법이다.)
  - 단점 : 토큰이 돌아서 내 차례가 될때까지가 오래걸린다.
 이더넷 : Collison Domain (충돌을 이용한다.)
 이더넷 헤더 (고정 : 14바이트)
 -우리는 보통 이더넷을 사용한다.

* 각 계층별 주소
L4 - Port Number
L3 - IP Address
L2 - MAC 주소. (Media Access Control) : 하드웨어 주소
 - 16진수 6자리  (유일한 주소)

 L2까지 합하면 패킷의 구성은
 
   - 이더넷 + IP + TCP/UDP + 데이터

지금까지 IP, TCP/UDP, 데이터까지 보았다.
 
기존에 만들었던건 윈도우즈 소켓을 이용해 패킷을 덤프했던 것이다.
이 윈도우즈소켓으로는 L3까지밖에 확인이 안된다.
그래서
L2까지 보기위해 다른 방법을 사용해보겠다.

새로 만든 모듈을 이용했다.



(모듈로 설정한 get_device)





(실행화면)



어떤 장치로 들어오고 나가는 내용을 화면에 출력할지를 정해야한다.
화면에서 Microsoft 라고 나온것이 무선어댑터 지금 사용하는 것이다.

 실행하면 인터페이스를 선택하라고 나온다.
이 때 여기서 나오는 인터페이스란

제어판에서 네트워크 정보에갔을 때 나오는 목록이다.
이 목록은 컴퓨터의 네트워크 장치이다.
이제 이 장치로부터 패킷을 가져와 열어보겠다는 것이다.





(두개의 어댑터)



이 화면은 집마다 다르다.

여기서 전에 소켓통신했던것과 유사하게
핸들러(장치를 다룰) 를 선언했다. 소켓과 비슷한 역할이다.

그 후 전에 덤프 프로그램과 비슷하게 작성해준다.



(패킷을 덤프받아 출력하는 코드)



이렇게 하면 전에 사용했던 프로그램과 비슷한 모양의 코드가 된다.



(실행 화면)



출력을 해보면 데이터가 출력된다.
캡쳐된 내용을 보면 앞에 14바이트 빼고는 지금까지 봤던 정보들이다.

앞에 14바이트는 이더넷프레임이다.


['0xff', '0xff', '0xff', '0xff', '0xff', '0xff', '0x90', '0x9f', '0x33', '0xeb', '0x34', '0xa1', '0x8', '0x0']

분석해보면
1. 도착지 맥주소(6바이트) :  0xff', '0xff', '0xff', '0xff', '0xff', '0xff
2. 출발지 맥주소(6바이트) : '0x90', '0x9f', '0x33', '0xeb', '0x34', '0xa1'
3. 프로토콜 타입(2바이트) : '0x8', '0x0'
                                          - 0x0800 -> IPv4  , IP 프로토콜
                                            0x8600 -> IPv6
                                            0x0806 -> ARP 프로토콜

통신을 하려면 MAC주소를 알아야한다. 하지만 우리는 IP주소만 알고있다.
그렇기 때문에
ARP 가 필요하다.
ARP : Address Resolution Protocol

이제 전에 작성했던 프로그램에서 L2까지 나오는프로그램으로 확장시켜본다.



(확장 코드)




(출력 화면)


출력 화면을 보면 이제 L2의 프레임 단위로 패킷을 확인할 수 있는것을 볼 수 있다.

이제 내일부터
이 내용을 가지고 네트워크를 살펴보겠다.




+ Recent posts