IP header & Ethernet header

이미지
1. IP(Internet Protocol) header  - 20 바이트 고정크기 사용가능  - 옵셔널 필드가 존재하여 사실은 가변크기  - 최근에는 옵셔널 필드를 거의 사용하지 않기 때문에 20바이트로 고정되어있다. 1.1. IP 헤더의 구성 Figure 1.1 IP헤더의 구조  - Version (4bits)    Internet Protocol의 버전을 나타내며 4비트를 차지한다. 주로 IPv4를 사용하기때문에 주로 4이다.  - Header Length(4bits)    IP 헤더의 길이를 나태내며 4비트를 차지한다. 옵션의 유무에따라 길이가 달라진다. 4 비트로 최대 표현 할 수 있는 값은 15 하지만 IP헤더의 최소 길이는 20이라서 값을 구할때 4(2^2)를 곱해서 정확한 값을 구한다.  - Service field (1byte)    지금은 사용되지 않는다. 고로 0으로 지정해주면 됨.  - Total Length(Ip 패킷의 전체 크기) (2bytes)    IP 패킷의 전체의 길이 정보를 가지고있다.  - Identification (2bytes)    패킷을 식별하는 번호를 가진다.  IP 클라이언트에 따라 분할된 패킷은 같은 정보를 가지게 된다.  - Flag & Fragment offset (2bytes)  - TTL(Time TO Live) (최대 홉의 갯수) (1byte)   최대로 지날 수 있는 라우터의 숫자를 나타낸다.    Linux = 64    Windows= 128    Unix= 254  - Protocol type (1byte)   프로토콜 번호를 가지고 있다.   TCP = 0x06   ICMP = 0x11   UDP = 0x01  - Header Checksum (2bytes)    패킷의 오류를 검사하는 용도로 쓰이는 데이터  - Source Address (4bytes)    송신지(발신지)의 IP 주소를 담고있다.  - Des

OSI 하위 4 계층

이제 각 계층에 대해서 알아보자. 4계층(Transport Layer) - 전송 계층으로 데이터의 전송을 담당한다. - 어디로, 어디에서 전송이 되었는지. - 프로토콜    UDP 와 TCP가 있다.    Protocol Data Unit/PDU(프로토콜 데이터 단위 ) = Segment    주소체계: 포트(Port) 3계층(Network Layer) - 전송 루트를 담당 - 서로 다른 네트워크간의 통신(경로결정) - 주소체계 : IP Address    ip 주소는 네트워크상에서 호스트를 식별하기 위한용도.    호스트를 찾고, 경로를 설정 - 프로토콜    IP, ICMP, 라우팅 프로토콜(OSPF, RIP)    PDU( Protocol Data Unit/프로토콜 데이터 단위) : packet 통신방식 - 유니캐스트 = 1:1 - 브로드 캐스트 = 1:n (같은 네트워크에 있는 호스트에게 방송) - 멀티 캐스트 = 1:n (정해진 범위 내에 있는 호스트와 통신) IPv4 -  네트워크상에서 호스트를 식별할 수 있는 번호 부여 - 4byte(32bit) 0~42억개 정도 - IANA : 주소체계, 배포, 관리 - 4자리 숫자를 '.' 으로 구분하여 표기 IP Class  A Class   - 첫번째 1자리의 숫자를 네트워크 아이디로 사용   - 나머지 3개의 숫자를 호스트의 번호로 사용   - 총 254개의 네트워크를 소유   - 첫 번째 비트가 0으로 공통 비트를 갖도록 설정 ID : 0 000 0000 ~ 0 111 1111 :  0~127개 즉 126개 네트워크를 표현 > 1개는 사설 네트워크별 호스트의 아이디 표현범위 :  0.0.0 ~ 255.255.255 : 16,777,214개의 호스트 !사용할 수 없는 번호 - 0.0.0.0 : 네트워크의 대표 아이피 - 255.255.255.255 ( broadcasting IP ) - 127번은 특별

