Download presentation
Presentation is loading. Please wait.
Published by선화 독고 Modified 8년 전
1
Python Socket/HTTP 20110456 overmania
2
목표 소켓을 이용하여 기본적인 서버 - 클라이언트 모델을 구현할 수 있다. 간단한 웹서버를 소켓을 이용하여 작성할 수 있다.
3
파이썬 소켓 Python socket/network
4
소켓 ? 프로세스 간 통신을 지원하는 프로그래밍 인터페이스 프로세스 간이기에 프로세스가 동일 머신에 있을 필 요가 없다. 머신에서 지원하는 API 이므로 운영체제마다 작동이 다를 수 있습니다. ex) Windows 에서는 select 함수가 socket 에서만 작동하지만, Linux 환경에서는 socket 과 file 에 모두 적용됩니다. 소켓은 입력과 출력이 모두 가능합니다.
5
소켓의 주소 유닉스 파일 소켓 유닉스는 소켓 또한 파일로 취급된다. 저수준 파일 입출력 을 위한 소켓을 지정할 수 있다. 주소값은 경로명이다. 로컬 머신 내이므로 TCP, UDP 모두 신뢰 AF_UNIX 로 선언 가능. 네트워크 소켓 인터넷을 통한 AF_INET 은 IPv4 주소를 가지는 소켓. AF_INET6 는 IPv6 주소를 가지는 소켓.
6
소켓의 타입 SOCK_DGRAM Datagram 을 통해서 데이터를 송수신한다. UDP 를 이용하고 UDP 특성상 segment 가 정상적으로 전달되지 않을 수 있다. SOCK_STREAM Stream 을 통해서 데이터를 송수신한다. TCP 를 이용하고 TCP 특성상 reliable 하게 전송된다. SOCK_RAW Process 가 직접 internal network protocol 과 interface 에 접근 가능하도록 하는 소켓입니다. 루트 권한이 있어야 작동하 고 IP packet 을 직접 분석해볼 수 있습니다.
7
클라이언트 / 서버 모형 서버 : 서비스를 제공하는 주체 클라이언트 : 서비스를 제공받는 주체.
8
소켓 작동 순서 아래와 같은 시나리오로 작동합니다.
9
포트 머신에서 해당 프로세스를 찾는데 필요한 숫자. 1~65535 의 범위를 가질 수 있습니다. 1~1024 는 이미 예약이 된 포트이므로 그 특정한 서비 스를 위해서 만드는 프로그램이 아니면 사용될 수 없 습니다. 파이썬에서 port 에 0 을 주면 사용되지 않는 포트를 자 동으로 할당해줍니다.
10
서버 소켓 관련 함수 socket.socket([family[, type[, proto]]]) socket.bind(address) socket.listen(backlog) socket.accept() socket.close()
11
socket.socket([ family [, type [, proto ]]]) address family, socket type, protocol 를 인자로 받습니다. Address family : 소켓의 주소 형태를 선언 (AF_UNIX, AF_INET, AF_INET6 등 ). Socket type : 소켓이 TCP, UDP, RAW 등 어떠한 통신 규 약으로 데이터를 전송하는지 정한다. (SOCK_STREAM, SOCK_DGRAM, SOCK_RAW) Protocol : 일반적으로 0 이나, IPPROTO_IP 등 소켓 주소 를 더 구체적으로 선언 가능.
12
socket.bind(address) 소켓을 해당 주소에 bind 합니다. address 는 socket address 타입에 맞게 들어가야 합니다. AF_INET -> IPv4, AF_INET6 -> IPv6 Address 는 네트워크 소켓에서 (HOST, PORT) 라는 튜플 인자입니다. HOST = socket.gethostbyname(‘’) ‘localhost’ ‘’ 어떻게 다를까요 ??
13
socket.listen( backlog ) 해당 소켓 Object 를 다른 소켓의 connect 요청을 수행 할 수 있도록 만듭니다. Backlog 는 대기 상태로 받아들일 수 있는 최대 요청의 숫자. ( 시스템마다 다르고, 일반적으로 최대 5) Backlog 이상의 요청이 오면 클라이언트는 connection refuse 를 받게 됩니다. Server socket 을 listen 상태로 두고 연결이 오면 새로운 socket 을 생성하는 식으로 처리합니다.
14
socket.accept() Listen 상태의 socket 이 connect 요청을 받을 경우 accept 를 통해서 connection 을 accept 할 수 있습니다. 반환값은 ( 연결된 소켓, 연결된 소켓의 주소 ) 의 pair 입 니다. 반환된 (conn, conn_addr) 에서 conn 을 통해 클라이언 트와 통신이 가능하다.
15
socket.close() 송수신이 완료된 소켓을 종료하는 함수입니다. 비정상 종료되어 close() 되지 않으면 해당 포트에 소켓 을 bind 하지 못하니 주의하세요. Server 의 경우 listen 소켓을 서버가 종료될 때 같이 종 료될 수 있도록 처리합니다. Accept 로 생긴 소켓은 처리가 완료되면 꼭 close 합니 다.
16
클라이언트 소켓 관련 함수 socket.socket([family[, type[, proto]]]) socket.connect(address) socket.close()
17
socket.connect( address ) Remote HOST 에 연결을 시도합니다. Address 는 Server 에서 bind 할 때처럼 (HOST, PORT) 의 tuple 입니다. HOST 는 연결할 서버의 주소. PORT 는 연결하려는 서버가 서비스를 제공하고 있는 포트.
18
중요한 소켓 함수들 socket.send(string[, flags]) socket.recv(bufsize[, flags]) socket.gethostbyname(hostname) socket.getaddrinfo(host, port[, family[, socktype[, proto[, flags]]]])
19
Blocking vs Non-Blocking Blocking : recv 나 send 가 호출될 때 명령이 수행될 때 까지 더 이상 함수를 호출하지 않음. Non Blocking : recv 나 send 호출이 즉시 실행되지 않으 면 error exception 발생. 기본적으로 생성된 소켓은 blocking socket socket.setblocking(flag) 을 이용해서 바꾸어준다. flag == False -> non-blocking flag == True -> blocking
20
Time out Blocking socket 은 클라이언트가 연결하고 전송하지 않 을 경우 다른 명령을 처리할 수가 없다. 몇 초 동안 전송하거나 전송받기를 기다릴 것인지를 timeout 을 설정함으로써 구현할 수 있다. Blocking socket 에 socket.settimeout(value) 을 이용하면 된다.
21
다중 연결 처리 여러가지 방법이 있습니다. 1. 멀티프로세스 2. 멀티스레드 3. select( 이벤트 처리 방식 ) 멀티 프로세스와 멀티 스레딩. 하나의 데이터를 여러 연결이 공유해야 하는 상황이 오면 곤란합니다. 하지만 그렇지 않은 경우만을 고려해봅시다.
22
멀티 프로세스 프로세스 : 컴퓨터 내의 작업 수행단위 ( 프로그램이 메모리 영역에 올라가 실행 중인 상태 ) 전략 Listen 하고 있는 소켓이 accept 를 통해서 새로운 연결을 받 을 경우 새로운 프로세스를 생성하여 connect 된 소켓과의 통신을 담당하게 한다. 주의점 프로세스가 명령을 수행한 후에 남아있으면 시스템의 메모 리가 낭비됩니다.( 좀비 프로세스 ) ( 그 외에 일반적인 프로세스 단점들 )
23
select 를 이용한 다중연결처리 select.select(rlist, wlist, xlist[, timeout]) 세가지 리스트로 소켓을 구분합니다. rlist : 읽기가 block 되었는지 검사 wlist : 쓰기가 block 되었는지 검사 xlist : 예외 발생 검사. Timeout 을 option 으로 줄 수도 있습니다. Performance 는 ……
24
소켓의 고급 설정은 ? socket.setsockopt(level, optname, value) SO_REUSEADDR 설정하면 디버깅할 때 편합니다 Timeout 을 기다리는 소켓을 kernel 이 재사용할 수 있습니다. man(2) setsockopt man(2) setsockopt socket option socket option
25
몇 가지 중요한 TCP 관련 설정들 SO_REUSEADDR TIME_OUT 에 들어간 port 에 다시 bind 할 수 있도록 만들어 주는 옵션
26
몇 가지 중요한 TCP 관련 설정들 TCP_NODELAY Nagle Algorithm 이라는 패킷 역위 방지 알고리즘을 꺼 전송 속도를 높입니다. SO_LINGER Linger : to remain just alive for some time prior to death 소켓이 close 요청을 할 때, 송신 버퍼의 모든 내용을 전송 할 때까지 kernel 에서 응용프로그램으로 복귀하지 않는다. Port 가 TIME_WAIT 상태에 들지 않도록 하는데 많이 쓰입 니다.
27
소켓 서버 모듈 소켓 서버의 구조는 연결 요청을 감지하는 Server 요청되는 연결을 처리하는 Handler 예제 코드를 보면서 어떻게 쓰는지 봅시다.
28
실습
29
HTTP 프로토콜
30
HTTP 란 무엇인가 Hyper Text Transfer Protocol 인터넷 환경이 다양한 형식의 파일로 이루어져 이러 한 다양한 형식의 파일을 전송하는 방법을 정의.
31
HTTP request 일반적으로 이런 형태로 작성됩니다. CRLF = “\r\n” SP = ‘ ‘
32
HTTP request method GET Request-URI 서버로부터 받아오는 method Header 에 If-Modified-Since 를 추가하여 로컬의 파일과 다르 지 않을 때 전송을 받지 않도록 할 수도 있다. HEAD GET 과 비슷하나 response 에 additional body 를 받지 않습니 다. PUT Server 에 로그인이나 파일 전송 등을 위해
33
HTTP request 구조 HTTP request 는 simple request + request header + entity body simple request line 의 구조는 Method SP Request-URI SP HTTP-Version CRLF Request header field 의 구조는 Header: SP Value CRLF Parsing 을 위한 첨언. Entity body 가 없으면 CRLFCRLF 로 request message 가 끝납 니다. Header field 각 라인은 CRLF 로 구분됩니다.
34
HTTP request header Host: www.google.comwww.google.com Request-URI 를 찾을 host 를 명시합니다. HTTP request 가 반드시 들고 있다고 생각하세요. If-Modified-Since = "If-Modified-Since" ":" HTTP-date Conditional Get 의 구현을 위한 header 입니다. HTTP-date 에 명시된 시점 이후에 문서의 수정이 없을 경우 전송받지 않습니다. Content-Length = Length Entity body 에 전송될 내용이 있을 경우 그 크기를 명시한다.
35
HTTP Request 예제
36
HTTP response 일반적으로 이 형태로 전송됩니다.
37
Status Code 200 OK request succeeded, requested object later in this message 301 Moved Permanently requested object moved, new location specified later in this message (Location:) 400 Bad Request request message not understood by server 404 Not Found requested document not found on this server 505 HTTP Version Not Supported
38
HTTP response 구조 HTTP response 는 simple response + response header + entity body simple response line 의 구조는 Version SP Status-Code SP Phrase CRLF Response header field 의 구조는 Header: SP Value CRLF
39
HTTP response header, 예제
Similar presentations