Study/Network

[Network]OSI 7 계층과 네트워크 패킷

seomj 2020. 7. 5. 17:37
Application (응용)
Presentation (표현)
Session (세션)
Transport (전송)
Network (네트워크)
DataLink (데이터 링크)
Physical (물리)

OSI 7 Layer

 

1 계층 - 물리 계층

 

네트워크의 기본 네트워크 하드웨어 전송 기술을 이룸

전기적, 물리적 세부사항을 정의

 

 

2 계층 - 데이터 링크 계층

 

포인트 투 포인트(Point to Point) 간 신뢰성있는 전송을 보장하기 위한 계층

주소 값은 물리적으로 할당 받는데, 이는 네트워크 카드가 만들어질 때부터 맥 주소(MAC daaress)가 정해져 있다는 뜻

데이터 링크 계층의 가장 잘 알려진 예는 이더넷

 

 

3 계층 - 네트워크 계층

 

여러 노드를 거칠 때마다 경로를 찾아주는 역할을 하는 계층

라우터가 이 계층에서 동작하고 이 계층에서 동작하는 스위치도 있음

데이터를 연결하는 다른 네트워크를 통해 전달함으로써 인터넷이 가능하게 만드는 계층

 

 

4 계층 - 전송 계층

 

양 끝단(End to end)의 사용자들이 신뢰성있는 데이터를 주고 받을 수 있도록 해 줌

-> 상위 계층들이 데이터 전달의 유효성이나 효율성을 생각하지 않도록 해줌

시퀀스 넘버 기반의 오류 제어 방식을 사용

전송 계층의 가장 잘 알려진 예는 TCP

 

 

5 계층 - 세션 계층

 

양 끝단의 응용 프로세스가 통신을 관리하기 위한 방법을 제공

TCP/IP 세션을 만들고 없애는 책임

 

 

6 계층 - 표현 계층

 

코드 간의 번역을 담당

 

 

7 계층 - 응용 계층

 

응용 프로세스와 직접 관계하여 일반적인 응용 서비스를 수행

 

TCP/IP 4 계층도 알아두어야 할 필요가 있다.

 

이는 패킷 통신 방식의 인터넷 프로토콜인 IP (인터넷 프로토콜)와 전송 조절 프로토콜인 TCP (전송 제어 프로토콜)로 이루어져 있다.

 

TCP를 기반으로 한 많은 수의 애플리케이션 프로토콜들이 IP 위에서 동작하기 때문에, 묶어서 TCP/IP로 부르기도 한다.


패킷의 전반적인 구조는 이러하다.

2계층 패킷 정보 3계층 패킷 정보 4계층 패킷 정보 5계층까지의 정보

 

 

Ethernet header

이더넷 헤더 : Destination MAC Address(6B), Source MAC Address(6B) 그리고 Ether Type(2B)로 구성

 

Ehter Type : 3 계층 패킷의 타입을 명시하는 역할

                0x0800 : IPv4

                0x0806 : ARP

                0x08dd : IPv6

 

 

IP header

Version : IP protocol 버전. IPv4, IPv6 등

 

Length (Header Length) : IP 헤더의 길이 (20 바이트)

                                 필드 값은 거의 항상 5 (*4를 해서 20바이트인 것을 의미)

 

Type of Service : 서비스의 우선 순위를 제공

 

Total Length (Total Packet Length) : 전체 IP 패킷의 길이를 바이트 단위로 나타냄

 

Time-to-live : 데이터를 전달할 수 없는 것으로 판단되어 소멸되기 이전에 데이터가 이동할 수 있는 단계의 수

                   1에서 255 사이의 값을 지정하며 라우터들을 패킷을 전달 할 때마다 이 값을 감소

 

Protocol : 상위 계층 프로토콜

             1 - ICMP

             2 - IGMP

             6 - TCP

             17 - UDP

 

Source Address : 출발지 IP 주소

 

Destination Address : 목적지 IP 주소

 

 

TCP header

Source Port : 보내는 사람의 포트번호

 

Destination Port : 받는 사람의 포트번호

 

Sequence number : 전송되는 데이터의 모든 바이트에 고유한 일련 번호 부여

                          데이터를 올바른 순서로 재배열

 

Acknowledgement number : 수신하기를 시다리는 다음 바이트 번호

 

 


네트워크 패킷 출력해주는 소스코드

import socket
import struct

def ip_a(ip):
	res=str(int(ip[0]))
	res+="."
	res+=str(int(ip[1]))
	res+="."
	res+=str(int(ip[2]))
	res+="."
	res+=str(int(ip[3]))

	return res

def mac_a(mac):
	res =""
	for i in range(6):
		res += '%02X' % mac[i]
		if i != 5:
			res += ':'
	return res

conn=socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))
while True:
	data = conn.recvfrom(65536)

	dst_mac, src_mac, eth_typ = struct.unpack('! 6s 6s H', data[:14])
	src_maca = mac_a(src_mac)
	dst_maca = mac_a(dst_mac)

	ip_p, t, src_ip, dst_ip = struct.unpack('! c 2s 4s 4s', data[23:34])
	src_ipa=ip_a(src_ip)
	dst_ipa=ip_a(dst_ip)

	src_port, dst_port = struct.unpack('! H H', data[34:38])

	print("\n***************************************")

	print("Source MAC :", src_maca)
	print("Destination MAC :", dst_maca)

	if eth_typ == 0x800:
		print("Source IP :", src_ipa)
		print("Destination IP :", dst_ipa)

		if ip_p == b'\x06':
			print("Source Port :", src_port)
			print("Destination Port :", dst_port)
		else:
			print("TCP가 아님")

	else:
		print("IP가 아님")