UDP 헤더의 구조와 스니퍼를 이용한 UDP통신 가로채기

이미지
1. UDP (user Datagram Protocol) * UDP 는 User Datagram Protocol의 약자로 TCP와 함께 잘 알려진 프로토콜이다. UDP는 TCP와 함께 단문데이터 전송에 사용된다. UDP의 전송방식은 단순하여 속도가 빠르나 데이터의 도착 순서가 바뀌거나 중복되거나 누락기도 한다 하지만 자체적인 오류 검사와 수정이 없어 신뢰성이 떨어진다.  UDP헤더는 총 8 bytes 로 구성이 되어있으며 다음 그림(Figure 1.1)과 같다 Figure 1.1 UDP Header 1) 출발지 포트정보 :2bytes 2) 목적지 포트정보 :2bytes 3) 전체 헤더의 길이(헤더+데이터)세그먼트: 2bytes 4)체크섬 :2bytes 앞에서 작성한 udp 서버와 클라이언트를 이용하여 데이터를 전송하고 스니퍼를 이용해서 전송되는 패킷을 가로채면 그림(Figure 1.2)과 같은 패킷을 얻을 수 있다. Figure 1.2 패킷데이터 데이터를 전송할때 각 계층을 지나면서 패키징을 하는데 이 과정은 각 계층을 지날때마다 헤더를 추가해주는 작업을 말한다. 먼저 헤더와 프로토콜헤더는 무엇인가? - 헤더란 전송하려는 데이터에 맨 앞에 위치한 문자열(보충데이터)를 칭한다. - 프로토콜헤더는 각 계층별 정보를 담고있는 헤더를 말한다. 먼저 위에 그림(Figure 1.2)에서 UDP 헤더만 분리하여 분석해보겠다. UDP헤더는 전송하려는 메시지 앞 8바이트가 UDP 헤더다. UDP헤더는 8바이트 고정크기를 가진다. 스니퍼에서 가로챈 통신은 다음과 같다. data:  b"\x00\x0c)\xbdL\xe7\x00\x0c)K\xb0Z\x08\x00E\x00\x00 \x00\x00@\x00@\x11\xb9m\xc0\xa8\x00\x08\xc0\xa8\x00\x07\xcbJ'\x15\x00\x0c\xa4<test 여기에서 UDP 헤더만 분리하면 b"\xcbJ'\x15\x00\x0c

RAW_SOCKET Programming: Sniffer(dump) program

이미지
1. Sniffer(덤프) 프로그램을 이용하여 NIC(Network Interface Card)로 드나드는 패킷을 sniffing (가로채다) 을 하여 패킷을 분석해보겠다. 먼저 패킷을 가로채기 위해 sniffer(덤프) 프로그램을 만들어보자. 그림(Figure 1.1)과 같이 파이썬으로 작성을 하면 된다. Figure 1.1 Sniffer.py 스니퍼 작성이 끝나면 전에 작성한 UDP 클라이언트 파일과 서버 파일을 이용하여 단어를 전송하고, 스니퍼를 이용하여 서버와 클라이언트의 통신을 가로채 보겠다.  Figure 1.2 UDP Client.py Figure 1.3 UDP Server.py 서버와 클라이언트가 통신하기 전에 작성한 스니퍼 프로그램을 작동을 시키면 그림(Figure 1.4) 과 같이 현재 통신이 이루어지고 있는 내용을 볼 수 있다.  Figure 1.4 스니퍼 작동 아주 빠른속도로 많은양의 로우데이터를 보여주기에 python3 sniffer.py > log.txt 라는 명령어를 입력 스니퍼의 출력 내용이 log.txt파일로 저장되게 한 후 vi 에디터를 이용해 log.txt파일을 열고 test라는 문자열을 검색하면 다음과 같이 쉽게 찾을 수 있다. Figure 1.5 Log.txt 스니퍼를 이용하면 그림 (Figure 1.5) 과 같이 서버와 클라이언트가 주고 받은 통신의 내용을 볼 수 있다. 다음에는 가로챈 로우데이터가 어떠한 정보를 담고 있는지 분석해보겠다.

