Socket Programing

  • Two essential types of sockets
    소켓은 2종류가 있다.
    1번째로는 TCP, 2번째로는 UDT 각각 소켓의 특징은 다음과 같다.
  1. SOCK_STREAM
    • a.k.a TCP
    • reliable delivery (메시지의 유실이 없음)
    • in-order guaranted (메시지의 순서를 보장)
    • connetion - oriented (서로간의 연결필수)
  2. SOCK_DGRAM
    • a.k.a UDT
    • unreliable delivery (메시지의 유실 가능성)
    • no order guaranted (메시지의 순서를 보장하지않음)
    • no connetion - oriented (연결 불필요)
  • Socket API
    • Creation and Setup
    • Establishing a Connetcion(TCP)
    • Sending and receiving data
    • Tearing down a connection(TCP)
int socket(int domain, int type, int protocol);
// int type -> 어떤 type의 소켓인지 
// TCP -> SOCK_STREAM
// UDP -> SOCK_DGRAM

int bind(int socket, struct sockaddr* myaddr, int addrlen);
// 특정 PORT에 Bind

int listen(int sockid, int backlog);
// 최대 몇개까지 처리 가능할지

int accept(int sockid, struct sockaddr*cliaddr, int *addrlen);
// Client로부터 요청이 오기까지 대기

# Server -> TCP소켓 생성 -> 특정 PORT BIND -> Client 요청 대기

# Client -> TCP소켓 생성 -> Server Connetion

Chapter 3. Transport

네트워크 계층 서로간의 통신 네트워크 계층
APP -> APP
**Transfort** **->** **Transfort**
Network -> Network
Link -> Link
Physical -> Physical

Transport계층에는 TCP/UDP가 존재한다.
서로간의 reliable한 data(RDT)통신을 하기 위해서는 2가지 과정 필요

  1. 각각의 소켓에 맞게 보내주는 멀티프로세싱
  2. packet의 문제가 있는지 에러체킹

Transport 계층에서는 메시지를 보낼 때 2가지 상황이 연출된다.

  • 첫번째로는 에러도 없고 유실도 없는경우(비현실)
    • 에러와 유실이 없으면 그냥 보내주면 된다.
  • 두번째로는 Packet error가 발생할 수 있는경우
    • Checksum을 이용하여 에러를 체크해준다(보내는 측)
    • 받았을 때 에러여부를 확인 -> 특정 피드백(받는 측)

두번째와 같은경우가 일반적인 경우이다 그렇다면 에러가 있는지 없는지 Server 와 Clinet간의 확인이 필요하다.

Can this completyly solve errors?

(에러를 확인하는 방법) 메시지를 보내측에서 메시지를 보내면 받는측에서 메시지를 잘 받았는지에 대해 피드백을 해준다.

  • ACK -> 에러없음
  • NAK -> 에러존재 (NAK를 없앤 Protocol 가능)

ex)

보내는 측 서로간의 통신 받는 측
PKT(0) ->  
  <- ACK(error)
PKT(0) ->  
  <- ACK(0)
     

Errors And Loss

# 메시지가 유실된경우 -> 전화통화에서 잘 안들리는 경우

-> Timer 이용 -> 유실 될 경우 응답시간 대기
우리가 전화통화 중 잘 안들렸을 경우 약간의 시간동안 기다린 후 뭐라고 했는지 물어보는거와 비슷하다

Timeout (Packet error, Packet loss)

#Packet의 에러또는 유실된 경우 2가지 방법 존재
  • Go-Back-N
  • Selective repeat

1. Go-Back-N(Sender)

#ACK11 : 11번까지 잘 받았고 12번 대기
#주의:TCP에서의 ACK11은 10번까지 잘 받았고 11번 대기
#window : 얼마만큼 많이 보낼것인지

ex) window size = 4 -> 한번에 최대 4개 보냄

0 1 2 3 4 5 6 7 8 9
|_____| <- Window Size

각각의 Pkt에는 Timer가 존재하며 만약 0번 Pkt에서 Timer가 터지면 window size내에서 0번 Pkt 다음의 Pkt를 모두를 다시 보내준다.
그래서 유실된 경우 다시 Window Size만큼 돌아와서 재전송을 해줘야 하기 때문에 이름이 Go-Back N 이다

Go-Back-N(Receiver)

  • go-Back-N receiver에서는 buffer가 없기 때문에 기다리고 있는 Pkt가 아닌 다른 Pkt이 오면 다 버린다.
  • Pkt이 유실이 되면 Window size만큼 돌아와서 다시 보내줘야 함
    -> N이 커질수록 Pkt유실이 된다면 효율성은 떨어진다.

ex) | 보내는 측| 서로간의 통신| 받는 측 | | :—:|:—:| :—:| | PKT(0) | -> | | | | <-|ACK(0)|
| PKT(2) |-> | | | |<-| 1을 기다리고 있으므로 2는버림 ACK(0) | PKT(1) |->| | | |<-| ACK(1) | | || |

2. Selective repeat(Receiver의 기능 추가)

  • Pkt이 유실이 된 경우 유실된 Pkt만 다시 보내준다.
    -> 순서가 맞지 않더라도 Error가 없다면 buffer에 저장

요약:

Transport 계층에서 서로간의 Pkt을 주고 받을 때는 에러또는 유실이 없는지 체크하는 과정(Checksum)이 필요하며 유실이 된 경우 Pkt을 재전송을 해줘야하는데 이 때 2가지 방법(Go-Back-N , Selective repeat)이 존재한다.
Go-Back-N은 순서가 다른 Pkt은 전부 버리고 유실된 Pkt부터 Window size만큼 재전송을 해주는 것이고
Selective repeat 은 buffer를 이용하여 미리 들어온 pkt을 처리하고 유실된 pkt만 재전송해주는 방법이다.

TCP

이제 TCP에 대해 자세히 알아보면 다음과 같은 특징이 있다.

  • Point To Point (소켓 1개 -> 소켓 1개)
    -> One Sender , One Receiver
  • Reliable , In order
    -> 메시지 유실 X, 순서보장
  • Pipelined
    -> 한번에 많은 양을 쏟아 붓는다.
  • 각각이 Sender 이면서 Receiver
Sender/Receiver Receiver/Sender  
Sender Window Receiver Buffer  
Receiver Buffer Sender Window  
     
  • Flow Control
    -> Receiver의 Window Size만큼 보내줌
  • Congestion Control
    ->Network 상황에 맞게 보내줌