728x90
CSAPP
11. 네트워크 프로그래밍
- 모든 네트워크 응용들은 동일한 기본적인 프로그래밍 모델에 기초하고 있으며 이들은 비슷한 전체 논리구조를 가지고 동일한 인터페이스를 사용한다.
11.1 클라이언트 - 서버 프로그래밍 모델
- 모든 네트워크 응용프로그램은 클라이언트 - 서버 모델에 기초하고 있다. 이 모델을 사용해서 응용은 한 개의 서버 프로세스와 한개 이상의 클라이언트 프로세스로 구성된다. 서버는 일부 리스소를 관리하고, 이 리소스를 조작해서 클라이언트를 위한 일부 서비스를 제공한다.
- 클라이언트 - 서버 모델에서 근복적인 연산은 트랜잭션이다. 클라이언트 - 서버 트랜잭션은 네 단계로 구성된다.
- 클라이언트가 서비스를 필요로 할 때, 클라이언트는 한 개의 요청을 서버에 보내는 것으로 트랜잭션을 개시한다.
- 서버는 요청을 받고, 해석하고, 자신의 자원들을 적절한 방법으로 조작한다.
- 서버는 응답을 클라이언트로 보내고, 그 후에 다음 요청을 기다린다.
- 클라이언트는 응답을 받고 이것을 처리한다.
- 클라이언트와 서버는 프로세스이며, 머신이나 호스트가 아니다. 한 개의 호스트는 서로 다른 많은 클라이언트와 서버를 동시에 실행할 수 있으며, 클라이언트와 서버 트랜잭션은 동일하거나 다른 호스트에 존재 할 수 있다.
11.2 네트워크
- 클라이언트와 서버는 종종 별도의 호스트에서 돌아가며, 컴퓨터 네트워크의 하드웨어 및 소프트웨어 자원을 사용해서 통신한다. 호스트에게 네트워크는 단지 또 다른 I/O 디바이스이며, 데이터를 위한 소스와 싱크로 서비스한다. I/O 버스의 확장 슬롯에 꽂혀있는 어댑터는 네트워크에 물리적인 인터페이스를 제공한다. 네트워크에서 수신한 데이터는 I/O와 메모리 버스를 거쳐서 어댑터에서 메모리로, 대개 DMA 전송으로 복사된다. 비슷하게 데이터는 또한 메모리에서 네트워크로 복사 될 수 있다.
- 물리적으로 네트워크는 기하적으로 구성된 계층구조 시스템이다. 하위수준은 LAN(Local Area Network)으로 빌딩이나 캠퍼스에 설치된다. 가장 대중적인 LAN 기술은 현재 이더넷(Ethernet)이다.
- 이더넷 세그먼트는 몇 개의 전선들과 허브라고 부르는 작은 상자로 구성된다. 각 전선은 동일한 최대 비트 대역폭을 가지며, 한쪽 긑은 호스트의 어댑터 한쪽은 허브의 포트에 연결된다. 허브는 각 포트에서 수신한 비트를 종속적으로 다른 모든 포트로 복사한다.
- 각 이더넷 어댑터는 어댑터의 비휘발성 메모리에 저장된 전체적으로 고유한 48비트주소를 가진다. 호스트는 프레임이라고 부르는 비트들을 세그먼트의 다른 호스트에 보낼수 있다. 각 프레임은 프레임의 소스와 목적지, 프레임의 길이를 식별할 수 있는 고정된 헤더 비트를 가지고 있으며, 그 뒤에 데이터비트가 이어진다. 모든 호스트 어댑터는 이 프레임을 볼 수 있지만 목적지 호스트 만이 실제로 이것을 읽어들인다.
- 전선들과 브릿지라고 하는 작은 상자들을 사용해서 다수의 이더넷 세그먼트가 연결되어 브릿지형 이더넷이라고 하는 더 큰 LAN을 구성할 수 있다. 브릿지형 이더넷에서 일부 선은 브릿지를 비릿지로 연결하고, 다른 선들은 브릿지를 허브로 연결한다. 각 선의 대역폭은 다를수 있다.
- 브릿지는 허브보다 더 높은 전선의 대역폭을 가진다. 우수한 분산 알고리즘을 사용해서 이들은 자동으로 어떤 호스트가 어떤 포트에서 도달 가능한지 장기간에 걸쳐 학습하고, 그 후 필요한 경우 선택적으로 하나의 포트에서 다른 포트로 프레임을 복사한다.
- 계층구조의 상부에서 다수의 비호환성 LAN들은 라우터라고 부르는 특별한 컴퓨터에 의해서 연결될 수 있으며, 라우터는 네트워크간 연결을 구성한다.(상호연결 네트워크) 각 라우터는 이들이 연결되는 각 네트워크에 대해 어댑터(포트)를 가지고 있다. 라우터는 고속의 point-to-point 전화연결을 할 수 있으며, 이들은 WAN이라고 하는 네트워크의 사례이다. 일반적으로 라우터는 임의의 LAN과 WAN들로부터 internet을 만들기 위해서 사용될 수 있다.
- internet의 중요한 특성은 이것이 매우 다르고 비호환적인 기술을 갖는 여러가지 LAN과 WAN들로 이루어져 있다는점이다. 비호환적인 네트워크들을 지나 데이터 비트를 다른 목적지 호스트로 전송할 수 있는 이유는 여러가지 네트워크간의 차이를 줄여주는 각 호스트와 라우터에서 돌고 있는 프로토콜 소프트웨어 계층 때문이다. 이 프로토콜은 두 가지 기본 기능을 제공해야 한다.
- 명명법(Naming Scheme) : 서로 다른 LAN 기술은 주소를 호스트에 할당하는 서로 다른 비호환성을 갖는 방법을 사용한다. internet 프로토콜은 호스트 주소를 위한 통일된 포맷을 정의해서 이 차이점을 줄인다. 각 호스트는 자신을 유일하게 식별하는 internet 주소 최소한 한 개가 할당된다.
- 전달기법(Delivery mechanism) : 서로 다른 네트워킹 기술은 서로 다른 비호환성을 갖는 비트 인코딩 방법과 프레임 내에 이들을 패키징하는 방법을 가지고 있다. internet 프로토콜은 데이터 비트를 패킷이라고 부르는 비연속적인 단위로 묶는 통일된 방법을 정의해서 이 차이점을 줄인다. 패킷은 패킷 크기와 소스 및 목적지 호스트 주소를 포함하는 헤더와 데이터 비트를 포함하는 데이터로 구성된다.
11.3 글로벌 IP Internet
- 각 인터넷 호스트는 TCP/IP 프로토콜(transmission control protocol/internet protocol)을 구현하는 소프트웨어를 실행한다. 인터넷 클라이언트와 서버는 소켓 인터페이스와 Unix I/O 함수들의 혼합을 사용해서 통신한다. 소켓 함수들은 일반적으로 시스템 콜들로 구현되는데, 이 시스템 콜은 커널에서 트랩을 발생시키며, TCP/IP에서 다양한 커널모드 함수들을 호출한다.
- TCP/IP는 실제로 프로토콜의 집합으로 각각 서로 다른 기능을 제공한다.
- IP는 기본 명명법과 데이터그램이라고 하는 패킷을 한 인터넷 호스트에서 다른 호스트로 보낼 수 있는 배달 메커니즘을 제공한다. IP 메커니즘은 만일 데이터그램을 잃어버리거나 네트워크내에서 중복되는 경우에 복구하려고 노력하지 않는다는 점에서 안정적이지 못하다.
- TCP는 IP위에 구현한 복잡한 프로토콜로 프로세스들 간에 완전한 양방향 연결을 제공한다.
- 인터넷은 다음의 특징을 가지는 전 세계적인 호스트의 집합이다.
- 호스트의 집합은 32비트 IP주소 집합에 매핑된다.
- IP주소의 집합은 인터넷 도메인 네임이라고 부르는 식별자의 집합에 매핑된다.
- 하나의 인터넷 호스트의 프로세스는 연결을 통해서 다른 인터넷 호스트의 프로세스와 통신할 수 있다.
11.3.1 IP주소
- IP주소는 비부호형 32비트 정수이다. 네트워크 프로그램은 IP주소를 IP주소 구조체에 저장한다.
- 인터넷 호스트들이 서로 다른 호스트 바이트 순서를 가질 수 있기 때문에 TCP/IP는 네트워크 패킷 헤더에 포함되는 IP주소같은 모든 정수형 데이터 아이템에 대해서 통일된 네트워크 바이트 순서(빅 엔디안 바이트 순서)를 정의한다. IP주소 구조체의 주소는 호스트 바이트 순서가 리틀 엔디안인 경우에도 항상 네트워크 바이트 순서(빅엔디안)로 저장된다.
- IP주소는 대개 사람들에게 dotted-decimal 표기라고 하는 형식으로 제시되며, 이것은 각 바이트가 10진수 값을 사용하고, 다른 바이트들과는 점을 사용해서 구분된다.
- 128.2.194.242 는 0x8002c2f2의 dotted-decimal 표현이다.
11.3.2 인터넷 도메인 이름
- 인터넷 클라이언트와 서버는 서로 통신할 때 IP주소를 사용한다. 그렇지만 크기가 큰 정수는 사람들이 기억하기 어려워서 인터넷에서는 도메인 이름들의 집합을 IP주소의 집합으로 매핑하는 메커니즘과 함께 사람들에게 친숙한 별도의 도메인 이름 집합을 정의한다.
- 도메인 이름들의 집합은 계층구조를 형성하고 있으며, 각각의 도메인 이름은 계층구조에서 자신의 위치를 인코드한다. 계층구조는 트리로 나타낸다. 트리의 노드들은 루트로 돌아가는 경로로 형성되는 도메인 이름을 나타낸다. 서브트리는 서브 도메인이라고 한다. 계층구조의 첫 번째 단계는 이름이 없는 루트 노드이다. 다음계층은 ICANN(Internet Coporation for Assigned Names and Numbers)이라고 하는 비영리조직이 정의한 일 단계 도메인 이름의 집합이다.
- ex) com, edu, gov, org ,net
- 다음 계층에는 2단계 도메인 이름이 포함되며 이들은 수많은 ICANN이 인정하는 대행사가 요청한 순서에 의해 그 이름이 할당된다. 일단 한 조직이 2단계 이름을 받은 후에는 서브 도메인 내에서는 어떤 새로운 이름도 자유롭게 생성할 수 있다.
- 인터넷의 도메인 이름의 집합과 IP주소 집합 사이에 매핑을 정의한다. 매핑은 DNS(Domain Name System)라고 하는 전세계에 분산된 데이터 베이스에 의해 관리된다. 개념적으로 DNS 데이터 베이스는 수 백만 개의 호스트 엔트리로 구성되어 있으며, 이들 각각은 도메인 이름 집합과 IP주소들의 동일성(equivalence) 클래스로 생각할 수 있다.
- 각 인터넷 호스트는 지역적으로 정의된 도메인 이름 localhost를 가지고 있으며, 이것은 항상 루프백주소 127.0.0.1에 매핑된다.
- localhost 이름은 같은 머신에서 돌고있는 클라이언트와 서버들을 참조하는 편리하고 포터블한 방법을 제공하며, 이것은 특히 디버깅시에 유용하다.
- 가장 간단한 경우, 도메인 이름과 IP주소 사이에는 일대일 매핑이 존재한다. 그러나 일부 경우에, 다수의 도메인 이름이 동일한 IP주소에 매핑된다. 대부분의 일반적인 경우에, 다수의 도메인 이름들은 다수의 IP주소로 매핑될 수 있다. 일부 유효한 도메인 이름들은 어떤 IP주소에도 매핑되어 있지 않다는 것을 발견했다.
11.3.3 인터넷 연결
- 인터넷 클라이언트와 서버는 연결을 통해서 바이트 스크림을 주고 받는 형식으로 통신한다. 이 연결은 두 개의 프로세스를 연결한다는 점에서 point-to-point 연결이다. 데이터가 동시에 양방향으로 흐를 수 있다는 의미에서 이것은 완전양방향(full-duplex)이다. 그리고 소스 프로세스가 보낸 바이트 스크림이 결국의 보낸것과 동일한 순서로 목적지 프로세스에서 수신된다는 의미에서 안정적이다.
- 소켓(Socket)은 연결의 종단점이다. 각 소켓은 인터넷주소와 16비트 정수 포트로 이루어진 소켓 주소를 가지며, 이것은 address : port 로 나타낸다. 클라이언트 소켓 주소 내의 포트는 클라이언트가 연결 요청을 할 때 커널이 자동으로 할당하며, 이것은 단기(ephemeral) 포트라고 한다. 그러나 서버의 소켓 주소에 있는 포트는 대개 영구적으로 이 서비스에 연결되는 잘 알려진 포트다. 잘 알려진 포트를 갖는 각 서비스에 연관되어 이에 대응되는 잘 알려진 서비스 이름들이 존재한다. 잘 알려진 이름과 포트들 간의 매핑은 /etc/services 파일에 보관되어 있다.
- 연결은 두 개의 종단점의 소켓주소에 의해 유일하게 식별된다. 이 두 개의 소켓 주소는 소켓 쌍이라고 알려져 있으며 tuple로 나타낸다.
- (cliaddr : cliport , servaddr : servport) - 클라이언트 주소 : 클라이언트 포트 , 서버 주소 : 서버 포트
11.4 소켓 인터페이스
- 소켓 인터페이스는 네트워크 응용을 만들기 위한 Unix I/O 함수들과 함께 사용되는 함수들의 집합이다.
11.4.1 소켓 주소구조체
- 리눅스 커널의 관점에서 보면, 소켓은 통신을 위한 끝점이다. Unix프로그램의 관점에서 보면 소켓은 해당 식별자를 가지는 열린파일이다.
11.5 웹 서버
11.5.1 웹 기초
- 웹 클라이언트와 서버는 HTTP(Hypertext Transfer Protocol) 라고 하는 텍스트 기반 응용수준 프로토콜을 사용해서 상호연동한다. 웹 클라이언트(브라우저)는 서버로의 인터넷 연결을 오픈하고 컨텐츠를 요청한다. 서버는 요청한 컨텐츠로 응답하고, 그 후에 연결을 닫아준다. 브라우저는 컨텐츠를 읽고 이것은 스크린에 보여준다.
11.5.2 웹 컨텐츠
- 웹 클라이언트와 서버에게, 컨텐츠는 연관된 MINE(Multipurpose Internet Mail Extensions) 타입을 갖는 배열이다.
- 웹 서버는 두 가지 서로 다른 방법으로 클라이언트에게 컨텐츠를 제공한다.
- 디스크 파일을 가져와서 그 내용을 클라이언트에게 보낸다. 디스크 파일은 정적 컨텐츠라고 하며, 파일을 클라이언트에게 돌려주는 작업은 정적컨텐츠를 처리한다고 말한다.
- 실행 파일을 돌리고 그 출력을 클라이언트에게 보낸다. 실행 파일이 런타임에 만든 출력을 동적 컨텐츠라고 하며, 프로그램을 실행하고 그 결과를 클라이언트에게 보내주는 과정을 동적 컨텐츠를 처리한다고 말한다.
- 웹 서버가 리턴하는 모든 내용들은 서버가 관리하는 파일에 연관된다. 이 파일 각각은 URL(universal presource Locator)라고 하는 고유의 이름을 가진다.
- 어떻게 서버가 URL 접미어를 해석하는지에 대해서 이해해야 할 몇 가지 사실들.
- URL이 정적 또는 동적 컨텐츠를 참조하는지를 결정하기 위한 표준 규칙은 없다. 각각의 서버는 자신이 관리하는 파일들을 위한 자신만의 규칙들을 가진다.
- 접미어 앞 부분의 ‘/’ 는 리눅스의 루트 디렉토리를 나타내는것은 아니다. 오히려 이것은 어떤 종류의 컨텐츠가 요청되든 간에 홈 디렉토리를 나타낸다.
- 최소한의 URL은 ‘/’ 문자이면, 모든 서버는 이것을 /index.html 같은 특정 기본 홈페이지로 확장한다.
11.5.3 HTTP 트랜잭션
- HTTP가 인터넷 연결 위로 전송된 텍스트 라인들을 기초하고 있기 때문에 리눅스 TELNET 프로그램은 사용해서 인터넷 상의 모든 웹 서버와 트랜잭션을 실행할 수 있다.
- TELNET 프로그램은 연결을 통해서 텍스트 라인으로 클라이언트와 대화하는 서버를 디버그 하는데 매우 간편하다.
HTTP 요청
- HTTP는 많은 서로 다른 메소드를 지원하며 여기에는 GET, POST, OPTIONS … 등 포함되어있다. 이중 GET은 전체 HTTP 요청의 대부분에 해당한다. GET 메소드는 서버에게 URI(uniform resource identifer)에 의해 식별되는 내용을 리턴 할 것을 지시한다. URI는 파일 이름과 옵션인 인자들은 포함하는 URL의 접미어다.
- Host 헤더는 프록시 캐시에 의해 사용되며, 이거은 때로는 브라우저와 요청된 파일을 관리하는 본래의 서버 사이의 중간자 역할을 한다. 하나의 클라이언트와 하나의 본래 서버 사이에는 소위 프록시 제안 내에서 다중 프록시가 존재 할 수 있다. 원점 서버의 도메인 이름을 식별하는 Host 헤더 내의 데이터는 프록시 체인의 중간에 있는 프록시가 요청한 컨텐츠의 지역적으로 캐시된 사본을 가질 수 있는지 결정할 수 있게 한다.
728x90
'책 > CSAPP' 카테고리의 다른 글
CSAPP 12.4 - 12.5 (0) | 2024.02.20 |
---|---|
CSAPP 12-12.3 (0) | 2024.02.19 |
CSAPP 9 (0) | 2024.02.13 |
CSAPP 8 (3) | 2024.02.12 |
CSAPP 6.1.2 - 6 (2) | 2024.02.11 |