파이썬을 이용한 TCP 소켓 프로그래밍.

이미지
1. TCP 소켓 프로그래밍 Method. - socket.bind(('IP address', Port number)) -> IP주소와 포트 번호 지정 - socket.listen(0) -> 클라이언트로부터 연결을 받을 수 있는 상태로 지정. - socket.accept() -> 클라이언트로부터의 연결을 허가함. - socket.recv(데이터 사이즈) -> 데이터를 전송받음. - socket.connect(('IP address', Port number)) -> 지정된 IP와 port 번호로 연결을 시도한다. - socket.send( Data ) -> 데이터를 전송한다. 2. 간단한 TCP 서버와 클라이언드를 만들어 데이터를 전송해보자. - TCP 서버를 그림(Figure 2.1)과 같이 만든다. Figure 2.1 TCP 서버. - TCP 클라이언트를 그림(Figure 2.2) 과 같이 만든다. Figure 2.2 TCP 클라이언트. - TCP 클라이언트에서 HI Gihun 라고 서버로 데이터를 전송하면 결과는 그림(Figure 2.3)와 같이 출력이 된다. Figure 2.3 결과 출력. 3. TCP 에코서버 만들기 - 클라이언트에서 받은 데이터를 서버가 다시 클라이언트로 돌려주는 서버를 만들어보겠다. - TCP 에코서버를 그림(Figure 3.1) 과 같이 만든다. Figure 3.1 에코서버 - TCP 클라이언트를 그림(Figure 3.2)과 같이 만든다. Figure 3.2 클라이언트. - 클라이언트가 서버로 Hi Gihun이라는 데이터를 보내면 서버에는 Hi GIhun을 받았다고 출력이 되고(Figure 3.3) 서버는 클라이언트에게 전송받은 데이터를 돌려준다. 클라이언트는 Hi Gihun을 출력한다.(Figure 3.4) Figure 3.3 에코서버 결과 Figure 3.4 클라이언트 결과 이렇게 T

UDP 소켓을 이용하여 에코서버와 통신하기.

이미지
이번에는 파이썬 UDP 소켓을 이용하여 에코서버 실습을 해 볼 것이다. 먼저 에코서버와 클리이언트가 필요하다. 1. 에코서버.  에코서버의 역활은 클라이언트에게서 받은 문자열을 다시 클라이언트에게 되돌려 전달하는 것 이다. 구성은 아래와 같다. - 서버 소켓을 생성     sock = socket.socket(socket.AF_INET, socekt.SOCK_DGRAM) -데이터를 받을 포트번호를 지정 sock.bind('',포트번호) -수신 sock.recvfrom(데이터사이즈) -송신 sock.sendto() 아래의 그림(Figure 1.1) 처럼 스크립트를 작성한다. Figure 1.1 UDP Server 2. 클라이언트. 클라이언트의 역활은 서보로 문자열을 전송하고 서버로부터 되돌아오는 문자열을 출력. - 클라이언트 소켓을 생성  sock = socket.socket(socket.AF_INET, socekt.SOCK_DGRAM) -데이터를 전송할 서버 주소와 포트를 지정  sock.bind('',포트번호) -데이터 전송  sock.sendto() -데이터 수신 sock.recvfrom(데이터사이즈) 아래의 그림(Figure 2.1 ) 처럼 스크립트를 작성. Figure 2.1 UDP Client 3. 결과. 클라이언트에서 작성한 스크립트에서 test라는 문자를 서버로 전송하자 서버는 송신자의 ip주소와 데이터 사이즈를 그림(Figure 3.1) 과 같이 출력했다. 그리고 클라이언트는 그림(Figure 3.2) 과 같이 test라는 문자열을 되돌려받아 출력했다. Figure 3.1 Result UDP echo Server Figure 3.2 Result UDP Client 다음에는 파이썬을 이용하여 TCP 소켓을 프로그래밍 후 통신해보겠다.