TCPIP 1주차

Download Report

Transcript TCPIP 1주차

TCP / IP 소켓 프로
그래밍
1주차
( 스터디 계획 및 Ch.1 ~ Ch.4 )
스터디 교재 및 방향
• 교재
• 윤성우의 열혈 TCP/IP 소켓 프
로그래밍
(윤성우 저)
• 방향
• Part1 ~ Part 2 4주
• Part3 ~ Part 4 2주
• 채팅 프로그래밍
8주
2주
세부 계획
스터디 계획 및 Ch.1 ~
Ch.4
1주차
Ch.5 ~ Ch.10.2
2주차
Ch.10.3 ~ Ch.14
3주차
Ch.15 ~ Ch. 17
4주차
기말고
사
Ch.18
5주차
기말고
사
Ch.19 ~ Ch.24
6주차
채팅 프로그래밍
7주차
채팅 프로그래밍
8주차
채팅 프로그래밍
• 7 ~ 8주차
• 기본 사용 언어 : C
C 선택 시 윈도우나 리눅스 환경 중 택 1
• 선택 사항 : C 이외의 언어, GUI
스터디 수행 환경
윈도우
리눅스
• Visual Studio
• WMWARE 가상 리눅스
• Ws2_32.lib 라이브러리를 링
크시켜 사용
• Cygwin
CHAPTER 1 & 2
소켓의 이해와 타입
소켓이란 무엇인가?
• 네트워크 망의 연결에 사용되는 도구
• 연결요청을 수락하는 기능의 프로그램이 서버
• Socket->bind->listen->accept->read/write->close(리눅스 기
준)
• 연결요청을 하는 프로그램이 클라이언트
• Socket->connect->read/write->close(리눅스 기준)
리눅스와 윈도우 기반의 차이
점
• 윈도우 소켓은 상당부분이 BSD계열 유닉스 소켓을 참
고하여 설계
• 리눅스 기반 네트워크 프로그램의 일부만 변경하면
실행 가능할 정도로 유사
• 윈도우는 헤더파일(wnisock2.h)과 라이브러리(ws2_32.lib)
을 추가
• 윈도우는 반드시 프로그램에 WSAStartup함수를 호출
• 윈도우는 파일과 소켓을 구분
소켓의 타입
연결지향형 소켓
(TCP)
비 연결지향형 소켓
(UDP)
• 중간에 데이터가 소멸되지
않고 목적지로 전송
• 전송된 순서에 상관없이 가
장 바른 전송을 지향
• 전송 순서대로 데이터가 수
신
• 전송된 데이터는 손실의 우
려가 있고 파손의 우려 존재
• 전송되는 데이터의 경계가
존재하지 않음
• 전송되는 데이터의 경계가
존재
• 한번에 전송할 수 있는 데이
터의 크기가 제한
CHAPTER 3
주소 체계와 데이터 정렬
소켓에 할당되는 IP주소
인터넷주소란?
• 인터넷상에서 컴퓨터를 구분하는 목적으로 사용되는 주소.
• 4바이트 주소체계인 IPv4와 16바이트 주소체계인 IPv6가 존
재한다.
• 네트워크주소와 호스트주소로 나뉜다.
네트워크주소를 이용해서 네트워크를 찾고,호스트주소를
이용해서 호스트를 구분 한다.
번호
PORT번호
• IP는 컴퓨터를 구분하는 용도로 사용되며, PORT번호는 소켓을 구
분하는 용도로 사용된다.
• PORT번호는 하나의 운영체제 내에서 동일한 PORT번호를 둘 이상
의 소켓에 할당할 수 없다.
• PORT번호는 16비트로 표현, 따라서 그 값은0 이상65535 이하
• 0~1023 은 잘 알려진 PORT(Well-known PORT)라 해서 이미 용도가 결
정되어 있다.
<PORT번호에 의한 소켓의 구분과정>
바이트 순서와 네트워크 바이
트
• CPU에 따라서 상위 바이트를 하위 메모리주소에 저장하기도 하고,
상위 바이트를 상위 메모리 주소에 저장 하기도 한다. 즉, CPU마다
데이터를 표현 및 해석하는 방식이 다르다.
빅 앤디안
•
상위 바이트의 값을 작은 번지
수에 저장.
리틀 앤디안
•
상위 바이트의 값을 큰 번지수
에 저장.
• 네트워크 바이트 순서는 통일된 데이터 송수신 기준을 의미하며
빅 앤디안이 기준이다.
인터넷 주소의 초기화
• 일반적인 인터넷 주소의 초기화 과정
문자열로 표현된 IP주소와 PORT번호를 기반으로 하는 sockaddr_in 구
조체 변수의 초기화 과정을 보여주는 코드이다.
소켓에 인터넷 주소 할당하기
변수를 초기화 시킨 후에는 초기화된 주소정보를 소켓에 할당해야 하는데 이때
bind함수가 이용된다.
클라이언트 프로그램이 아닌 서버 프로그램에서 이와 같은 코드구성을 기본적으
로 갖춤.
INADDR_ANY
• INADDR_ANY : 소켓이 동작하는 컴퓨터의
IP주소의 상수 값
CHAPTER 4
TCP 기반 서버/클라이언트 1
TCP / IP 계층
APPLICATION 계층
TCP 계층
UDP 계층
IP 계층
프로그램 성격에 따른 클라이
언트와 서버간의
데이터 송수신에 대한 약속
경로 정보를 바탕으로 데이터
의 실제 송수신
목적지에 대한 경로 설
정
Routing 알고리즘
LINK 계층
물리적인 영역의 표준
화
Network 카드, LAN, WAN, MAN 등
TCP / IP 의 구조
HOST 1
HOST 2
APPLICATION 계층
APPLICATION 계층
TCP 계
층
게이트웨
이
및
라우터
UDP 계
층
IP 계층
TCP 계
층
IP 계층
IP 계층
LINK 계층
및
물리적 계
층
LINK 계층
서브 네트
워크
UDP 계
층
LINK 계층
서브 네트
워크
TCP/UDP 란?
• IP의 상위계층에서 호스트 대
호스트의 데이터 송수신 방식
을 약속하는 것이 TCP / UDP
• 데이터의 전손을 보장하는 프
로토콜 TCP
전송을 보장하지 않는 프로토
콜 UDP
• TCP는 신뢰성을 보장하기 때
문에 UDP에 비해 복잡
• TCP는 확인절차를 걸쳐서 신
뢰성 없는 IP에 신뢰성을 부여
계층화의 장점
• 표준화 작업을 통한 ‘개방형 시스템’의 설계를
가능하게 함.
• 표준이 존재하기에 빠른 속도의 기술 발전이 가
개방형
시스템이란?
능하게
함. 여러 개의 표준을 근거로 설계된
시스템 (예: TCP/IP 프로토콜)
개방형 시스템의 장점은? IP계층을 담당하는 라우터나
LINK계층을 담당하는 네트워크 카드를 교체해야 할 때
같은 모델이 아닌 타사의 제품을 가능하게 함.
TCP 서버의 함수 호출 순서
listen 함수가 호출되면 클
라이언트는 connect 함수
를 호출할 수 있다.
accept 함수가 호출되면 대
기중인
클라이언트의 연결 요청
을 수락한다
TCP 클라이언트의 함수 호출 순
서
connect 함수를 호출하면
‘연결 요청을 접수’할 수
있다.
클라이언트에서는 connect
함수가 서버의 bind 함수
와 같이 자동으로 IP와
PORT를 할당해준다.
TCP 기반 서버의 함수 호출 관
계
connect 함수는 서버의
listen 함수가 호출되면 그
이후에 호출이 가능하다.
또한 connect 함수가 호출
되기 전에 먼저 accept 함
수가 호출 될 수 있다.
(accept 함수 호출 이후 블
로킹 상태)
ITERATIVE 서버
Accept 함수를 통해서 대
기중인
클라이언트와 연결하고
Read / write 를 수행 후
클라이언트를 종료한다
위를 반복 수행 한다.
ECHO 서버
if(listen(hServSock, 5)==SOCKET_ERROR) ErrorHandling("listen() error");
clntAdrSize=sizeof(clntAdr);
for(i=0; i<5; i++) {
hClntSock=accept(hServSock, (SOCKADDR*)&clntAdr, &clntAdrSize);
if(hClntSock==-1) ErrorHandling("accept() error");
else printf("Connected client %d \n", i+1);
while((strLen=recv(hClntSock, message, BUF_SIZE, 0))!=0)
send(hClntSock, message, strLen, 0);
closesocket(hClntSock);
}
ECHO 클라이언트
Q or q
입력 시 종료
while(1)
{
fputs("Input message(Q to quit): ", stdout);
fgets(message, BUF_SIZE, stdin);
if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))
break;
send(hSocket, message, strlen(message), 0);
strLen=recv(hSocket, message, BUF_SIZE-1, 0);
message[strLen]=0;
printf("Message from server: %s", message);
}
ECHO 서버/클라이언트
Echo
Server
Echo
Client
ECHO 서버/클라이언트2
Echo
Server
Echo
Client
Echo
Client2
ECHO 서버/클라이언트2
Echo
Server
Echo
Client
Echo
Client2
ECHO 서버/클라이언트 문제점
Echo
Client
• TCP는 데이터 송수신간에 경계가
존재하지 않는다.
send(hSocket, message, strlen(message), 0);
•
strLen=recv(hSocket, message, BUF_SIZE-1, 0);
message[strLen]=0;
printf("Message from server: %s", message);
한 번의 read 함수로 전송된 문자
열 전체를 읽어 들일 수 있다 가정
하고 있다.
• TCP의 경우 서버나 운영 체제가
문자열이 길다고 판단하면 여러
번에 나누어 보낼 수 있기에 일부
while((strLen=recv(hClntSock, message, BUF_SIZE, 0))!=0)
의 문자열만 읽힐 수 있다.
Echo
Server
send(hClntSock, message, strLen, 0);