소켓이란 네트워크 프로그램을 개발할 수 있도록 운영체제에서 제공하는 인터페이스라고 표현할 수 있다. 즉 네트워크를 통해 데이터 패킷을 주고 받는 개체인 통신 종점이다.    

일반적으로 우리가 사용하는 소켓은 BSD소켓이다 
BSD 소켓은 네트워크 프로그램을 개발하기 위한 함수 및 라이브러리 등을 포함하고 있고 대부분의 네트워크 프로그램이 소켓 관련 라이브러리를 사용하여 개발된다.

리눅스를 포함함 유닉스 등의 POSLX 계열의 운영체제는 대부분 BSD 소켓을 원형 그대로 지원하고 있지만, 윈도우 소켓은 BSD 소켓을 기반으로 일부 고유 기능을 수정, 확장하여 제공함

소켓은 크게 2가지 형태로 사용할 수 있다


첫 번째 형태는 스트림 소켓이다


스트림 소켓은 데이터를 구분하는 레코드의 경계 없이 바이트 스트림인 데이터를 송수신하며 , 정확하게 순차적이고 중복되지 않는 전달을 보장한다.
전송 프로토콜로는 TCP를 사용한다.

두 번째 형태는 데이터그램 소켓이다.

데이터그램 소켓은 전달이 보장되지 않으며 순차적이지 않거나 중복될 수 있는 레코드 기반으로 데이터를 송수신한다.
데이터그램 , 소켓에 사용되는 전송 프로토콜로는 UDP를 사용한다.

---------------------------------------------------------------------------------------------

소켓 관련 함수 

1
2
3
4
5
6
7
#ifndef __linux__
    #include <winsock2.h>
#else
    #include <sys/types.h>
    #include <sys/socket.h>
#endif
int socket(int domain, int type, int protocol);

cs

socket() 함수는 소켓을 초기화하는 함수이다

첫 번째 인자는 통신 도메인을 지정하는 인자로 어떤 네트워크에서 사용될 소켓인지 지정하는 인자이다 .
소켓은 TCP/IP 인터넷 망에서 사용될 수 있을 뿐만 아니라 다른 망에서도 함께 사용될 수 있다.
첫 번째 인자를 통해서 어떤 망에서 사용될 소켓인지 지정할 수 있다.

두 번째 인자는 스트림을 의미하는 SOCK_STREAM이 존재하고 데이터그램을 의미하는 SOCK_DGRAM이 있다. 
프로토콜 헤더를 직접 만들 필요가 있는 경우에는 SOCK_RAW을 사용한다.
RAW소켓은 특별한 형태의 패킷을 만들어서 전송할 수 있을 뿐만 아니라 다른 어플리케이션이 송수신하는 네트워크 패킷의 데이터를 함께 확인할 수 있다
윈도우에서는 RAW 소켓을 지원하지 않고 리눅스에서는 root권한 으로만 실행이 가능하다.

세 번째 인자는 어떤 통신 프로토콜을 사용할 것인지 지정하는 것으로 정상적으로 생성이되면 각각의 소켓을 구분할 수 있는 소켓 디스크립터가 리턴되며 , 소켓을 생성하는 과정중에서 에러가 발생하면 0 혹은 0 이하의 수가 반환이 된다 .

connect() 함수

1
2
3
4
5
6
7
#ifndef __linux__
    #include <winsock2.h>
#else
    #include <sys/type.h>
    #include <sys/socket.h>
#endif
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
cs

connect() 함수는 연결 대기 중인 서버로 실제 연결을 맺는 함수다.
소켓을 생성할때 SOCK_STREAM으로 생성된 경우에 클라이언트에서 서버에 접속하기 위하여 사용하는 함수다.

첫 번째 인자는 socket 함수를 호출한 뒤에 리턴되는 소켓 디스크립터를 지정한다

두 번째 인자는 접속하고자 하는 아이피 및 서버 포트 정보가 있는 sockaddr 구조체의 주소값을 지정한다 ( 서버 주소 정보 )

세 번쨰 인자는 sockaddr *addr 포인터가 가리키는 구조체의 크기를 TCP/IP의 실제 주소 정보를 저장하기 위해서는 sockaddr_in 구조체가 사용된다

sockaddr_in의 구조체는 아래와 같이 이루어져있다

