본 강의에 들어가기 전

Similar documents
본 강의에 들어가기 전

본 강의에 들어가기 전

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint - Supplement-02-Socket Overview.ppt [호환 모드]

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

The Pocket Guide to TCP/IP Sockets: C Version

Chapter 4 UDP 소켓 사용법

Microsoft PowerPoint - 12 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 1.ppt

The Pocket Guide to TCP/IP Sockets: C Version

슬라이드 1

제1장 Unix란 무엇인가?

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >

2009년 상반기 사업계획

vi 사용법

PowerPoint 프레젠테이션

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

슬라이드 1

PowerPoint 프레젠테이션

제1장 Unix란 무엇인가?

PowerPoint 프레젠테이션

IPv6 적용

Microsoft PowerPoint - 09-CE-23-윈도우 소켓

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

슬라이드 1

Microsoft PowerPoint - 13 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 2.ppt

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

Microsoft PowerPoint - 04-UDP Programming.ppt

Microsoft Word - KPMC-400,401 SW 사용 설명서

Microsoft PowerPoint - 03-TCP Programming.ppt

9장 윈도우 소켓 프로그래밍

2009년 상반기 사업계획

bn2019_2

Microsoft PowerPoint - 06-CompSys-16-Socket.ppt

SMB_ICMP_UDP(huichang).PDF

Sena Device Server Serial/IP TM Version

<43B7CE20BECBBEC6BAB8B4C220BCD2C4CFC7C1B7CEB1D7B7A1B9D62E687770>

chapter4

SYN flooding

Microsoft Word - Network Programming_NewVersion_01_.docx

hd1300_k_v1r2_Final_.PDF

Microsoft PowerPoint - 15-EmbedSW-10-Socket

<4D F736F F D204B FC7C1B7CEB1D7B7A55FC0AFB4D0BDBA20B1E2B9DD20BCD2C4CF20C7C1B7CEB1D7B7A1B9D65FC0CCC8A3BCBA2E646F63>

자바-11장N'1-502

Microsoft PowerPoint PythonGUI-socket

1217 WebTrafMon II

TCP.IP.ppt


hd132x_k_v1r3_Final_.PDF

1. What is AX1 AX1 Program은 WIZnet 사의 Hardwired TCP/IP Chip인 iinchip 들의성능평가및 Test를위해제작된 Windows 기반의 PC Program이다. AX1은 Internet을통해 iinchip Evaluation

The Pocket Guide to TCP/IP Sockets: C Version

<4D F736F F F696E74202D20B3D7C6AEBFF6C5A9C7C1B7CEB1D7B7A1B9D65F FBCD2C4CF5FC3A4C6C35FBFA1C4DA2E BC8A3C8A

Microsoft Word doc

Network Programming

Microsoft PowerPoint C-구조체

Network Programming

Microsoft PowerPoint - Lecture_Note_2.ppt [Compatibility Mode]

USB USB DV25 DV25 REC SRN-475S REC SRN-475S LAN POWER LAN POWER Quick Network Setup Guide xdsl/cable Modem PC DVR 1~3 1.. DVR DVR IP xdsl Cable xdsl C

PowerPoint 프레젠테이션

