본문으로 바로가기

network패킷 구조

category 네트워크 2020. 6. 26. 02:42

1.osi 7 Layer | TCP/IP Layer

쉽게 외우는 방법

Please   -1L

Do       -2L

Not      -3L

Touch   -4L

Stive     -5L

Pet       -6L 

Aligator -7L

 

 

+프로토콜: 통신 규약(약속)

 

TCP/IP Layer의 흐름 구조

요청:데이터 통신을 할떄 계층아래로 가면서 정보를 얻는다. 이후 패킷 전송

수신:반대로 2->3->4->5로 진행하면서 패킷 수신

 

 

웹통신

 

ETH/IP/TCP/DATA

0~14/~34/~54/~

 


ETHERNET HEADER= MACHEADER

 

구성

 

Destinate mac/Sourse mac/Ether type

 

~6/~6/~2

 

14bytes

 

 

Ether type

0800 -> ip 프로토콜 이용

0806 -> arp 통신

 

08dd ->ipv6

 


ip header

 

 

 

protocal ID

ip에서 ethernet type 같은 역할

  1. tcp(6)->안끊기는거(손상없는거)

  2. udp(17)->끊기는거

  3. icmp(1)

 

version

  • 4-> 192.221.~~

  •  

    6-> fe80::asd~~~

     

     

IHL

5 -> ip header 길이

5-> *4를 해서 20바이트인것을 의미 한줄에 4바이트(32비트) ->ip header 사진 참고

 

Total length

ip부터 http까지의 길이

 


tcp hearder

 

 

port

  • 80->http 포트

  • 22->ssh

  • 443->https

  •  

    53->dns

     

     

     


socket?

전화기 같은 도구

 

통신 도구

 

 

 

패킷(destination,sourse)추출 파이썬 코딩

 

 

 

import socket
import struct

conn = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))


def IP(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 MAC1(mac):
	res=str(hex(mac[0]))[2:4]
	res+=":"
	res+=str(hex(mac[1]))[2:4]
	res+=":"
	res+=str(hex(mac[2]))[2:4]
	res+=":"
	res+=str(hex(mac[3]))[2:4]
	res+=":"
	res+=str(hex(mac[4]))[2:4]
	res+=":"
	res+=str(hex(mac[5]))[2:4]

	return res



while True:
	data, addr = conn.recvfrom(65536)

	dst_mac,src_mac,ef= struct.unpack("! 6s 6s H", data[:14])

	ip_pro,t,dst_ip,src_ip=struct.unpack("! c 2s 4s 4s", data[23:34])

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

	



	print(ip_pro)

	


	print("Destination: ",MAC1(dst_mac),"\n","source MAC: ", MAC1(src_mac))










	if ef==0x800:
		print("destination MAC: ",IP(dst_ip), "\n","Source MAC: ",IP(src_ip))
		if ip_pro==b'\x06':
			print("Source Port: ",src_port,"\n","Destination Port: ",dst_port)
		else:
			print("tcp가 아님")


		

	else:
		print("ip가 아님")



	print("  ")


tcp echo server client(client에서 전송한값 server에서 받기)

 

 

 

tcp server 소스

import socket


HOST = "172.31.9.19"   //자신의 ip설정
PORT= 6804   //원하는 포트 설정

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("binding...")
s.bind((HOST,PORT))
print("success to bind")

s.listen()
print("Listen...")

c,addr =s.accept()
print("Connected by",addr)


while True:
	data= c.recv(65536)
	if not data:
		break
	print('Received from',addr ,data.decode())
	c.sendall(data)

c.close()
s.close()

 

 

 

tcp client 소스

import socket

HOST ='172.31.9.125' //접속하려는 ip
PORT =7761  //접속하려는 포트

c =socket.socket(socket.AF_INET, socket.SOCK_STREAM)

c.connect((HOST, PORT))
while True:
	data = input().encode()
	if data == b'exit':
		c.close()
		break
	c.sendall(data)
	data=c.recv(65536)
	print('Received', repr(data.decode()))

'네트워크' 카테고리의 다른 글

airodump-ng(802.11 packet 잡기)  (0) 2021.02.15
와이파이 연결과정(IEEE 802.11)  (0) 2021.02.15
deauth attack(aireplay-ng)  (0) 2021.02.09