1
2
3
4
5
6
 struct sockaddr_in{
   short sin_family;
   unsigned short sin_port;
   struct in_addr sin_addr;
   char sin_zero[8];
};
cs

sin_family : 주소 패밀리(AF_INET이여야 한다.)
sin_port   : UDP , TCP 프로토콜에서 사용되는 포트 주소값을 저장한다
sin_addr  : IP 주소값을 저장하기 위한 멤버 변수 , 주소를 저장할 수 있는 구조체 in_addr을 사용한다
sin_Zero  : sockaddr 구조체와 같은 크기를 유지하기 위해서 필요한 패딩 공간이며 항상 0이 저장되있어야 한다.

in_addr 구조체는 멤버를 단 한 개를 갖고 있으며 4바이트 크기의 변수 s_addr을 갖는 구조체이다.

1
2
3
4
5
typedef uint32_t in_addr_t;
struct in_addr
{
    in_addr_t s_addr;
};

connect() 함수를 호출한 뒤에는 서버와의 연결이 성공적으로 이뤄지게 되면 0을 리턴하고 연결에 실패하면 0보다 작은 값을 리턴한다.


bind() 함수

1
2
3
4
5
6
7
8
#ifndef __linux__
    #include <winsock2.h>
#else
    #include <sys/types.h>
    #include <sys/socket.h>
#endif
 
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
cs


bind() 함수는 서버에서 소켓 연결에 사용되는 주소를 소켓에 할당하기 위해서 사용되는 함수.

첫 번째 인자는 소켓을 생성한 후 리턴되는 소켓 디스크립터이다.
두 번쨰 인자는 sockaddr 구조체의 주소값
세 번째 인자는 sockaddr *addr 포인터가 가리키는 구조체의 길이.

bind() 함수에서는 connect() 함수와는 달리 소켓 디스크립터에 할당하는 즉 연결받고자 하는 주소값이 저장된 sockaddr 구조체의 주소값이다 .

(연결을 하는 입장인지 받는 입장인지 봐야할 것)