PWR PWR HDD HDD USB USB Quick Network Setup Guide xdsl/cable Modem PC DVR 1~3 1.. DVR DVR IP xdsl Cable xdsl Cable PC PC DDNS (

Microsoft PowerPoint - 09-CE-24-채팅 프로그램

Subnet Address Internet Network G Network Network class B networ

슬라이드 1

게시판 스팸 실시간 차단 시스템

6주차.key

untitled

제20회_해킹방지워크샵_(이재석)

2-11Àå

Microsoft PowerPoint _TCP_IP


10. 시스템 프로그래밍

3ÆÄÆ®-11

Network seminar.key

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론

Chapter #01 Subject

Unix Network Programming Chapter 4. Elementary TCP Sockets

Switching

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

The OSI Model

SCTP 표준기술 동향

Microsoft PowerPoint UnixNetProg.ppt [호환 모드]


목차 목차포트스캔코드포트스캔결과포트스캔탐지코드포트스캔탐지결과 참조

13주-14주proc.PDF

untitled

Interstage5 SOAP서비스 설정 가이드

<4D F736F F F696E74202D20C1A63235C0E520B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D628B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

SRC PLUS 제어기 MANUAL

Microsoft PowerPoint - UnixNetProg.ppt [호환 모드]

슬라이드 1

전송계층프로토콜 TCP(Transmission Control Protocol) 전송계층에서동작하는연결지향형 (connectionoriented) 프로토콜 데이터의흐름을관리하고, 데이터가정확한지검증하며통신 쓰리웨이핸드셰이킹 (three-way handshaking) 을통

[ 목차 ] 1. 취약점개요 2. 배경지식 3. 취약점발생결과 (exploit 테스트 ) 4. 취약점발생원인분석 4.1 취약점 Q&A 5. exploit 분석 6. 보안대책 7. 결론 8. 레퍼런스 2

*****

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Transcription:

네트워크프로그래밍 02 장 TCP 소켓 (1) 1

목차 제 2장 TCP 소켓 1. IPv4 TCP 클라이언트 2. IPv4 TCP 서버 3. 소켓의생성과해지 4. 주소지정 5. 소켓에연결 6. 소켓을주소에바인딩하기 7. 클라이언트의연결요청처리 8. 데이터주고받기 9. IPv6의사용 2

소켓통신과정 간략화한소켓통신과정 소켓생성 TCP or UDP 소켓에주소정보할당 IP address, Port number 소켓연결 클라이언트소켓과서버소켓연결 bind(), listen(), connect(), accept() 데이터전송 send(), recv() 3

클라이언트 서버통신 클라이언트가먼저서버에게연결요청 서버의프로세스는미리소켓을열고대기하고있어야함 서버는특정포트를열고대기하여야하며클라이언트는이포트를알고있어야함 클라이언트는서버에연결 이때클라이언트는서버의 IP, Port 정보를응용프로그램에게명시하여접속가능 4

TCP 연결흐름도 연결요청 다음클라이언트로부터연결요청을기다림 5

TCP/IP 소켓의생성 소켓생성 어떠한소켓을생성할것인가를명시 ( 프로토콜종류 ) int socket(int family,int type,int proto); TCP/IP 소켓의경우 Family Type Protocol TCP PF_INET SOCK_STREAM IPPROTO_TCP UDP SOCK_DGRAM IPPROTO_UDP Socket 식별자 UNIX의파일식별자와동일 Windows의경우, WinSock에서사용하는소켓핸들 Windows 의경우, 파일핸들과같지않음 반환값 : 소켓식별자인양의정수, 에러의경우 -1 6

TCP/IP 소켓식별자 유닉스 / 리눅스계열에서식별자공간 0 1 Descriptor Table Data structure for file 0 Data structure for file 1 2 3 4 Family: PF_INET Service: SOCK_STREAM Local IP: 111.22.3.4 Remote IP: 123.45.6.78 Local Port: 2249 Remote Port: 3726 7

TCP/IP 소켓의주소지정 (1) struct sockaddr 사용 여러가지프로토콜을사용하기때문에 1) 프로토콜종류, 2) 주소를지정해야함 TCP/IP 의경우는인터넷주소임을알리는 AF_INET, IP 주소, Port 번호가필요 IP : IPv4 주소형식과 IPv6 주소형식으로나뉨 Ports : TCP/UDP 관계없이 0~65535 사이의값사용 well-known (port 0-1023) dynamic or private (port 1024-65535) 8

TCP/IP 소켓의주소지정 (2) 범용 (Generic) 소켓주소구조체 struct sockaddr { unsigned short sa_family; /* Address family (e.g., AF_INET) */ char sa_data[14]; /* Protocol-specific address information */ }; IPv4 에사용되는소켓주소구조체 struct sockaddr_in { unsigned short sin_family; /* Internet protocol (AF_INET) */ unsigned short sin_port; /* Port (16-bits) */ struct in_addr sin_addr; /* Internet address (32-bits) */ char sin_zero[8]; /* Not used */ }; struct in_addr { unsigned long s_addr; /* Internet address (32-bits) */ }; 교재본문과비교 sockaddr Family Blob 2 bytes 2 bytes 4 bytes 8 bytes sockaddr_in Family 9 Port Internet address Not used

TCP/IP 소켓의주소지정 (3) IPv6 에사용되는소켓주소구조체 struct sockaddr_in6 { sa_family_t sin6_family; in_port_t sin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr; uint32_t sin6_scope_id; }; // Internet protocol(af_inet6) // Address port(16bits) // Flow information // IPv6 address(128bits) // Scope identifier struct in_addr{ uint32_t s_addr[16]; }; // Internet address(128bits) 모든종류의 sockaddr 을수용하기위한구조체 struct sockaddr_storage { sa_family_t }; 10

주소정보를소켓에할당 bind() 를사용하여주소정보를생성된소켓에할당 int bind( int sockfd, struct sockaddr *localaddr, int addrlen); 성공시 0, 실패시 -1 int mysock,err; struct sockaddr_in myaddr; char* servip; /* ex)203.252.164.143 */ mysock = socket(pf_inet,sock_stream,0); myaddr.sin_family = AF_INET; myaddr.sin_port = htons( portnum ); myaddr.sin_addr.s_addr = inet_addr(servip); err=bind(mysock, (sockaddr *) &myaddr, sizeof(myaddr)); 11

서버의연결대기함수 - listen() TCP 와같은연결지향서버에사용 소켓의상태를대기상태로바꿈 int listen(int socket, int queuelimit); socket: 생성된소켓의식별자 queuelimit : 연결을수행중에다른연결이들어오면연결요청을 queue 에넣고보류, 이때사용하는 queue 의크기 12

