4-1 TCP/UDP에 대한 이해
TCP/IP 프로토콜 스택
응용프로그램 계층 : 응용프로그램 응용프로그램
전송(Transport) 계층 : TCP UDP
네트워크 (Network)계층: IP
데이터링크 계층 : LINK
물리 계층
데이터링크 계층
LAN, WAN, MAN과 같은 네트워크 표준과 관련된 프로토콜의 정의한다.
IP 계층
어떻게 길을 찾아 갈 것인가?
라우터끼리는 (도로사정)이 어떤지 서로 통신하여 패킷을 보낼 최적의 길을 찾는다.
신뢰할 수 없는 프로토콜(데이터가 손실 될 수 있고) 경로가 일정치 않으며 패킷을 보낸 순서도 보장하지 못한다. 비연결 지향 프로토콜이다.
TCP/UDP
(IP 계층을 기반으로 하여 ) 데이터를 어떻게 전송할 것인가?
TCP/UDP(2가지 프로토콜) 중에 원하는 프로토콜을 선택한다.
TCP와 IP의 관계
IP를 기반으로 길을 찾고 TCP를 통해 연결 지향 및 신뢰성 있는 통신을 제공한다.
호스트대 호스트가 어떻게 데이터를 주고 받을 것인지 약속.
IP(편지에 비유) -> 패킷(편지)을 잃어버림
TCP의 역할
A 호스트가 B 호스트에게 패킷을 하나 전송한다.
1. B가 잘 받았을 경우 : 응답용 패킷을 A에게 전송한다.
2. B가 잘 못 받았을 경우 : A는 B가 데이터를 수신하지 못했다고 간주하고 임의의 시간 후 재전송.
4-2. TCP 기반 서버의 구현
socket - 소켓 생성
bind - 주소할당
listen - 연결 요청 대기 상태 (친구에게 전화가 올 수 있는 상태)
accept - 연결 허용(수화기를 든다.)
read & write - 데이터 송수신
close - 연결 종료
'연결 요청 대기 상태'로의 진입
1. listen 함수는 전달되는 인자의 소켓을 '서버 소켓'이 되게 한다.
2. listen 함수는 backlog의 수(대기실의 크기)만큼 '연결 요청 대기 큐'를 생성 한다.
3. 성공하면 '연결 요청 대기 상태'가 된다.
#include<sys/type.h>
int listen(int s, int backlog);
#include<winsock2.h>
int listen(SOCKET s, int backlog);
- socket : 서버소켓으로 만들 핸들 혹은 파일 디스크립터.
- backlog : 대기 큐(실)의 크기, 클라이언트 수.
서버의 역할과 연결요청 대기상태
서버 소켓은 일종의 '문지기'이다. (클라이언트의 연결 요청을 감지하고 받는다.)
클라이언트 - 서버로의 연결요청 - 서버 소켓 -> 대기실
※ 여러 사람의 요청을 받게 하기 위해 '큐(대기실)'를 만든다.
연결요청 수락하기
연결요청 대기 큐에 존재하는 클라이언트의 연결 요청 수락.
#include<sys/type.h>
#include<sys/socket.h>
int accept(int s, struct sockaddr *addr, int *addrlen);
#include<winsock2.h>
SOCKET accept(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen);
리턴값 : 클라이언트와 연결하기 위한 (밑의 그림의)New 소켓
addr : 클라이언트의 주소 정보가 채워진다.
addrlen : 정보구조체의 크기 정보가 채워진다.
listen ~ accept 과정
※ New 소켓은 자동적으로 만들어지며 이 New 소켓으로 클라이언트와 데이터 송수신이 가능하다.
4-3 TCP 기반 클라이언트의 구현
#include<sys/types.h>
#include<sys/socket.h>
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
sockfd : 연결 요청을 할 소켓
serv_addr : 주소정보
addrlen : 구조체 크기
※ 소켓은 연결하기 전에 미리 운영체제(커널)에 의해 임의로 할당된다.
4-4 서버/클라이언트 함수 호출 관계
※ listen()에서 대기 큐를 만들고 연결 요청을 받을 수 있는 서버 소켓을 만든다.
※ connect 함수는 서버의 IP, 포트를 설정해 주면 자동으로 클라이언트 컴퓨터 내의 임의의 포트에 운영체제가 통신하기 위한 소켓을 생성한다.
※ accept() 함수는 연결 요청 대기 큐가 비어있을 때까지 혹은 클라이언트가 연결할 때까지 block되어 있다.
=> 리턴 되면서 연결된다.
4-5 Iterative 서버의 구현
Iterative 서버 : 반복해서 클라이언트의 요청을 처리한다.
여러 클라이언트가 서버로 연결 요청을 한다. -> 연결 요청 대기 큐로 들어간다. -> 서버가 accept를 호출할 때마다 대기 큐에서 하나의 소켓을 꺼낸다. -> 그 소켓과 통신을 하고 끝나면 반복해서(Iterative) accept를 호출한다.
Iterative Server Template
※ 리턴 클라이언트 소켓은 하나다.
4-6 에코(echo) 서버/클라이언트의 구현
concurrent 서버(서버 하나와 클라이언트 여러 개 관계)
※ 버퍼 : 여기서는 프로그램 상의 버퍼. 문자열을 저장할 수 있는 배열.
※ 클라이언트에서 close(소켓핸들);을 호출하면 서버의 read함수의 리턴 값은 0이 된다.
'네트워크 프로그래밍' 카테고리의 다른 글
[TCP/IP 소켓 프로그래밍] 6. UDP 기반 서버/클라이언트 (0) | 2009.07.22 |
---|---|
[TCP/IP 소켓 프로그래밍] 5. TCP 기반 서버/클라이언트2 (0) | 2009.07.22 |
[TCP/IP 소켓 프로그래밍] 3. 주소 체계와 데이터 정렬 (0) | 2009.07.22 |
[TCP/IP 소켓 프로그래밍] 2. 소켓의 설정과 프로토콜의 설정 (0) | 2009.07.22 |
[TCP/IP 소켓 프로그래밍] 1. 네트워크 프로그래밍과 소켓의 이해 (0) | 2009.07.22 |