1.사용자계층 네트워크 애플리케이션 종류

발표자: 박광수

Socket 이란?

네트워크 소켓, 인터넷 소켓 : 네트워크로 연결되어 있는 통신 접점에 위치한 통신 객체

OS의 API의 일종 : 프로세스 간의 통신을 위하여 제공되는 API.

7 Layers

  • transport layer → TCP / UDP 소켓을 지원

  • TCP는 신뢰할 수 는 통신

  • UDP는 몇가지 신뢰도는 포기하되 좀더 직접적인 통신

스트림 소켓

  1. 양뱡향으로 바이트 스트림을 전송할 수 있는 연결 지향형 소켓

  2. 양쪽 어플리케이션이 모두 데이터를 주고받을 수 있음

  3. 오류수정 , 정송처리 , 흐름제어등을 보장, 송신된 순서에 따른 중복되지 않은 데이터를 수신

  4. 각 메시지를 보내기 위해 별도의 연결을 맺는 행위를 하므로 약간의 오버헤드가 존재

  5. 대량의 데이터를 보내는 경우에 적당

  6. 통신을 수행하기 위해서 TCP를 사용

데이터그램

  1. 명시적으로 연결을 맺지 않으므로 비 연결형 소켓이라 함

  2. 메시지는 대상 소켓으로 전송되며 대상 소켓은 메시지를 적절히 수신

  3. 데이터그램 소켓을 사용하려면 클라이언트에서 서버로 데이터를 전송할 때 UDP를 사용

  4. UDP-메시지의 크기에 약간의 제한, 메시지의 확실한 전달 역시 보장하지 않으며 통신 중 데이터를 잃어버려도 오류가 발생하지 않음.

TCP Socket

클라이언트 소켓 프로그래밍(Client Socket Programming)

  1. (C)클라이언트 소켓은 처음 소켓을 **생성(create)**한 다음, 서버 측에 **연결(connect)**을 요청

  2. (S)서버가 사용할 IP주소와 포트 번호를 생성해 소켓에 결합(bind)

  3. (S)클라이언트로부터 연결 요청이 수신되는 지 주시(listen)

  4. (S)요청이 수신되면 요청을 받아들어(accept) 데이터 통신을 위한 새로운 소켓을 생성

  5. (S/C)데이터를 송수신(send/recv)

  6. (S/C)송수신이 완료되면 소켓을 닫음(close)

서버 소켓 프로그래밍(Server Socket Programming)

서버 소켓 생성 socket() → 서버 소켓 바인딩 bind() → 클라이언트 연결 요청 대기 listen() → 클라이언트 연결 수립 accept() →데이터 송수신 send() / recv() →소켓 연결 종료 close()

Function

  1. socket (int domain, int type, int protocol); :

    소켓을 생성

    → int domain

    PF_INET : IPv4 인터넷 프로토콜

    PF_INET6 : IPv6 인터넷 프로토콜

    PF_LOCAL : Local 통신을 위한 UNIX 프로토콜

    PF_PACKET : Low level socket을 위한 인터페이스

    PF_IPX : IPX 노벨 프로토콜

    → int type

    SOCK_STREAM : 인터넷 기반 연결 지향 소켓(TCP 소켓)

    SOCK_DGRAM : 인터넷 기반 비연결 지향 소켓(UDP 소켓)

    → int protocol

    IPPROTO_TCP : TCP를 기반으로 하는 소켓을 생성

    IPPROTO_UDP : UDP를 기반으로 하는 소켓을 생성

    return : socket 의 ID 값

  2. bind(int sockfd, struct sockaddr *myaddr, int addlen);

    해당 포트를 특정 주소에 바인딩

    → sockfd : 주소를 할당하고자 하는 소켓의 파일 디스크립터를 인자로 전달한다.

    bind의 사용되는 파라미터는 포트 번호 혹은 IP 주소 + 포트 번호

    → myaddr : 할당하고자 하는 주소 정보를 지니고 있는 sockaddr_in 구조체 변수의 포인터를 인자로 전달

    → addrlen : 인자로 전달되느 주소 정보 구조체의 길이를 전달한다.

  3. listen (int sockfd, int backlog);

    → sockfd :연결 요청 대기 상태'에서 클라이언트의 연결 요청을 받아들이는 역할을 하게 될 소켓의 파일 디스크립터를 인자로 전달 하게 된다. 이 소켓을 서버 소켓이라 한다

    → backlog :'연결 요청 대기 큐(Queue)'의 크기를 나타낸다. 인자로 5가 들어오면, 큐의 크기가 5가 되어 클라이언트의 연결 요청을 5개까지 대기시킬 수 있게 된다.

  4. accept(int sockfd, struct socketaddr*myaddr, int addrlen);

    → 서버 측에서 클라이언트의 연결을 수락

    → 클라이언트 주소를 설정한 뒤에 통신에 사용 할 클라이언트의 소켓을 반환

  5. connect(int sockfd, struct socketaddr*myaddr, int addrlen);

    → IP주소와 포트 번호로 식별되는 대상으로 연결 요청

    → 연결 요청에 대한 결과가 결정되기 전에는 connect()의 실행이 끝나지않고 대기

  6. read(int sockfd, char* buf, size_t nbytes);

  7. write(int sockfd, char* buf, size_t nbytes);

  8. close(int soctfd);

    → 열린 소켓을 닫는다.

UDP Socket

UDP 프로토콜 구조

  • Source Port (16 bits) : 출발지(송신) 포트 번호

  • Destination Port (16 bits) : 목적지(수신) 포트 번호

  • Total Length (16 bits) : 헤더와 데이터부를 포함한 전체 길이

  • Checksum (16 bits) : 전체 데이터그램에 대한 오류를 검사하기 위한 필드

Multiplexing and Demultiplexing

Multiplexing

Application layer 에서 패킷이 소켓에 의해 Transport layer 로 전달 될 때, 여러 소켓의 패킷을 수집하여 하나의 세그먼트에 캡슐화하여 Network layer로 전달하는 과정

Demultiplexing

Transport layer 에서 세그먼트가 Application layer 로 전달 될 때, 올바른 소켓으로 전달 하는 과정

Demultiplexing의 동작

  • 데이터 그램(Network layer의 패킷)에는 source IP, destination IP 주소를 갖고 있음.

  • 데이터 그램은 하나의 세그먼트(Transport layer의 패킷)을 포함.

  • 세그먼트에는 위 이미지와 같이 source port#, destination port# 를 갖고 있음.

→ host는 IP address & port numbers 를 통해 세그먼트를 적절한 소켓에 전송.

비연결형 demultiplexing 으로 UDP 에서 발생한다.

  • 연결형 demultiplexing 으로 TCP 에서 발생한다.

3way handshake

[ 네트워크 쉽게 이해하기 22편 ] TCP 3 Way-Handshake & 4 Way-Handshakearrow-up-right

1 → 2 받음 / 2 → 1 받음 요청정보 / 1 → 2

Last updated