서버의연결대기함수 - accept() int accept(int socket, struct sockaddr *clientdaddress, int *addr_len); listen() 호출후, accept() 를수행하면 클라이언트의연결요청 (connect()) 에대해응답합 passive open 클라이언트와데이터송수신 (send/recv) 이가능한새로운소켓식별자를반환 13

클라이언트의연결함수 - Connect() int connect(int socket, struct sockaddr *foreignaddress, int addr_len); 클라이언트는 connect() 를호출하여연결의상태를 active open 으로만듬 foreignaddress 는서버의 IP, port 를담고있는주소구조체 14

Send(to), Recv(from) 연결이이루어진후에는 send/recv 를이용하여데이터의송수신이가능 int send(int socket, char *message, int msg_len, int flags); 주어진소켓을통하여 message 의송신이가능 int recv(int scoket, char *buffer, int buf_len, int flags) 주어진소켓을통해주어진 buffer 에데이터를수신 15

클라이언트와서버의통신 클라이언트 : 연결을초기화하는주체 Client: Bob Server: Jane Hi. I m Bob. Hi, Bob. I m Jane Nice to meet you, Jane. 서버 : 수동적으로연결을기다림 16

TCP 상의서버 / 클라이언트통신 서버는클라이언트의연결을받아들일준비를하고시작 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료 17

TCP 상의서버 / 클라이언트통신 /* Create socket for incoming connections */ if ((servsock = socket(pf_inet, SOCK_STREAM, IPPROTO_TCP)) < 0) DieWithSystemMessage("socket() failed"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료 18

TCP 상의서버 / 클라이언트통신 echoservaddr.sin_family = AF_INET; /* Internet address family */ echoservaddr.sin_addr.s_addr = htonl(inaddr_any);/* Any incoming interface */ echoservaddr.sin_port = htons(echoservport); /* Local port */ if (bind(servsock,(struct sockaddr *) &echoservaddr, sizeof(echoservaddr)) < 0) DieWithSystemMessage("bind() failed"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료 19

TCP 상의서버 / 클라이언트통신 /* Mark the socket so it will listen for incoming connections */ if (listen(servsock, MAXPENDING) < 0) DieWithSystemMessage("listen() failed"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료 20

TCP 상의서버 / 클라이언트통신 for (;;) /* Run forever */ { clntlen = sizeof(echoclntaddr); if ((clntsock=accept(servsock,(struct sockaddr *)&echoclntaddr,&clntlen)) < 0) DieWithError("accept() failed"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료 21

TCP 상의서버 / 클라이언트통신 서버는이시점에서클라이언트의연결을처리하기위해서대기 클라이언트는서버에연결시도 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료 22

TCP 상의서버 / 클라이언트통신 /* Create a reliable, stream socket using TCP */ if ((sock = socket(pf_inet, SOCK_STREAM, IPPROTO_TCP)) < 0) DieWithSystemMessage("socket() failed"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료 23

TCP 상의서버 / 클라이언트통신 echoservaddr.sin_family = AF_INET; /* Internet address family */ echoservaddr.sin_addr.s_addr = inet_addr(servip); /* Server IP address */ echoservaddr.sin_port = htons(echoservport); /* Server port */ if (connect(sock,(struct sockaddr *)&echoservaddr, sizeof(echoservaddr)) < 0) DieWithSystemMessage ("connect() failed"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료 24

TCP 상의서버 / 클라이언트통신 if ((clntsock=accept(servsock,(struct sockaddr *)&echoclntaddr,&clntlen)) < 0) DieWithError("accept() failed"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료 25

TCP 상의서버 / 클라이언트통신 echostringlen = strlen(echostring); /* Determine input length */ /* Send the string to the server */ if (send(sock, echostring, echostringlen, 0)!= echostringlen) DieWithUserMessage ("send() sent a different number of bytes than expected"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료 26

TCP 상의서버 / 클라이언트통신 /* Receive message from client */ if ((recvmsgsize = recv(clntsocket, echobuffer, RCVBUFSIZE, 0)) < 0) DieWithSystemMessage("recv() failed"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료 27

TCP 상의서버 / 클라이언트통신 close(sock); close(clntsocket); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료 28

TCP 데이터교환 클라이언트는사전에서버의주소정보 (IP, port) 를알아야함 서버는클라이언트가접속할포트만정하고있음 send() 와 recv() 간에는어떠한정해진룰이없음 Client send( Hello Bob ) recv() -> Hi Jane Server recv() -> Hello recv() -> Bob send( Hi ) send( Jane ) 29

연결종료 연결을종료하기위해서 close() 를사용 파일의 EOF 와유사 echo Client echo Server send(string) while (not received entire string) recv(buffer) print(buffer) recv(buffer) while(client has not closed connection) send(buffer) recv(buffer) close(socket) close(client socket) 30