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가 아님")
'Study > Network' 카테고리의 다른 글
[Network]NAT(Network Address Translation) (0) | 2023.05.26 |
---|---|
[Network]ACL(Access Control List) (0) | 2023.05.25 |
[Network]Static Route (0) | 2023.05.22 |
[Network]프러미스큐어스 모드 설정하기 (2) | 2020.06.28 |
[Network]hosts 파일을 이용해 이름 해석하기 (0) | 2020.06.28 |