< 소켓 : TCP/ UDP 통신 >B289019 김여은 Ye소켓(socket)이란?컴퓨터 통신은 전화망, 인터넷 등 다양한 수단을 이용하여 데이터를 주고받는 통신 방식이다. 이런 서로 다른 통신 환경이 통신을 수행할 수 있도록 양쪽에 생성되는 문이 소켓(socket)이다.Ex) 전기선과 전구를 전구 소켓이 이어주는 것과 같은 역할을 한다고 보면 된다.네트워크 및 전송 계층의 캡슐화가 가능해 집니다.(application process 와 end-transport protocol(TCP/UDP) 사이)애플리케이션 층트랜스포트 층네트워크 층데이터링크 / 물리 층UDP(User Datagram Protocol)란?: 인터넷에서 정보를 주고받을 때, 서로 주고받는 형식이 아닌 한쪽에서 일방적으로 보내는 방식의 통신 프로토콜- No frills : 군더더기 없이 필요한 부분만 있음 (bare bones 핵심)- Best effort : 패킷을 잃을 수도 있고, 순서가 없음- Connectionless : sender와 receiver사이에 따로 연결이 없음(오토바이 택배)TCP(Transmission Control Protocol)란?: 서로 다른 운영체제를 쓰는 컴퓨터 간에도 데이터를 전송할 수 있어 인터넷에서 정보전송을 위한 표준 프로토콜로 사용됨.- Point-to-point : 하나의 sender와 하나의 receiver- Reliable/ In-order byte steam : 신뢰성 있음/ 순서대로 byte단위 처리- Pipelined : 명령수행을 위해 여러 단계를 거침 (fech/ decode/ excute)- Send & Receive buffers : send, receive 버퍼가 존재함- Full duplex data : 전이중 데이터- Connection-oriented : 데이터 교환 전에 연결이 됨(기찻길)- Flow controlled : 흐름 제어[실습 환경]window XP Professional KTool : Visual Studioket , struct sockaddr *address, socklen_t address_len): 클라이언트의 접속을 허락- socket : 접속을 허락할 서버 소켓의 핸들serverSocket- struct sockaddr *address : 클라이언트의 주소 정보를 저장할 구조체 주소NULL(필요없음)- socklen_t address_len : 위의 구조체의 길이NULL(필요없음)accept 함수는 성공하면 클라이언트와 데이터를 주고 받는 일을 전담하는 socket을 리턴하고, 실패하면 INVALID_SOCKET리턴# int send(int socket, const char FAR* buf, int len, int flags): 클라이언트로 데이터를 전송하는 함수- socket : 클라이언트의 데이터를 전담해서 가져오고 보내는 소켓의 핸들- FAR* buf : 보낼 데이터를 저장하고 있는 배열toServer, toClient- len : 보낼 데이터의 크기- flags : 데이터를 보낼 때의 옵션0 (대부분 0으로 설정)send 함수는 데이터 보내기에 성공하면 보낸 바이트 수를 반환하고 실패하면 -1 을 반환합니다.# int recv(int socket, char FAR* addr, int len, int flags): send 함수를 이용해서 서버로 전달한 데이터를 읽어 들이는 함수- socket : 클라이언트의 데이터를 전담해서 가져오고 보내는 소켓의 핸들serverSocket- FAR* addr : 데이터를 저장할 배열fromServer, fromClient- len : 읽어드릴 데이터의 크기- flags : 데이터를 읽어드릴 때의 옵션0 (대부분 0으로 설정)recv 함수는 데이터 받기에 성공하면 받은 바이트 수를 반환하고 실패하면 -1 을 반환합니다.1) 소켓 생성 후 기다림socket( ) / bind( ) / listen( )socket( )file[ ] : 파일 이름쓰레기 값toServer [ ] : 파일 속 내용 (전송할 내용)쓰레기 값를 저장할 배열 설정- len : 읽어드린 데이터의 크기- flags : 소켓의 옵션 설정0 (대부분 0으로 설정)- sockaddr * addr : 데이터를 보낸 곳의 (addr 구조체)의 포인터 설정- addrlen : addr 포인터가 가리키는 구조체의 크기 설정recvfrom 함수는 데이터 받기에 성공하면 받은 바이트 수를 반환하고 실패하면 -1 을 반환합니다.1) 소켓 생성 후 기다림socket( )/ bind( )socket( )2) 파일 읽기 (이름, 내용)file[ ] : gets 함수로 키보드로부터 파일 이름 입력 받음toServer [ ] : fgets 함수로 파일 안의 내용을 배열에 저장3) 전송(sendto / recvfrom)fromClient[ ] : recv 함수로 client로 부터 받은 파일 내용 입력 받음4) Exchange ( ) 함수 호출위와 동일toClient[ ] : fromClient내용을 exchange( ) 함수로 변환한 내용len [ ] : server가 client에게 전송하는 내용의 길이5) 변환된 내용 전송(sendto / recvfrom)fromServer [ ] : client가 server에게 전송 받은 내용6) client의 파일과 같은 이름의 파일로 변환된 내용 server저장위와 동일7) 종료While 문을 사용하여 server는 계속 연결을 유지 시킨다.Client의 접속을 계속적으로 감시 (한번 하면 그 뒤로는 따로 연결이 필요 x)TCP_Server.cpp (확대해서 보시오)#include /*소켓 통신에 필요한 함수 들이 선언되어있는 헤더파일 */#include#include #pragma comment(lib, "wsock32.lib")#pragma comment(lib, "ws2_32.lib")/* 윈도우 소켓 함수가 정의되어있다. */#define BUFFER_SIZE 100 /* 100 바이트 */char exchange(char *fromClient, char *toClient);i을 위한 인터페이스PF_IPX IPX 노벨 프로토콜*//*소켓의 핸들 (파일 디스크립터)를 serverSocket에 대입*/SOCKET serverSocket = socket( PF_INET, SOCK_STREAM, 0 );/*ZeroMemory 함수는 해당 메모리를 0으로 초기화 시켜주는 함수 입니다.serverAddress 배열을 0으로 초기화 시켰습니다. */SOCKADDR_IN serverAddress;ZeroMemory( &serverAddress, sizeof( serverAddress ) );/*serverAddress 는 서버소켓의 주소정보를 저장 하는 구조체 입니다.serverAddress 에 필요한 주소 정보를 저장 합니다.*/serverAddress.sin_family= AF_INET; /*소켓의 주소 체계를 설정 합니다.TCP/IP 프로토콜의 경우 인터넷 기반이므로 AF_INET 을 대입합니다.(참고)주소체계(Address Family) 정의AF_INET IPv4인터넷 프로토콜AF_INET6 IPv6인터넷 프로토콜AF_LOCAL LOCAL 통신을 위한 UNIX 프로토콜*/serverAddress.sin_port= htons( 10000 ); /*서버 소켓의 포트를 설정 합니다. */serverAddress.sin_addr.s_addr= htonl( ADDR_ANY );/*서버의 IP를 설정 합니다.*//*ADDR_ANY는 모든 클라이언트로부터의 접속을 받아들임을 의미 (Connection will be accepted on any Internet interface on a system having multiple IP addresses)*//*bind 함수는 serverAddress 에 대입한 서버소켓의 주소정보를 이용해서serverSocket에 IP 와 PORT를 부여합니다. serverSocket에 IP 와 port 를 부여 하는데성공하면 0을, 실패하면 SOCKET_ERROR 를 리턴합니다.형식:bind(SOCKET s, const 접속했습니다. 메세지를 기다리는 중......nn");char fromClient[BUFFER_SIZE+1]; //클라이언트로 부터 전달된 내용을 저장할 배열// 클라이언트가 전송한 메시지 받음 ---------------------------------------------------------------------------------------------------/* revv 함수는 클라이언트에서 send 함수를 이용해서 서버로 전달한 데이터를 읽어들입니다.형식:recv(SOCKET s, char FAR* addr, int len, int flags)SOCKET 클라이언트의 데이터를 전담해서 가져오고 보내는 소켓의 핸들char 클라이언트의 데이터를 저장할 배열int 읽어들일 데이터의 크기int 데이터를 읽어들일 때의 옵셥으로 대부분 0으로 설정*//*클라이언트가 전달한 데이터를 읽어 들여서 fromClient 에 저장 합니다.*/recv( socket, fromClient, BUFFER_SIZE, 0 );/*fromClient 에 저장된 내용을 출력합니다.*/printf("클라이언트로 부터 전달 받은 데이터: %snn", fromClient );// 클라이언트에게 데이터 변환하여 전송 ---------------------------------------------------------------------------------------------------char toClient[BUFFER_SIZE]; //클라이언트로 전달할 내용을 저장할 배열이다.char len[1];len[0] = exchange(fromClient, toClient); // 데이터값을 아스키코드'9'를 뺀 값으로 모두 바꾸는 함수이다.//strcpy(toClient,"Hello Client!!"); //toClient 배열에 Hello Client!! 를 대입합니다./*toClient 배열에 저장된 내용을 클라이언트로 전달합니다.*//* send 함수는 클라이언트로 i
B289019 김여은 Ye와이어 샤크 (Wireshark)란?Wireshark는 네트워크 패킷을 분석하는 도구이다. 네트워크 패킷 분석기란 네트워크 패킷을 캡쳐 하고, 이 패킷 데이터를 가능한 자세하게 보여주는 것이다. 또한 wireshark는 공개된 오픈 소스이므로 누구나 공짜로 사용할 수 있다.Application Layer (애플리케이션 층)TCP / IP 5계층 중에서 가장 위에 위치한 층. 컴퓨터끼리의 주고받기를 사용자가 이용할 수 있는 ‘통신 서비스’라는 형태로 만드는 역할 수행애플리케이션 층트랜스포트 층네트워크 층데이터링크 / 물리 층HTTP(Hypertext Transfer protocol)란?- 웹 상에서 클라이언트와 서버가 서로 대화하기 위한 통신 규약이다.Ex) A라는 사람이 오른손을 들었을 때 '안녕하세요'라고 약속하면 A, B가오른손을 들었을 때는 ‘안녕하세요’라는 규약 즉 프로토콜이 생기는 것이다.- 웹 서버는 클라이언트의 요청이 들어오면 자원과 헤더정보를 분석하여 요청한 자원의 데이터와 헤더를 포함하여 클라이언트에게 응답한다.- http는 네 개의 층 구조를 갖는다.요청라인(request line) : 통신 요청헤더(header line) : 메시지 간략적 내용공백(space) : ‘cr if 사용’하여 header와 body 구분본문(body line) : 요청 시 본 데이터 포함DNS(Domain Name System)란?- 도메인 이름에 대한 IP주소를 알려주거나 IP주소에 대한 도메인 이름을 알려주는 일을 한다.(서버 접속 포트 : 53번, UDP 프로토콜 사용)- 도메인 : 숫자 형태의 IP주소를 사용자가 기억하기 힘들기 때문에 접속을 쉽게하도록 부여된 영어 이름이다.Ex) Hyperlink "http://www.naver.com" www.naver.com[실습 환경]window XP Professional KTool : Wireshark[기본 설정(DNS, browser 캐시 삭제)]1. ipconfig 실행 : DNS, IP address, Subnet mask, Gateway 주소 표시2. ipconfig /displaydns 실행 : DNS Resolver의 캐시목록 표시. 3. ipconfig /flushdns 실행 : DNS 기존 캐시를 삭제하고 다시 DNS 정보를 받으므로, 빠른 갱신 및 빠른 접속 가능4. browser을 실행시켜 browser cache를 지운다.(메뉴 – 도구 – 인터넷 옵션 – 일반)[실습 과정]1. HTTP 분석< request message >- 기본 구조 -- Ex –1) Request line (method / URL / version): Response status Code 및 Protocol 정보: GET /image/2013/10/14/312~.jpg HTTP/1.1 rn# Method : 페이지 요청 방법- GET : 페이지를 단순히 가져오기 위한 기능(URL 메타 문자를 이용하면 정보를 전송하는 용도로도 사용할 수 있음)- POST : 웹 페이지에 정보를 전송하기 위한 기능- HEAD : 웹 페이지의 응답 헤더만을 요청하는 기능- PUT : 페이지를 웹 서버에 생성하는 기능(보안상의 이유로 대부분의 서버에서 막혀있음)- DELETE : 요청한 페이지를 웹 서버에서 제거하는 기능(보안상의 이유로 대부분의 서버에서 막혀있음)- OPTIONS : 서버에서 사용 가능한 메소드의 종류를 확인하는 기능(보안상의 이유로 대부분의 서버에서 막혀있음)# URL : 파일의 위치- /static/www/up/2012/naver_homepage.png (그림파일 인 것 같음)# Version : HTTP 버전- HTTP 1.1 : (Multiple objects/ 지속적으로 연결을 열어둠)2) Request Header lines: Web Browser infomation, language, encoding type, request server 등 추가정보: Accept : image/png, image/svg+xml, image/*;q=0.8, "/";q=0.5rn… (노란색 네모부분)- Accept : 처리할 수 있는 데이터 타입- Referer : 어떤 사이트를 경유했는지를 알려주는 도메인 혹은 URL 정보- Accept-Languge : 사용 언어- User-Agent : 사용자 웹 브라우저 종류 및 버전 정보- Accept-Encoding :- Host : 사용자가 요청한 도메인 정보(URL)- DNT :- Connection : 지속 연결의 사용 여부- Cookie : HTTP 프로토콜 자체가 세션을 유지하지 않은 State-Less(접속상태를 유지하지 않는) 방식이기 때문에 로그인 인증을 위한 사용자 정보를 기억하려고 만든 인위적인 값3) Blank lines (rn): heade line과 body line를 구분하기 위한 공백 라인4) Request Body lines: Request에 필요한 내용을 갖음. 일반적으로 HTML Form Tag 안에 입력된 값들인 parameter 정보를 의미함< response message >- 기본 구조 -- Ex –1) Status lines: Response status Code 및 Protocol 정보를 갖는다.: HTTP/1.1 200 OK rn# Version : HTTP 버전- HTTP/1.1 : (Multiple objects/ 지속적으로 연결을 열어둠)# Status Code- 1xx : Informational- 2xx : Successful- 3xx : Redirection- 4xx : Client Error- 5xx : Server Error2) Response Header lines: Response 처리 날짜, encoding type, Request Server 정보 등과 같은 추가 정보: Date : Fri. 11 Oct 2013 05:39:43 GMTrn… (노란색 네모부분)- Date : 현재 일시의 시간- Sever : 현재 웹 서버의 종류- Content-type : 읽을 수 있는 형태- Last-Modified : 마지막으로 수정된 시간3) Blank lines (rn): heade line과 body line를 구분하기 위한 공백 라인4) Response Body lines: Response에 필요한 내용을 갖는다. 일반적은 HTML 문서이다.2. DNS 분석DNS 사용 목적문자로 된 호스트 이름(www.google.com) 을 숫자로 된 IP 주소로 결정DNS 서버간의 정보를 전송IP 주소와 관련된 호스트 이름을 식별(만약 DNS 가 고장 난다면 호스트들은 서로의 위치를 알아 낼 수 없음)< query / query 응답 >1) Transaction ID: DNS 쿼리와 응답에 연관된다. 사용자는 이 필드에서 DNS에 관련된 모든 것을 보기 위한 값을 필터링함 (dns.idm == 0xf685)2) Flags: 쿼리 특성을 정의하는 수많은 필드로 구성됨- Response(Query) : 쿼리/응답 비트는 요청(0) 인지 응답(1)인지 표시0 … …. .… …. : 요청- OPcode : 쿼리의 유형을 지정 (일반적으로 요청에 대해 0000을 포함).000 0... …. …. : 일반적 요청- Truncation : 응답이 길어서 잘렸는지 알려줌(패킷이 잘리는 것은 자주 볼 수 없음)…. ..0. …. …. : 패킷이 잘리지 않음- Recursion Desired : 재귀쿼리의 사용을 알려줌(대부분의 DNS는 재귀 쿼리를 사용함)…. ...1 …. …. : 패킷이 잘림(- Recursion Available : 응답에서 정의된 재귀가 사용가능 한지를 표시)- Resesrved : 이 필드는 0으로 설정됨…. .... .0.. …. : 항상 0- Response Code : 응답에서 오류가 존재하는지 표시3) Questions : 1: 질문의 숫자 표시 (일반적으로 한 피켓당 한 개의 질문)4) Answer RRs : 0: Answer RRs 수 표시5) Authority RRs : 0: Authority RRs 응답 수 표시6) Additional RRs : 0: Additional RRs 응답 수 표시7) Queries- Name : 결정 중인 이름 포함(형식은 이름에서 영문자 바이트의 숫자를 표시하기 위해 숫자 구분문자를 이용하는 가변길이이다. - 3www9naver3com0)publi.lemonde.fr- Type : 쿼리의 유형 나타냄A (host address)- Class : TCP / IP 통신에 대한 인터넷 클래스 주소 표시IN (0x0001)[ 추가 질문 ]1. wireshark 실행전 browser 캐시와 dns 캐시를 삭제하는 이유?Sol) 도메인과 IP교환 과정에서 이미 클라이언트 측에 저장된 정보를사용할 수 있어서 DNS 교환이 발생하지 않을 수도 있기 때문에2. 접속하지 않은 다른 사이트에도 접속한 기록이 있는 이유?Sol) 사이트 끼리 서로 연동하여 사용자가 접속하려 하지 않은 사이트에도 접속하게 됨 ( ex) 안랩, 팝업창 등)3. wireshark 패킷 분석을 이용하는 해킹 방법은?Sol) ARP spooping에 활용하여 암호화 되지 않은 사이트에서 user의 ID와 Password를 훔칠 수 있다.