클라이언트- 서버 프로그래밍 모델
모든 네트워크 응용 프로그램은 클라이언트-서버 모델에 기초하고 있다.
application은 한 개의 서버 프로세스와 한 개 이상의 클라이언트 프로세스로 구성된다.
일부 리소스를 관리하고 ,이 리소스를 조작해서 클라이언트를 위한 일부 서비스를 제공한다.
ex) FTP 서버는 클라이언트를 위해 저장하고 읽어오는 디스크 파일들을 관리한다.
보통 4개의 과정으로 나눠지는데
1. 클라이언트가 서비스 요청한다.
2. 서버는 요청을 받고 해석하고 자신의 자원들을 적잘한 방법으로 조작한다.
3. 서버는 응답을 클라이언트에 보내고, 그 후에 다음 요청을 기다린다.
4. 클라이언트는 응답을 받고 이것을 처리한다.
네트워크
클라이언트와 서버는 종종 별도의 호스트에서 돌아가고, 네트워크의 하드웨어 및 소프으웨어 자원을 사용해서 통신한다.
네트워크는 복잡한 시스템이며, 여기서 기초적인 내용을 이해하는 것을 기대한다.
우리의 목표는 프로그래머의 관점에서 쓸 수 있는 개념모델을 제공하는 것이다.
호스트에게 네트워크는 단지 또 다른 I/O 디바이스고, 데이터를 위한 소스와 싱크로 서비스한다.
I/O 버스의 확장 슬롯에 꽂혀 있는 어댑터는 네트워크에 물리적인 인터페이스를 제공한다.
네트워크에서 수신한 데이터는 I/O와 메모리 버스를 거쳐서 어댑터에서 대개 DMA 전송으로 복사된다.
이렇게 하나하나 말로 보면 어지러운 부분이어서 대체적으로 그림으로 보면 아래와 같다.
위 그림이 진짜 네트워크를 공부하면 꼭 보게 되는 흐름인데
정말 중요한것 같다.
흐름은 대충 다음과 같다.
1. 호스트 A의 클라이언트는 클라이언트의 가상 주소공간에서 커널 버퍼로 데이터를 복사하는 시스템 콜을 호출한다.
2. 호스트 A의 프로토콜 소프트웨어는 internet 헤더와 LAN1 프레임 헤더를 데이터에 추가해서 LAN1 프레임을 생성한다.
internet 헤더는 internet 호스트 B로 주소가 지정되고 LAN1 프레임헤더는 라우터로 주소가 지정된다. 호스트 A는 이 프레임을 어댑터로 전달한다. LAN1 프레임의 데이터가 internet 패킷이고, 그 데이터는 실제 사용자 데이터이다.
3. LAN1 어댑터는 이 프레임을 네트워크로 복사한다.
4. 프레임이 라우터에 도달하면, 라우터의 LAN1 어댑터는 전선에서 이것을 읽어서 프로토콜 소프트웨어로 전달한다.
5. 라우터는 internet 패킷 헤더에서 목적지 internet 주소를 가져와서 패킷을 전달할 곳을 결정하기 위해 이 경우에는 LAN2 라우팅 테이블에서의 인덱스로 이것을 사용한다. 라우터는 이전의 LAN1 프레임 헤더를 벗겨내고, 호스트 B의 주소를 갖는 새로운 LAN2 프레임 헤더를 앞에 붙여서 이것을 어댑터로 전달한다.
6. 라우터의 LAN2 어댑터는 이 프레임을 네트워크로 복사한다.
7. 프레임이 호스트 B에 도착하면 어댑터는 이 프레임을 전선에서 읽어들이고, 이것을 프로토콜 소프트웨어로 넘긴다.
8. 마지막으로 호스트 B의 프로토콜 소프트웨어는 패킷 헤더와 프레임 헤더를 벗겨낸다. 프로토콜 소프트웨어는 최종적으로 이 데이터를 서버가 이 데이터를 읽는 시스템 콜을 호출할 때 서버의 가상 주소공간으로 복사한다.
글로벌 IP 인터넷
각 인터넷 호스트는 TCP/IP 프로콜을 구현한 소프트웨어를 실행하고, 거의 모든 컴퓨터에서 지원한다.
인터넷 클라이언트와 서버는 소켓 인터페이스와 Unix I/O 함수들의 혼합을 사용해서 통신한다.
소켓함수들은 일반적으로 시스템콜 들로 구현되는데, 커널에서 트랩을 발생시키며, TCP/IP에서 다양한 커널 모드 함수들을 호출한다.
TCP/IP는 실제로는 프로콜의 집합으로 각각은 서로 다른 기능을 제공한다.
UDP는 IP는 다소확장해서 데이터그램이 호스트에서 호스트로 가는 대신, 프로세스에서 프로세스로 전송될 수 있다.
TCP/IP는 복잡한 프로토콜로 프로세스들 간에 안전한 완전 양방향 연결을 제공한다.
인터넷 도메인 이름(Internet Domain Name)
서버는 통신할 때 IP 주소를 사용한다.
하지만 기억하기 어려우니 별도의 도메인 이름을 정의한다.
도메인 이름은 계층구조를 형성하고 있고, 각각의 도메인 이름은 계층구조에서 자신의 위치를 인코딩한다.
다음 그림은 도메인이름의 계층 구조이다.
인터넷은 도메인 이름의 집합과 IP 집합 사이에 매핑을 정의한다.
이후 DNS라고 하는 전 세계에 분산된 데이터베이스에 의해 관리되어 왔다.
개념적으로 보면 DNS 데이터베이스는 수백만 개의 호스트 엔트리로 구성되어 있고, 각각 도메인 이름과 집합 IP 주소 집합사이의 매핑을 정의한다.
인터넷 연결
클라이언트와 서버는 연결을 통해서 바이트 스트림을 주고 받는 방식이다.
이 연결은 두개의 프로세스를 연결한다는 점에서 point-to-point 연결이다.
데이터가 동시에 양방향으로 흐를수 있다는 의미에서 완전 양방향이다.
소켓은 연결의 종단점이다. 각 소켓은 인터넷 주소와 16비트 정수 포트로 이루어진 소켓 주소를 가지며,
이것은 address: port로 나타낸다.
대개 웹서비스에서 잘알려진 http는 80번 port 같은것들이다. ㅎ
연결은 두 개의 종단점의 소켓 주소에 의해 유일하게 식별된다.
'정글' 카테고리의 다른 글
Pintos(1일차 후기) 쓰레드 (0) | 2023.05.28 |
---|---|
WIL(7주차) Proxy 구현 (0) | 2023.05.25 |
(TIL26일차) 동시성 프로그래밍 (1) | 2023.05.20 |
WIL(6주차) Malloc-lab 구현 (1) | 2023.05.20 |
(TIL 25일차) 가상 메모리1 (0) | 2023.05.18 |