Download presentation
Presentation is loading. Please wait.
Published by지은 남궁 Modified 8년 전
1
한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실 1 14 장. Out-of-Band Data System Software Lab. 이종호
2
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 2 목차 Out-of-band data 의 정의 Out-of-band data 의 필요성 Socket and out-of-band data Variations in implementation Out-of-band data 사용 Urgent Pointer 의 이해 Receiving Out-of-band data inline Urgent mode pointer 의 제한점 Summary
3
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 3 Out-of-band 데이터의 정의 정의 대역밖의 데이터 긴급한 데이터로서 일정한 순서를 가지지 않고 순차화 된 데 이터보다 더 먼저 처리 되어야 할 필요가 있는 데이터를 일컫 는다. 즉, TCP/IP 통신상에서 긴급한 데이터 예 2345678 U 1 Out-of-band data
4
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 4 Out-of-band data 의 필요성 필요성 보내진 데이터보다 먼저 처리되어야 할 이유가 있 을 때 처리하는 방법 필요 서버에게 보내진 요청을 취소할 이유가 있을 때 처 리하는 방법이 필요 Out-of-band 데이터의 사용프로그램 telnet rlogin ftp
5
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 5 Socket 과 Out-of-band data 소켓 과 Out-of-band data 관계 TCP 스트림 특징 완전한 순차적인 데이터 바이트를 보냄 Out-of-band 데이터를 보낼 수 없음 “Urgent” data 제공 해결책 Urgent data 의 개념으로 out-of-band 데이터로서 소켓 API 사용 소켓과 out-of-band data Out-of-band data 를 사용하기 위해 소켓사용
6
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 6 Variations in implementation 긴급한 데이터 조작되어지는 방법 RFC793 해석 BSD 해석 (Linux default) 대부분의 실행은 BSD 소스코드에 근거 오늘날 공통적으로 사용 리눅스 시스템 사항 확인 및 설정 $ cat /proc/sys/net/ipv4/tcp_stdurg 0 $ 만약 위와 같이 0 이 나온다면 BSD 해석으로 긴급한 데이터가 조작됨 만약 1 이 나온다면 RFC793 해석으로 긴급한 데이터가 조작됨
7
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 7 Out-of-band data 사용 (1) writing out-of-band data 송신하기 위한 함수 Send() 함수 send() 함수 이해 #include Int send(int s, const void *msg, int len, unsigned int flags); ※해석 s : 데이터를 전송할 소켓번호 msg : 전송할 데이터가 저장된 버퍼 len : 버퍼의 크기 flags : 데이터가 보내어지는 방법에 영향 value: ① 0 : write() 함수와 같은 역할 ② MSG_OOB : out-of-band data 를 보냄. ③ MSG_DONTROUTE : 프로토콜의 라우팅 조건을 전혀 무시하고 메시지가 보내어짐. ( 가장 빠른 경로가 아니라 가장 직선적인 경로를 통해 보내지는 것 의미 ) 반환값 : 정상적 처리 : 전송된 테이터 크기를 바이트단위로 리턴 error : -1 값을 리턴
8
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 8 Out-of-band data 사용 (2) reading out-of-band data 수신하기 위한 함수 recv() 함수 recv() 함수 이해 #include Int recv(int s, void *buf, int len, unsigned int flags); ※해석 s : 데이터를 수신할 소켓번호 msg : 수신할 데이터가 저장될 버퍼 len : 버퍼의 크기 flags : 데이터를 받을 수 있는 방법에 영향 value: ① 0 : write() 함수와 같은 역할 ② MSG_OOB : out-of-band data 만 받음 ( 정상적 데이터는 통과 ) ③ MSG_PEEK : 프로세스는 실제로 데이터를 받지않고도 데이터를 볼수 있음. ④ MSG_WAITALL : 완전한 양의 데이터를 얻을수 있을 때에만 recv 호출로부터 복귀 반환값 : 정상적 처리 : 수신된 테이터 크기를 바이트단위로 리턴 error : -1 값을 리턴
9
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 9 Out-of-band data 사용 (3) Out-of-band data 수신방법 Out-of-band data 개별적 수신 In-band data 와 혼합적으로 수신
10
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 10 Out-of-band data 사용 (4) Understanding the signal SIGURG Receiving process Out-of-band data 가 받아질 때 인지되기 위해 필요 SIGURG signal 소켓에 높은 대역폭의 자료가 이용 가능함. 프로세스에게 네트워크 연결이 긴급하거나 대역을 벗어난 (out- of-band) 데이터가 수신되었음을 알림. SIGURG signal 사용위한 요구사항 소켓의 소유권 확립 fcntl() 함수 사용 SIGURG 에 대한 signal handler 확립 프로그램이 SIGURG 를 받기 위해 준비되어 있어야 함
11
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 11 Out-of-band data 사용 (5) fcntl() 함수 이해 #include Int fcntl(int fd, int cmd, long arg); ※해석 fd : 파일기술자 또는 소켓 (fcntl 은 fd 에 의해 식별되는 개방된 파일에 대해서 동작 ) cmd : 특정기능 선택 (cmd 의 값을 헤더화일 로 부터 고름 ) value : F_SETOWN : 소켓을 성공적으로 확립했을 때 0 값을 리턴 arg : 설정을 위한값 ( 프로세스 식별번호 ) 반환값 : 정상적 처리 : 0 error : -1 예 : int fcntl(s, F_SETOWN, getpid());
12
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 12 Out-of-band data 사용 (6) Supporting Subprograms 예제 14.1 bindacpt.c Socket() 함수 주소 종류, 스트림형 또는 데이터 그램형의 소켓의 타입 그리고 프 로토콜을 지정하여 소켓을 생성 리턴값 성공 : 새로 만들어진 소켓번호 실패 : -1 Bind() 함수 소켓번호 와 소켓주소 구조체를 연결 리턴값 성공 : 0 실패 : -1 Listen() 함수 서버에서 스트림 소켓 s 를 연결을 기다리는 상태로 만든다. Listen() 을 호출하기 전에 소켓은 반드시 bind() 되어 있어야 한다. 동시에 지정한 수만큼의 연결요청을 대기시켰다가 accept 가 되는 대로 차 례로 연결을 처리한다. 리턴값 성공 : 0 실패 : -1
13
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 13 Out-of-band data 사용 (7) Accept() 함수 서버에서 클라이언트의 연결요청을 수락하기 위하여 listen() 을 호 출 한 후에 호출되며, 성공시 새로운 소켓이 만들어진다. 새로 만들 어지는 소켓은 소켓 s 와 같은 속성을 가진다. Accept() 가 성공적으 로 수행된 후 소켓 s 는 다시 listen 상태로 돌아간다. 즉, 새로운 accept() 를 처리할 수 있게 된다. 리턴값 성공 : 새로 만들어진 소켓번호 실패 : -1 Mkaddr() 함수 주소를 생성하기 위한 함수 리턴값 성공 : 0 에러 : -1 : 문자열의 호스트 부분의 이상, unknown host name -2: 포트 넘버 이상, 알려지지 않은 서비스 이름 Bail() 함수 에러를 보고하고, 프로그램의 위험을 회피하기 위한 함수
14
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 14 Out-of-band data 사용 (8) Bindaccept() 함수 소켓을 생성하고 주소를 결합하기 위한 함수 create, bind, listen, accept 모두 조작 Connect() 함수 소켓을 생성하고 원격서버에 연결하기 위한 함수로 스트림 (TCP) 으로 개설된 소켓번호를 상대방 호스트와 연결되도록 시도 리턴값 성공 : 0 실패 : -1
15
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 15 Out-of-band data 사용 (9) Receiving with the SIGURG signal 예제 14.2 oobrecv.c 순서도 함수선언 / 초기화 소켓생성 / 서버주소연결 소켓생성 / 서버주소연결 소유권 확립 SIGURG 신호감지 SIGURG 신호감지 데이터 수신 소켓 종료 Z값Z값 Z값Z값 에러 break z=-1z=0other 수신 데이터 출력
16
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 16 Out-of-band data 사용 (10) 소스분석 함수 선언 (line 15-37) extern void bail(char *on_what); // 에러발생시 에러보고 (line 15) extern int bindAccept(char *addr); // 소켓을 생성하고 주소를 결합 (line 16) static int s=-1; // 소켓 (line 18) static void sigurg(int signo); //SIGURG signal handler (line 23-37) 초기화 (line 41-42) int z; // 상태를 나타내기 위한 변수 (line 41) char buf[256]; // 수신데이터를 위한 버퍼 (line 42) int n; char buf[256]; n=recv(s,buf,sizeof buf,MSG_OOB); if(n<0) bail(“recv(2)”); Buf[n]=0; Printf(“URG ‘%s’ (%d)\n”, buf, n); Signal(SIGURG, sigurg);
17
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 17 Out-of-band data 사용 (11) 소켓생성 및 서버 주소 연결 S=BindAccept(arqc>=2 ? argv[1] : ”127.0.0.1:9011”); (line 52-54) 소켓 소유권 확립 Z=fcntl(s, F_SETOWN, getpid()); (line 59) SIGURG 신호 감지 Signal(SIGURG, sigurg); (line 66) 데이터 수신 Z=recv(s, buf, sizeof buf, 0); (line 69) 수신데이터 출력 Printf(“rcv ‘%s’ (%d)\n”, buf, z); (line 76) 소켓 종료 Close(s); (line 80)
18
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 18 Out-of-band data 사용 (12) Sending out-of-band data 예제 14.3 oobsend.c 순서도 함수선언 / 초기화 소켓생성 / 상대방 과 연결 소켓생성 / 상대방 과 연결 in-band 데이터 송신 in-band 데이터 송신 sleep(1) 함수호출 out-of-band 데이터 송신 out-of-band 데이터 송신 소켓 종료 Sleep(1) 함수 호출 in-band 데이터 송신 in-band 데이터 송신
19
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 19 Out-of-band data 사용 (13) 소스분석 함수 선언 extern void bail(char *on_what); // 에러발생시 에러보고 (line 13) extern int Connect(char *addr); // 소켓을 생성하고 원격서버에 연결 (line 14) Static void iband(ints, char *str) //in-band 데이터 송신 (line 19-28) Static void oband(int s, char*str) //out-of-band 데이터 송신 (line 33-42) int z; Z=send(s,str,strlen(str),0); If(z==-1) bail(“send(2)”); Printf(“ib : ‘%s’ (%d)\n”,str, z); int z; Z=send(s,str,strlen(str),MSG_OOB); If(z==-1) bail(“send(2)”); Printf(“OOB : ‘%s’ (%d)\n”,str, z);
20
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 20 Out-of-band data 사용 (14) 초기화 int s =-1; // 소켓 (line 46) 소켓생성 및 상대방과 연결 s=Connect(arqc>=2 ? Argv[1] : “127.0.0.1:9011”); (line 48-50) in-band 데이터 송신 (line 52-59) iband(s, “In the beginning”); sleep(1);// 프로세스를 1 초동안 쉬게 함 iband(s, “Linus begat Linux,”); sleep(1);// 프로세스를 1 초동안 쉬게 함 iband(s, “and the Penguins”); sleep(1);// 프로세스를 1 초동안 쉬게 함 out-of-band 데이터 송신 (line 61-62) oband(s, “rejoiced”); sleep(1); in-band 데이터 송신 (line 64) iband(s, “exceedingly.”); 소켓종료 close(s); (line 65)
21
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 21 Out-of-band data 사용 (15) oobrecv and oobsend programs 실행 실행 $./oobrecv (default : local loopback address “127.0.0.1:9011”) $./oobsend
22
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 22 Out-of-band data 사용 (16) 결과 -BSD 해석 $./oobrecv rcv ‘In the beginning’ (16) rcv ‘Linus begat Linux,’ (18) rcv ‘and the penguins’ (16) URG ‘d’ (1) rcv ‘rejoice’ (7) rcv ‘exceedingly.’ (12) $./oobsend ib: ‘In the beginning’ (16) ib: ‘Linus begat Linux,’ (18) ib: ‘and the penguins’ (16) OOB ‘rejoiced’ (8) ib: ‘exceedingly.’ (12)
23
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 23 Understanding the Urgent Pointer(1) Understanding TCP Urgent Mode rejoiced Offset=0 RFC793 Urgent pointer (offset=7) BSD(Linux) Urgent pointer (offset=8) Tcp_stdurg=1Tcp_stdurg=0 send (s, “rejoiced”, 8, MSG_00B)
24
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 24 Understanding the Urgent Pointer(2) rejoicedURG=1 Urgent Pointer=8 TCP header Packet Data Offset=0 BSD(Linux) Urgent pointer (offset=8) tcp_stdurg=0
25
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 25 Understanding the Urgent Pointer(3) Urgent Mode When tcp_stdurg=1 Urgent mode 가 종종 들어 올 때 그것에 반응하는 urgent- pointer 는 읽혀지기 위해 urgent data 없이 수신 패킷안에 포함되어 있는 마지막 바이트에서 urgent pointer 가 발생되어질 때 뒤따라오고 있는 바이트는 수신되지 않을지도 모름 No urgent data 가 read 되어질 수 있도록 errno 값 EAGAIN 리 턴 ( 몇몇 유닉스장치 : EWOULDBLOCK)
26
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 26 Receiving Out-of-Band data Inline(1) in-band 데이터 와 out-of-band 데이터 혼합수신 소켓옵션 설정 ※주의 : recv() 함수 호출시 MSG_OOB 설정할 필요없음. 만약 설정후 호출한다면 EINVAL 에러발생 int z; //status int s; //socket int oobinline=1; //true z=setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &oobinline, sizeof oobinline); ※해석 s : 소켓번호 SOL_SOCKET : 프로토콜 레벨 지정 ( 보통 SOL_SOCKET 지정 ) SO_OOBINLINE : 선택할 옵션 지정 (OOB 데이터를 일반 데이터처럼 읽음 ) &oobinline : 지정된 옵션 값이 저장된 버퍼의 포인터 ( 값이 1 이면 선택, 0 이면 취소 ) oobinline : 지정된 옵션 값이 저장된 버퍼의 크기 반환값 : 정상적 처리 : 0 error : -1
27
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 27 Receiving Out-of-Band data Inline(2) Determining the Urgent Pointer ioctl() 함수 #include … int z; //status int s; //socket int flag; //true when at mark z=ioctl(s,SIOCATMARK,&flag); if (z==-1) abort();/* 호출하는 프로그램이 비정상 종료하여 코어를 덤프 하도록 SIGABRT 시그널을 보냄 잘못되었을 때 프로세스가 현재 상태를 기록할 수 있도록 하기위해 */ if (flag !=0) puts(“At Mark”); else puts(“Not at mark.”);
28
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 28 Receiving Out-of-Band data Inline(3) Using Out-of-Band data Inline 예제 14.4 oobinline.c 순서도 함수선언 / 초기화 소켓생성 / 서버주소 연결 소켓생성 / 서버주소 연결 소켓 소유권 확립 소켓 소유권 확립 SIGURG 감지 소켓 종료 Socketmark 출력 소켓 옵션 설정 에러 데이터 수신 break 수신데이터 출력 Z=-1Z=0
29
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 29 Receiving Out-of-Band data Inline(4) 소스분석 함수 선언 extern void bail(char *on_what); // 에러발생시 에러보고 (line 16) extern int BindAccept(char *addr); // 소켓을 생성하고 주소결합 (line 17) Static void sigurg(int signo) //SIGURG signal handler (line 22-27) Static int sockatmark(int s) // 소켓표시 (line 33-42) write(1,”[SIGURG]\n”,9); signal(SIGURG,sigurg); int z; int flag; z=ioctl(s,SIOCATMARK,&flag); if(z==-1) return –1; return flag ? 1 : 0;
30
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 30 Receiving Out-of-Band data Inline(5) 초기화 (line 46-49) int z; // 상태표시 int s; // 소켓 int oobinline=1; //OOB inline char buf[256]; 소켓생성 및 서버주소연결 s=BindAccept(argc>=2 ? Argv[1] : “127.0.0.1:9011”); (line 59-61) 소켓 소유권 확립 Z=fcntl(s, F_SETOWN, getpid()); (line 66) SIGURG 감지 Signal(SIGURG,sigurg); (line 73) 소켓옵션 설정 (line 78-82) Z=setsockopt(s, SOL_SOCKET, SO_OOBINLINE,&oobinline,sizeof oobinline); Sockatmark 출력 Printf(“\n[%s]\n”, Socketmark(s) ? “AT MARK” : “No Mark”); (line 87-90) 데이터 수신 z=recv(s, buf, sizeof buf, 0) (line 92) 수신데이터 출력 Printf(“rcv ‘%s’ (%d)\n”, buf, z); (line 99-100) 소켓종료 close(s); (line 103)
31
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 31 Receiving Out-of-Band data Inline(6) 실행 $./oobsend $./oobinline
32
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 32 Receiving Out-of-Band data Inline(7) 실행 결과 -BSD $./oobsend ib: ‘In the beginning’ (16) ib: ‘Linux begat Linux,’ (18) ib: ‘and the penguins’ (16) OOB ‘rejoice d ’ (8) ib: ‘exceedingly.’ (12) $ $./oobinline [No Mark] rcv ‘In the beginning’ (16) [No Mark] rcv ‘Linux begat Linux,’ (18) [No Mark] rcv ‘and the penguins’ (16) [No Mark] [SIGURG] rcv ‘rejoice’ (7) [AT Mark] rcv ‘ d ’ (1) [No Mark] rcv ‘exceedingly.’ (12) [No Mark] $
33
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 33 Limitations of the Urgent Mode Pointer(1) 제한점 TCP 프로토콜 out-of-band 데이터의 한 바이트로 제공되어짐 TCP 의 urgent 모드를 사용하여 수행되어지기 때문 TCP urgent mode 와 TCP urgent pointer Urgent data 의 경계를 표시할 수 없음 실험 oobsend.c 프로그램 수정 sleep() 함수 제거 oband(s,”very”) 함수 추가
34
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 34 Limitations of the Urgent Mode Pointer(2) oobsend.c 수정 int main(int argc, char **argv){ int s=-1; s=connect(argc >=2 ? argv[1] : “127.0.0.1:9011”); iband(s,”In the beginning”); iband(s,”Linus begat Linux,”); iband(s,”and the Penguins”); oband(s,”rejoiced”); oband(s,”very”); iband(s,”exceedingly.”); close(s); return 0; }
35
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 35 Limitations of the Urgent Mode Pointer(3) 실행 결과 -BSD $./oobsend ib: ‘In the beginning’ (16) ib: ‘Linus begat Linux,’ (18) ib: ‘and the penguins’ (16) OOB ‘rejoiced’ (8) OOB ‘ver y ’ (4) ib: ‘exceedingly.’ (12) $ $./oobinline [No Mark] Rcv ‘In the beginning’ (16) [No Mark] Rcv ‘Linus begat Linux,’ (18) [No Mark] [SIGURG] Rcv ‘and the penguinsrejoicedver’ (27) [At Mark] Rcv ‘ y exceedingly.’ (13) [No Mark] $
36
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 36 Limitations of the Urgent Mode Pointer(4) Processing out-of-band data with select(2) select() 함수 호출 select() 함수가 호출되는 동안을 제외하고 out-of-band 데 이터의 도착을 인식 select() 함수 방해 A read event A write event An exception
37
HANNAM UNIVERSITY http://syssw.hannam.ac.kr 37 요약
Similar presentations