애플리케이션계층 1

ㄱㅇㅁ·2023년 10월 7일

네트워크

목록 보기
3/20

Socket

Socket 이란?

  • 다른 컴퓨터의 process에 정보를 보내고 싶으면 interface에 메세지를 적어주어야함
    • os가 제공하는 API 일종
  • process 간의 통신을 위한 API
  • application layer와 os 간의 interface
    • transport layer가 제공하는 걸 사용할 수 밖에 없음
      -> TCP, UDP Socket 둘 중 하나를 골라야함

Socket의 2가지 타입

SOCK_STREAM

  • TCP socket

SOCK_DGRAM

  • UDP socket

Socket Functions (TCP)

TCP server

  1. 웹서버가 TCP 소켓을 생성
  2. socket을 특정 포트에 bind
  3. 소켓을 listen 용도로 사용하겠다고 것을 설정
  4. Client로부터 요청을 받을 준비 완료
  5. Client로부터 connection이 들어올때까지 block

TCP client

  1. socket 열기
  2. 원하는 server process에 바로 connect
  • TCP 소켓 사이 단단한 연결 고리가 형성
  • 이후로는 소켓 read, write 연속
  • 할 말이 끝나면 close

Socket Function

Server

1. socket

int socket (int domain, int type, int protocol);
  • 소켓을 만드는 function
  • type 파라미터 socket 종류 결정
    - UDP,TCP 소켓인지
  • return 값 = 방금 생성한 socket id 값 (domain)

2. bind

int bind ( int sockfd, struct sockaddr* myaddr, int addrlen);
  • socket id를 이용해서 특정 port에 socket을 bind

3. listen

int listen (int sockfd, int backlog);
  • listen 용도로 사용할 것이며 동시에 request 들어오면 최대 backlog개 만큼 저장하고 순서대로 처리
  • 서버 소켓을 대기 상태로 설정하고 연결 요청을 대기 큐에서 관리

4. accept

int accept (int sockfd, struct sockaddr* cliaddr, int* addrlen);
  • 준비가 끝났으니 client의 연결을 기다림 -> 대기 큐에서 연결 요청을 수락
  • 2번째 파라미터(cliaddr)에 client의 ip, port 번호 저장

Client

Connect

int connect (int sockfd, struct sockaddr* servaddr, int addrlen);
  • socket을 원하는 서버와 connect
  • 파라미터로 서버의 주소와 포트 번호

    Q . client는 bind 함수 사용하지 않는 이유?

    client는 특정한 포트를 사용할 필요가 없기 때문

Read & Write & Close

Write

int write (int sockfd, char* buf, size_tnbytes);
  • 쓰고자하는 메세지 작성

Read

int read (int sockfd, char* buf, size_tnbytes);
  • 메세지 읽음

Close

int close (int sockfd);
  • 데이터 교환이 끝난 후 소켓을 release
  • 그래야 다른 process가 사용할 수 있음

Sample Code

Server

  • TCP socket 생성

Client

  • TCP socket 생성

UDP

  • TCP 보다 훨씬 간단

Multiplexing/demultiplexing

Multiplexing

  • 내려오는 message를 segment로 바꿔서 하위계층으로 내려보내줌
  • sender

Demultiplexing

  • segment를 받아서 메세지를 뽑아낸 후 메세지를 받아야하는 알맞은 process에게 올려줌
  • 어떤 socket으로 올려보낼까
  • receiver

Demultiplexing 방법

  • setment = data + header
  • header 내 필드
    - source port, destination port를 이용해 demultiplexing 함

Connectionless demux

  • UDP connection
  • UDP의 사용하면 destination IP와 destination port만을 사용해서 어떤 socket으로 올릴지 demultiplexing 하게 된다
  • connection의 개념이 아님
    - destination port만 같으면 socket 아무나 다 보낼 수 있기 때문

Connection-oriented demux

  • TCP connection
  • source IP, source port, destination IP, destination port 모두 고려해서 1개라도 다르면 다른 socket으로 올라감
  • 사용자만을 위한 socket이 있으므로 특정 유저만 보낼 수 있음
  • web server의 예

UDP

  • UDP, TCP, IP의 header 중요

UDP segment의 header

  • field가 4개
  • 1 field가 16bit
    - port number는 0~6만x개
  • port number로 multiplexing/demultiplexing에 사용
  • checksum으로 전송도중 에러 생겼는지 확인
    - 에러 생겼으면 올리지 않고 drop

    UDP가 해주는 것 2가지

    1. multiplexing / demultiplexing
    2. error checking

0개의 댓글