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


TCP server
- 웹서버가 TCP 소켓을 생성
- socket을 특정 포트에 bind
- 소켓을 listen 용도로 사용하겠다고 것을 설정
- Client로부터 요청을 받을 준비 완료
- Client로부터 connection이 들어올때까지 block
TCP client
- socket 열기
- 원하는 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

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

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