Hi yoahn 개발블로그

컴퓨터 네트워크 및 실습 - 네트워크 모듈 본문

sswu/컴퓨터네트워크

컴퓨터 네트워크 및 실습 - 네트워크 모듈

hi._.0seon 2020. 6. 10. 16:43
반응형

네트워크 관련 파이썬 모듈

IP 주소와 ipaddress 모듈

TCP/IP 에서는 호스트를 식별하기 위해 IP주소를 사용

 

- IP 주소 표현 방법: IP주소/(네트워크 주소의 자리 수)

ex) "192.168.100.10/24" -> 24비트가 네트워크 주소 표현을 위해 사용됨

 

1. IPAddress 모듈

- IP 주소를 표현하고 처리하기 위해 사용됨

- 파이썬에서 아용되는 IP 주소를 나타내기 위한 클래스

 

ipaddress.ip_address()

- IP 주소 객체 생성

IPv4, IPv6 자동 인식

 

IPv4, IPv6 호스트 주소 객체 직접 생성

- ipaddress.IPv4Address('192.168.0.1')

- ipaddress.IPv6Address('2001:ab8::2000')

 

IP주소 속성

- 주소 객체 속성을 이용하면 주소 속성 접근 가능

is_multicast 멀티캐스트 주소인지

is_private   사설망 주소이면 T

is_global    공중망 주소이면

is_unspecified   주소 용도가 지정 안되어있으면 T

is_reserved    유보된 주소이면 T

is_loopback    루프백 주소이면 T

 

- addr = ipaddress.ip_address('127.0.0.1')

- addr.version => 4

IP 주소 객체의 version을 알려준다(IPv4, IPv6)

 

2. socket 모듈

socket 이란?

- 통신 채널의 종단점이다.

- 통신을 하기 위해서는 프로그램이 socket 에 접속해야 한다.

- socket 모듈은 호스트에 관한 정보를 알아내고, socket 에 접속하여 데이터를 송수신 할 수 있는 함수를 제공한다.

 

socket.gethostname()

- 호스트이름 -> 문자열 주소이름 반환

- 자신이 사용하고 있는 컴퓨터 이름 검색

'DESKTOP-T6HFAIH'

 

socket.gethostbyname(host)

- 문자열 호스트 이름을 IP 주소로 변환한다. (host=www.python.org -> 151.101.88.223 )

 

socket.gethostbyname_ex(host)

- 호스트에 대한 더 많은 정보에 액세스

- 표준 호스트 이름, 별칭, 호스트에 사용 가능한 모든 IP주소를 튜플로 반환

          = ( hostname, aliaslist, ipaddrlist )

 

socket.getfqdn(domain이름)

- 약식 서버이름으로부터 완전한 서버 이름을 검색

(문자열 주소에 대한 완전한 도메인 이름을 확인하기 위해서 사용)

 

socket.gethostbyaddr(ip주소)

- addr에 대한 host를 검색하는 함수

- 호스트의 ip주소를 알고 있으면 호스트의 문자열 주소를 알아낼 수 있음

- 호스트 정보를 ( hostname, aliaslist, ipaddrlist ) 튜플로 반환

 

3. 주소 유형(address family)과 소켓 유형(type)

- 주소 유형과 소켓 유형을 이용하여 데이터 전송 방식을 결정

- TCP/IP 프로토콜 구성

TCP/IPOSI프로토콜
응용계층응용계층DNS, DHCP, FTP, HTTPS, IMAP, POP3, SSH, SMTP, Telnet, TFTP
표현계층JPEG, MIDI, MPEG, PICT, TIFF
세션계층NetBIOS, NFS, SQL, ZIP, PAP
전송계층전송계층TCP, UDP
네트워크계층네트워크계층IPv4, IPv6
네트워크 인터페이스 계층 (접속 계층)데이터링크계층ARP, ATM, STP, CDP, ,
물리 계층Bluetooth, Ethernet, Wifi, ISDN

- 주소 유형: 사용할 네트워크 계층 프로토콜을 지정

                   -> 데이터 헤더나 페이로드에 담아서 보냄 (IPv4, IPv6)

- 소켓 유형: 전송계층 프로토콜을 지정한다.

                  -> TCP/UDP

 

응용계층 프로토콜 -> 이메일, 인터넷 등 어플리케이션에서 사용하는 것들

 

파이썬이 지원하는 3가지 주소 유형

1) AF_INET

IPv4, 대부분 인터넷에서 사용

10진 표기법, 4byte=32bit

 

2) AF_INET6