[출처 : http://forum.falinux.com/zbxe/index.php?document_srl=438301&mid=C_LIB]


listen() 함수 

1
2
3
4
5
6
7
8
#ifndef __linux__
    #include <winsock2.h>
#else
    #include <sys/types.h>
    #include <sys/socket.h>
#endif
 
int listen(int sockfd, int backlog);
cs

listen() 함수는 해당 소켓에서 연결을 기다리는 함수다
첫 번째 인자는 소켓을 생성한 뒤에 리턴되는 소켓 디스크립터이다.
두 번째 인자는 연결을 기다리는 대기열 큐의 사이즈이다.


accept() 함수

1
2
3
4
5
6
7
8
#ifndef __linux__
    #include <winsock2.h>
#else
    #include <sys/types.h>
    #include <sys/socket.h>
#endif
 
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
cs

accept() 함수는 해당 소켓에 연결 요청이 왔을 때 연결을 받아들이는 함수이다.
연결이 성공적으로 이루어졌을때 리턴 되는 값은 연결을 받아들인 새로운 소켓 이며 연결에 실패했을때는 0 아니면 0 이하의 수를 리턴한다 .

첫 번째 인자는 소켓 디스크립터이다
두 번쩨 인자는 클라이언트의 주소 정보 정보가 저장될 구조체의 주소값이다.
세 번째 인자는 sockaddr 구조체의 길이가 저장된 변수의 주소값이다.

해당 소켓으로서 연결 요청이 없는 경우에는 클라이언트가 연결을 요청할 때까지 소켓을 계속 감시하면서 대기 상태를 유지하게 된다.


send() 함수

1
2
3
4
5
6
7
8
#ifndef __linux__
    #include <winsock2.h>
#else
    #include <sys/types.h>
    #include <sys/socket.h>
#endif
 
ssize_t send(int sokcfd, const void *buf, size_t len, int flags);
cs

SOCK_STREAM으로 생성된 소켓에서 데이터를 수신받기 위한 함수다

첫 번째 인자 : 소켓 디스크립터
두 번째 인자 : 보내고자 하는 데이터의 시작 주소값
세 번째 인자 : 데이터의 시작 주소부터 끝까지의 길이
네 번째 인자 : -1 이외 : 실제 전송한 바이트수 -1 :실패

'네트워크' 카테고리의 다른 글

와이파이 에어 크랙  (0) 2017.01.09
TCP 서버 예제  (0) 2016.08.12
클라이언트와 서버  (0) 2016.08.11
네트워크 서비스  (0) 2016.08.11
프로토콜  (0) 2016.08.11

클라이언트(client)는 서비스를 이용하는 사용자 혹은 사용자의 단말기를 가리키는 말이고 서버는 서비스를 제공 하는 컴퓨터이다 .
서버는 다수 클라이언트를 위해 존재하기 때문에 매우 큰 용량과 성능을 가지고 있는 것이 일반적이다 

요청

                  ----------------------------------------------->   

클라이언트    ----------------------------------------------->    서버
                                        응답

WWW뿐만 아니라 SMTP , Telnet , DNS와 같은 고전적인 서비스에서부터 게임 , 멀티미디어 서비스의 상당수가 클라이언트/서버 모델을 기반으로 한다.

'네트워크' 카테고리의 다른 글

TCP 서버 예제  (0) 2016.08.12
소켓  (1) 2016.08.11
네트워크 서비스  (0) 2016.08.11
프로토콜  (0) 2016.08.11
OSI 모델  (0) 2016.08.11

HTTP

HyperText Transfor Protocol는 WWW 상에서 정보를 주고받을 수 있는 프로토콜이며 주로 HTML 문서를 주고받는 데 쓰인다.
HTML 문서 안에 포함된 동영상 , 이미지 , 바이너리 파일 또한 HTML 문서와 함께 주고받는다.
통신 프로토콜은 주로 TCP를 사용하며 기본 포트를 80번을 사용한다.

FTTP

File Transfer Protocol 파일 전송 프로토콜은 TCP/DIP 프로토콜을 가지고 서버와 클라이언트 사이의 파일을 전송하기 위한 프로토콜이다.
응용 계층에 속한다.

SMTP

Simple Mail Transfer Protocol은 같이 전자 우편 전송 프로토콜로 인터넷에서 E-메일을 보내기 위해 이용되는 포로토콜이다 
TCP 포트 번호는 25번이다.
메일 서버 간의 송수신뿐만 아니라 메일 클라이언트에서 메일 서버로 메일을 보낼 때도 사용되는 경우가 많다.

'네트워크' 카테고리의 다른 글

소켓  (1) 2016.08.11
클라이언트와 서버  (0) 2016.08.11
프로토콜  (0) 2016.08.11
OSI 모델  (0) 2016.08.11
네트워크란?  (0) 2016.08.11

프로토콜은 컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고받는 약속이다.
프로토콜은 형식 , 의미론 그리고 통신의 동기 과정 등을 정의하기는 하지만 구현되는 방법과는 독립적이다. 
프로토콜은 하드웨어 , 소프트웨어 때로는 두 가지 모두를 사용하여 구현하기도 한다.

ARP 
Address Resolution Rrotocol은 주소 결정 프로토콜로 IP 주소를 물리주소로 변환하기 위해서 사용되는 프로토콜이다.
일반적으로는 IP 주소를 이용하여 목적지로 찾아가는 것으로 생각을 하지만 사실 내부적으로는 노드에서 노드로 한 단계씩 전달되면서 마지막에 최종 목적지로 전달되게 한다.

TCP
Transmisssion Control Protocol은 IP와 함께 인터넷을 구성하는 아주 중요한 요소이며 TCP/IP라고도 한다 TCP는 전송되는 데이터를 안정적으로 , 순서대로 ,에러 없이 교환할 수 있게 한다. 데이터를 수신한 뒤에 확인 응답을 보냄으로써 안정적으로 통신할 수 있는데 안정성을 확보하기 위해서 확인 응답을 보내는것을 때로는 오버헤드가 발생한다는 단점이 될 수도 있다.

UDP
User Datagram Protocol은 TCP와 마찬가지로 데이터를 전송하기 위해서 사용되는 프로토콜 UDP의 전송 방식은 단순해서 서비스의 신뢰성이 낮고 데이터그램이 도착하는 순서가 바뀌거나 중복되거나 통보 없이 누락시키기도 하지만 TCP에 비해서 오버헤드가 적고 전송속도가 빨라서 온라인 게임과 같은 곳에서 많이 사용된다    

IP

Internet Protocol은 네트워크에서 전송을 담당하는 프로토콜 
신뢰성이 없고 비연결지향적이며 데이터를 전달하지만 데이터가 정상적으로 전달되는지 책임은 지지 않는 특징이 있다 .
네트워크 통신이 끊겨서 데이터가 전달되지 않더라도 책임을 지지 않는다 .
따라서 인터넷에서는 데이터가 안정적으로 전달되기 위하여 TCP와 병행하여서 사용한다. 

ICMP

Internet Control Message Protocol은 인터넷 제어 메시지 프로토콜이며 네트워크에서 오류메시지를 전송받는 데 주로 쓰인다. 인터넷 프로토콜에 의존하여서 작업을 수행한다. 엔드 시스템(호스트) 간 자료를 주고받는 역할을 수행하지 않는 역할에서 TCP와 UDP와는 성질이 다르다고 한다. 



'네트워크' 카테고리의 다른 글

소켓  (1) 2016.08.11
클라이언트와 서버  (0) 2016.08.11
네트워크 서비스  (0) 2016.08.11
OSI 모델  (0) 2016.08.11
네트워크란?  (0) 2016.08.11

네트워크 간 연결에 어려움이 많고 이러한 호환성의 결여를 막기 위하여 ISO에서는 OSI 7계층을 제안했다 

1 계층 - 물리 계층 (Physical Layer)

물리 계층을 구성하는 하드웨어는 전선, 전파, 광섬유, 동축 케이블, 모뎀 등이 있으며 
물리 계층에서 사용되는 프로토콜은 Ethernet , RS-232C 등이 있다.
물리적 매체를 통해 비트 흐름을 전송하기 위해 요구하는 기능들을 조정한다
네트워크의 두 노드를 물리적으로 연결하는 신호 방식을 다룬다.

2 계층 - 데이터 링크 계층 (Data link Layer)

데이터 링크 계층을 구성하는 대표적인 프로토콜에는 Etherner , Token Ring, PPP , 
HDLC , Frame relay , ISDN , ATM , 무선 랜 , FDDI가 있으며, 하드웨어 장비로는 브리지 ,스위치 등이 있다. 오류 없이 한 장치에서 다른 장치로 프레임(비트의 모음)을 전달하는 역할을 하며 , 스위치 같은 장비는 MAC 주소를 이용하여 정확한 장치로 정보를 전달한다.  주로 3계층에서 정보를 받아 주소와 제어 정보를 시작(헤더)과 끝(테일)에 추가하는 역할을 한다.

3 계층 - 네트워크 계층 (Network Layer)

네트워크 계층에서 사용되는 프로토콜에는 IP, ICMP, IGMP등이 있으며 네트워크 계층의 대표적인 장비로는 라우터가 있다
다중 네트워크 링크에서 패킷(Packet)을 발신지로부터 목적지로 전달할 책임을 갖는다.
2계층은 노드 대 노드 전달을 감독하고 3계층에서는 각 패킷이 시작 시점에서 최종 목적지까지 성공적이고 효과적으로 전달되도록 한다 
대표적인 프로토콜은 IP다.

4 계층 - 전송 계층 (Transport Layer)

대표적인 프로토콜에는 TCP , UDP 등이 있으며 전체 메시지를 발신지 대 목적지 간 제어와 에러를 관리한다. 패킷들의 전송이 유효한지 확인하고 실패한 패킷은 다시 보내는 둥 신뢰성 있는 통신을 보장하는 역할을 담당한다.

5 계층 - 세션 계층(Session Layer)

대표 적인 프로토콜에는 SSH ,TLS가 있으며 응용 간의 질서 제어 역할을 수행하는 통신 세션을 구성하는 계층 , 통신장치 간의 상호작용을 설정하고 유지하며 동기화하여 사용자 간의 포트연결(세션)이 유효한지 확인하고 설정하는 역할을 한다.

6 계층 - 표현 계층 (Presentation Layer)

입력 또는 출력되는 데이터를 하나의 표현 형태로 변환하는 계층으로 필요한 번역을 수행하여 두 장치가 일관되게 전송 데이터를 서로 이해할 수 있도록 하는 역할을 한다.

7 계층 - 응용 계층 (Application Layer)

사용자가 네트워크에 접근할 수 있도록 해주는 계층 대표적인 서비스 또는 프로토콜로는 텔넷이나 HTTP, SSH, SMTP , FTP 등을 들 수 있다 .

'네트워크' 카테고리의 다른 글

소켓  (1) 2016.08.11
클라이언트와 서버  (0) 2016.08.11
네트워크 서비스  (0) 2016.08.11
프로토콜  (0) 2016.08.11
네트워크란?  (0) 2016.08.11

컴퓨터 네트워크또는 컴퓨터망은 분산된 컴퓨터를 통신망으로 연결한 것을 말한다.

두 대의 단말기만 서로 연결하여도 하나의 사설 컴퓨터 네트워크가 되기 때문에 컴퓨터 네트워크의 종류는 상당히 많고 다양하다 .
여러 종류의 컴퓨터 네트워크 중에서 가장 커다랗고 다양한 단말기들이 연결된 것이 인터넷이라는 거대한 네트워크 네트워크이다.
인터넷은 전 세계의 컴퓨터가 서로 연결되어 TCP/IP 통신 프로토콜을 이용하여 정보를 주고받는 컴퓨터 네트워크이다.


MAC 주소 

MAC 주소는 네트워크 장비의 하드웨어 주소로 48비트의 크기를 갖는다.
MAC 주소는 16진수로 표시하는데 바이트마다 구분자 : 를 표기한다.
전송 계층의 IP는 IP 주소를 이용하여 서로의 호스트를 구분하였지만 로컬 네트워크 내의 데이터 링크 계층에서는 MAC 주소를 이용하여 상대방 호스트를 구분하여 통신함


IP 주소 

TCP/IP 프로토콜을 사용하는 인터넷은 IP 주소를 이용하여 각각의 단말기들을 구분할 수 있다. IP 주소는 통신을 위하여 각각의 컴퓨터와 통신 장비에 부여하는 고유한 주소이다.
IP 주소는 32비트 길이의 식별자로 0.0.0.0 - 255.255.255.255까지 숫자의 조합으로 이뤄지며 한 국가에서만 사용하는것이 아니라 전세계에서 주소를 관리하고 있다
자기 자신을 가리키는 IP 주소값은 127.0.0.1이다 

포트

IP , MAC 주소 일반적으로 하나의 단말에 할당이 되고 그것을 관리하기 위한 주소다.
그러나 한 대의 PC에서는 한 개의 프로그램만 실행되는 것이 아니라 여러 가지 프로그램이 실행되고 각각이 인터넷을 통하여 외부와 통신을 한다 .

이렇게 각각의 프로그램을 구분할 떄는 포트를 사용한다 포트는 통신 프로토콜에 사용되는 논리적인 통신 연결 단어이다.

포트는 고유한 번호는 갖고 포트 번호는 2바이트 정수형의 크기를 갖기 때문에 
0~65535까지의 고유 번호를 가지지고 포트 번호는 세 가지 종류로 구분이 가능하다.

이런식으로 각자 다른 IP가 할당된 컴퓨터에서 똑같은 포트로 향한다.

0 ~ 1023        : 잘 알려진 포트 
1024 ~ 49151  : 등록된 포트
49152 ~ 65535 : 동적 포트

호스트

단말기 == 호스트 

인터넷을 통해 다른 컴퓨터들과 쌍방향 통신할 수 있는 컴퓨터를 일컫는다.


라우터

네트워크와 네트워크 간의 경로를 설정해 주는 장비이며 목적지로 데이터를 전달하기 위해서 어떤 네트워크로 데이터를 전달하면 되는지 알려주는 장비이다.


게이트웨이

현재 사용자가 위치한 네트워크에서 다른 네트워크로 이동하기 위해 반드시 거쳐야 하는 거점을 의미한다 (라우터가 게이트웨이의 기능을 포함함)


전송 매체

유선 , 무선 유선은 동축케이블 , 광섬유 , 꼬임쌍선으로 나눌 수 있다.
유선에서는 UTP 케이블이 가장 많이 사용되고 있다 .


'네트워크' 카테고리의 다른 글

소켓  (1) 2016.08.11
클라이언트와 서버  (0) 2016.08.11
네트워크 서비스  (0) 2016.08.11
프로토콜  (0) 2016.08.11
OSI 모델  (0) 2016.08.11

+ Recent posts