출처: https://3months.tistory.com/307 [Deep Play]

4-1/시스템프로그래밍

Network Programming

코딩하는 랄뚜기 2022. 4. 5. 20:03

A Client-Server Transaction

 

대부분의 network application은 client-server model을 기반으로 한다.

 

Client-server model이란?
  • 한 개의 server process와 한 개 또는 여러 개의 client process로 이루어져 있다.
  • Server는 resource를 관리한다.
  • Server는 resource를 이용하여 client에게 service를 제공한다.
  • Server는 client의 요청에 의해서 활성화된다.

 

※ Client와 server는 host에서 실행된다.(host는 같을 수도, 다를 수도 있다.

 


 

Computer Networks

 

network는 계층적 시스템으로 지리적 근접성에 기반하여 구분한다.

  • SAN (System Area Network) spans cluster or machine room
  • LAN (Local Area Network) spans a building or campus
  • WAN (Wide Area Network) spans country or world

 

internetwork(internet)은 network들의 모임이다. Global IP Internet이 internet의 대표적인 예시다.

 


 

Lowest Level : Ethernet Segment

 

 

Ethernet segment hub와 wire로 연결된 host들로 구성된다.

 

각각의 Ethernet adapter는 고유의 48-bit address (MAC address)를 가지고 있다.(Ex. 00:16:ea:e3:54:e6)

Host들은 frame이라는 chunk를 이용하여 다른 host에게 bit를 보낸다.

Hub는 각각의 port에서 모든 port로 bit를 복사시켜준다.

 


 

Next Level : Bridged Ethernet Segment

 

 

Bridge는 어떤 host와 어떤 port가 닿을 수 있는지 알고 있기 때문에 선택적으로 frame을 port에서 port로 복사할 수 있다.​

 


Next Level : internets

 

 

호환되지 않는 여러 개의 LANrouter를 통하여 물리적으로 연결될 수 있다.

연결된 network를 internet(소문자 i)라고 부른다.

 

 

internet은 정해진 topology가 없다.

Packet을 network를 통해 보낸다. Router는 network 사이에 다리가 되어 준다. 다른 packet은 다른 route를 이용할 수 있다.

 


 

Protocol

 

Protocol을 이용하면 호환되지 않는 LANs와 WANs를 통해 bit를 보낼 수 있다.

 

Protocol이란?
  • Protocol software은 host와 router에서 실행되고 있다.
  • Protocol은 network에서 network로 data를 옮길 때 어떻게 host와 router가 협동해야 하는지 알려주는 규칙의 모임이다.
  • 호환 불가능한 network끼리의 차이를 없애준다.
internet Protocol은 무엇을 할까?
  • Provides a naming scheme
    • An internet protocol defines a uniform format for host addresses
    • Each host(and router) is assigned at least one of these internet addresses that uniquely identifies it
  • Provides a delivery mechanism
    • An internet protocol defines a standard transfer unit(packet)
    • Packet consists of header and payload
      • Header : contains info such as packet size, source and destination addresses
      • Payload : contains data bits sent from source host

 

 


 

Global IP Internet (upper case)

Internet은 가장 유명한 internet의 예시이다.

 

Internet은 TCP/IP protocol을 기반으로 한다.

  • IP (Internet Protocol) : Provides basic naming scheme and unreliable delivery capability of packets (datagrams) from host-to-host
  • UDP (Unreliable Datagram Protocol) : Uses IP to provide unreliable datagram delivery from process-to-process
  • TCP (Transmission Control Protocol) : Uses IP to provide reliable byte streams from process-to-process over connections

 

Hardware and Software Organization of an Internet Application

 

 

프로그래머 관점에서의 Internet

  1. Host에는 32-bit IP address의 집합이 쓰인다.( ex. 128.2.203.179 )
  2. IP addresses의 집합은 Internet domain names에 쓰여진다. ( ex. 128.2.203.179는 www.cs.cmu.edu에 쓰임)
  3. connection을 통해 Internet host에 있는 process끼리 소통할 수 있다.

 


IP Addresses

 

32-bit IP address들은 IP address struct에 저장된다.

  • IP address는 항상 network byte order(big-endian byte order)로 저장된다.
/*Internet address structure*/
struct in_addr{
	uint32_t s_addr;/* network byte order (big-endian) */
};

 

16진법으로 쓰인 32-bit IP address는 10진법으로 표현할 때 dot을 사용한다. (Dotted decimal notation)

 

 

getaddrinfo getnameinfo 함수를 사용해서 IP address를 dotted decimal 형식으로 바꿀 수 있다.

 


 

Internet Domain Names

 

 

nslookup 함수를 사용해서 주소를 확인할 수 있고 hostname을 입력하면 실제 local host의 이름이 나오게 된다.

localhost는 항상 loopback address127.0.0.1을 가진다.

 

 

 

domin name과 IP address는 일대일 대응이다.

 

 

 

 

여러 개의 domain name이 같은 IP address를 가질 수 있다.

 

 

여러 개의 domain name이 여러 개의 IP address를 가질 수 있다.

 

 

유효한 domain name이라도 IP address는 없을 수도 있다.

 


 

Internet Connections

 

Socket은 connection의 endpoint이다.

Socket address는 IPaddress와 port number의 pair로 표현된다. IPaddress:port

 

Port란 16-bit integer로 process를 구분하는 데 사용된다.

  • Ephemeral port : client kernel이 connection request를 만들 때 자동적으로 assign 된다.
  • Well-known port : server가 제공해주는 service와 연관 있다.

 

Well known ports and service names

  • echo server : 7/echo
  • ssh server : 22/ssh
  • email server : 25/smtp
  • Web servers : 80/http

Linux에서 well-know port와 service name은 /etc/services에 저장되어 있다.

 


 

Anatomy of a Connection

 

Connection은 endpoint의 socket address에 의해 구분된다.

 

여기서 Client socket address의 51213은 kernel에 의해 할당된 ephemeral port이고

Server socket address의 80은 Web server에 의해 할당된 well-known port이다.

 

 


 

Sockets Interface

 

Socket이란 정확히 무엇일까?

우리는 file에 접근 할 때 file descriptor를 이용하여 접근하였다. 이를 Network개념으로 보면 user와 disk사이에 connection을 만들어 줬다고 볼 수 있겠다.

Socket은 client와 server이 connect 될 때 file descriptor로 이를 통해 서로 read와 write를 할 수 있다.

 

Client와 Server가 데이터를 주고받는 방식은 위와 같다.

 

 

  1. Server는 listenfd에 값이 들어오는지 계속 확인한다.
  2. Client의 request가 listenfd에 들어간다.
  3. Listenfd에 값이 들어오면 deque를 하고 connection이 생성된다. Clientfd와 connfd를 통해 read/write를 한다.

 

 

Client는 write을 먼저하고 read를 하면서 server를 기다린다.

Server는 read를 하면서 기다리다가 request가 오면 이에 대한 답을 write한다.

 

자세한 내용은 뒤에서 다루도록 하겠다.

 

 


getaddrinfo

 

getaddrinfo 함수는 hostanme, host address, port 그리고 service name과 같은 string type을 socket address struct로 바꿔준다.

장점은 threaded program에서도 안전하게 실행된다는 것과 IPv4, IPv6 모두 지원해준다는 것이다.

단점으로는 너무 복잡하다는 것... 하지만 그 쓰임이 고정적이어서 사용에 능숙해질 가능성이 높다.

 

getaddrinfo는 linked list를 return 한다.

linked list를 반환하는 이유는 여러 개의 IP address를 가질수 있기 때문이다.

 

Client는각각의 socket address에 connect가 생성될 때까지 request를 보내면  list를 돈다.

Server는 socket이 생성되고 bind가 될 때까지 list를 돈다.

 


 

Socket

 

Socket 함수는 사용가능한 socket descriptor를 만들어 준다.

3번째 인자에는 protocol이 들어가는데 getaddrinfo를 통해 socket address를 받아왔기 때문에 굳이 protocol을 넣어줄 필요가 없다.

 


 

Bind

 

Server가 bind라는 함수를 통해서 kernel에게 socket address와 socket descriptor를 연결 시켜달라고 요청한다.

 

Bind가 된다면 connection의 endpoint는 addr이 되고 sockfd를 통해 read,write를 할 수 있게 된다.

 

 


 

Listen

 

 

기본적으로 kernel은 socket 함수로부터 온 descriptor가 active socket(client와 연결 될 socket)이라고 가정한다.

따라서 listen 함수는 sockfd를 active socket에서 listening socket으로 바꿔준다.

 

backlog는 kernel이 만들어야 할 connection의 숫자이다.

 


 

Accept

 

Accept는 server에서 일어난다.

accept함수에서 server는 Client의 request가 올 때까지 listenfd 값을 확인하면서 기다린다.

connected descriptor를 리턴 값으로 보내준다.

 


 

Connect

 

Connect는 client에서 일어난다.

Client는 connect 함수를 통해 server와 connection이 생길 때까지 기다린다.

 

만약 connection이 발생하면 socket pair(x:y - x는 client address, y는 ephemeral port)를 return한다.

 

 

'4-1 > 시스템프로그래밍' 카테고리의 다른 글

Concurrent Programming  (0) 2022.04.15
Standard I/O, Unix I/O vs Standard I/O vs RIO  (0) 2022.04.04
Metadata, sharing and redirection  (0) 2022.04.04
Unix I/O, RIO package  (0) 2022.04.04
Signal  (0) 2022.03.28