IPv6 인터넷 주소 지정에 사용, 128비트 주소

 

3) AF_UNIX

- posix 호환 시스템에서 사용할 수 있는 프로세스간 통신 프로토콜(UDS) 주소 유형

- UDS구현하면 os가 네트워크 스택을 거치지 않고 프로세스간 직접 데이터 전달

- 파일 시스템이 주소 지정을 위한 네임스페이스로 사용됨

-> 동일한 시스템의 프로세스로 제한

소켓 유형

1) SOCK_STREAM

- 스트림 지향 전송

- 신뢰성있는 전송을 보장하는 TCP 프로토콜 사용

- HTTP와 같이 대부분의 응용 프로토콜에서 사용

- 메시지 순서, 재전송이 자동으로 처리되어 복잡한 응용 프로그램을 만드는 것이 간단해짐

 

2) SOCK_DGRAM

- 메시지 지향 데이터그램 전송

- 비신뢰성 전송을 하는 UDP 프로토콜 사용

- 멀티캐스팅에서 사용

- UDP: 사용자 데이터그램 프로토콜

 

UDP와 TCP 유형은 IPv4, IPv6모두 지원

 

3. 인터넷 서비스 정보 찾기

- 인터넷 응용 서비스 이름& 할당된 포트번호 알아내기

- 프로토콜 이름으로부터 할당번호 알아내기

service: 응용계층이 제공하는 프로토콜 (http, ftp, telnet,,,)

proto: 전송계층 프로토콜 (TCP/UDP)

 

- 인터넷 서비스 정보 검색을 위해 사용되는 함수

1) socket.getservbyname()

- 프로토콜의 포트 번호 확인

 

- IP주소가 하나인 호스트에서 다수의 응용프로그램 실행 가능

- 각각의 응용 프로그램은 고유한 소켓과 연결

- 소켓 = IP주소 + 포트번호 로 식별

- 특정 프로토콜 -> 지정된 포트 번호 할당되어있음

 

getservbyname(servicename, [protocolname])

servicename: 응용서비스 프로토콜(http, ftp,)

protocolname: TCP, UDP 전송계층 프로토콜

 

- 인터넷 응용프로토콜에 대한 포트번호 반환

>>> socket.getservbyname('http')

80

 

- 전송계층에 대한 프로토콜 이름이 포트로 어떻게 매핑되어있는지 확인

>>> socket.getprotobyname('tcp')

6

 

2) urllib.parse.urlparse()

- URL을 6개 요소로 분해

scheme: url에서 처음부터 :까지의 정보 (http, https, ftp, ,,)

parsed_url=urlparse(url)

socket.getservbyname(parsed_url.scheme)

-> scheme과 port 속성을 조사하여 프로토콜에 대한 포트번호를 확인한다

 

3) socket.getservbyport(port)

- 포트번호로부터 서비스 알아내기

 

4) socket.getprotobyname(proto)

- 프로토콜 이름으로부터 프로토콜 번호 알아내기

socket 정보 찾기

socket의 속성값 알아내기

- dir(socket) : socket의 모든 속성 표시

- getattr(socket, '모듈의 속성 이름')

getattr(socket,'AF_INET') -> socket의 AF_INET 속성값 반환

 

- getaddrinfo() 함수로 소켓에 대한 정보 찾기

socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)

- host : 도메인 이름 (ip주소 or 문자열 주소)

- port : 서비스 이름 or 포트 번호

 

- return: (family, type, proto, cannonname, sockaddr)

- 주소 유형, 소켓 타입, 네트워크 계층 프로토콜, ?, sockaddr=(ip, port) 소켓 주소

IP 주소 변환

- 컴퓨터 언어에 따라 IP주소를 표현하는 방법이 다르다

- IP주소 표현을 서로 변환할 필요가 있다.

inet_aton(), inet_ntoa()

10진 주소(a) <-> network 주소

 

바이트 순서 변환

- 멀티 바이트 데이터를 저장하는 순서 변환

- 호스트 바이트 순서

  컴퓨터가 메모리에 저장하는 순서 (BigEndian, LittleEndian)

(높은 바이트부터 표시)

 

- 네트워크 바이트 순서

  네트워크에서 바이트 단위로 데이터가 전달되는 순서

(낮은 바이트부터 표시)

Network -> host 주소32bitsocket.ntohl(x)
16bitsocket.ntohs(x)
host -> Network 주소32bitsocket.htonl(x)
16bitsocket.htons(x)

(양의 정수 x)

 

 

 

 

 

 

 

 

 

반응형
Comments