모든 네트워크 응용 프로그램은 클라이언트-서버 모델에 기반한다. 클라이언트-서버 모델은 한 개의 Server
프로세스와 한 개 이상의 Client
프로세스로 구성된다. 서버는 리소스들을 관리하고, 이러한 리소스들을 조작하여 클라이언트를 위한 서비스를 제공한다.
클라이언트-서버 모델의 근본적인 동작은 트랜잭션(transaction)이다. 이는 네 단계로 구성된다.
클라이언트가 서비스를 필요로 할 때, 한 개의 요청(request)를 보내는 것으로 트랜잭션을 개시한다.
서버는 요청을 받고, 해석하고, 자신의 리소스를 적절한 방법으로 조사한다.
서버는 응답(response)을 클라이언트로 보내고, 그 후에 다음 요청을 기다린다.
클라이언트는 응답을 받고 이것을 처리한다.
호스트에게 네트워크는 그저 또 다른 입출력 디바이스로 볼 수 있다. 네트워크에서 수신한 데이터는 네트워크 어댑터에서 I/O와 메모리 버스를 거쳐, 메모리로 복사된다. 대개 이는 DMA전송으로 복사된다.
DMA(Directed Memory Access): 컴퓨터 시스템에서 데이터를 주변 장치와 직접 주고받을 수 있게 해주는 기술로, 일반적인 데이터 전송과는 달리 CPU가 개입하지 않는다. 속도가 빠르고 시스템 자원을 효율적으로 사용하기에 대규모 데이터 전송에 유용하게 사용된다.
물리적으로 네트워크는 기하학적으로 구성된 계층구조 시스템이다. 가장 낮은 레벨은 LAN: Local Area Network
으로 빌딩이나 캠퍼스 같은 곳에 설치된다.
이더넷 세그먼트는 몇 개의 전선들과 허브라고 부르는 작은 상자로 구성된 작은 LAN이다. 각 전선은 동일한 최대 비트 대역폭을 가지며, 대개 100Mb/s 나 1Gb/s이다. 이는 방이나 빌딩의 한 층과 같은 작은 지역에 알맞다.
각 이더넷 어댑터는 고유한 48비트 주소를 가지며, 각 호스트는 프레임이라고 부르는 비트들을 다른 호스트로 보낼 수 있다. 각 프레임은 소스의 목적지, 프레임의 길이를 식별할 수 있는 고정된 헤드 비트로 이루어져 있으며, 모든 호스트들은 이 프레임을 볼 수 있지만 오직 목적지에 해당하는 호스트만이 실제로 이것을 읽어들인다.
위의 그림처럼 브릿지라고 작은 상자들을 이용해서 다수의 이더넷 세그먼트가 연결된, 브릿지형 이더넷이라고 하는 더 큰 LAN을 구성할 수 있다. 브릿지형 이더넷에서 일부 선은 브릿지끼리 연결하고, 다른 선들은 브릿지를 허브와 연결해준다. 이는 빌딩이나 캠퍼스 단위에 알맞다.
계층구조의 상부에서 위와 같은 LAN들은 라우터(Router
)라고 부르는 특별한 컴퓨터에 의해 연결될 수 있으며, 이러한 라우터는 지리적으로 넓은 영역에 걸친 네트워크인 WAN: Wide Area Network
를 구성할 수 있게 해준다. 흔히 말하는 인터넷은 이러한 WAN의 형태 중 하나로 볼 수 있다.
인터넷에서 중요한 포인트는 인터넷을 구성하는 LAN
, WAN
들이 각각 다르고 비호환적인 기술을 가질 수 있다는 것이다. 그렇다면 각 호스트는 어떻게 비호환적인 네트워크들을 지나서 데이터 비트를 다른 목적지 호스트로 전달할 수 있을까?
이에 대한 해답은 프로토콜 소프트웨어 의 계층이다. 이 소프트웨어는 어떻게 호스트들과 라우터들이 서로 협력해야 할 지를 결정하는 프로토콜을 구현한 것으로, 이러한 프로토콜은 두 가지 기능을 제공해야 한다.
명명법(Naming Scheme): 각각의 다른 LAN 기술들은 주소를 호스트에 할당할 때, 서로 다른(호환되지 않는) 방법을 사용한다. 인터넷 프로토콜은 호스트 주소를 표시하는 포맷을 정의해서 이 차이점들을 완화해준다. 이 경우, 각 호스트는 자신을 식별할 수 있는 유일한 인터넷 주소 한개를 할당받는다.
전달기법(Delivery Mechanism): 각각의 다른 LAN 기술들은 데이터를 인코딩하거나, 패키징하는 서로 다른 방법을 사용한다. 인터넷 프로토콜은 데이터 비트를 패킷이라고 부르는 비연속적인 단위를 정해 이 차이점들을 완화해준다. 패킷은 패킷 크기와 소스, 목적지 호스트 주소와 송신한 데이터 비트를 포함하는 데이터로 구성된다.
글로벌 IP 인터넷은 인터넷을 성공적으로 구현한 가장 유명한 사례이다. 인터넷의 내부 구조는 복잡하고, 꾸준히 변해 오고 있지만 그림과 같은 클라이언트-서버 어플리케이션 구조는 1980년대 이후로 크게 바뀌지 않았다.
각 인터넷 호스트는 TCP/IP 프로토콜(Transmission Control Protocol/Internet Protocol)을 구현한 소프트웨어를 실행하며, 이는 거의 모든 현대 컴퓨터 시스템에서 지원되고 있다.
IP 주소는 비부호형 32비트 정수이다. 네트워크 프로그램은 IP주소를 IP주소 구조체에 저장한다. IP 주소는 대게 사람들에게 Dotted-Decimal
표기법으로 제시되며, 이는 십진수 값을 사용하고 각 바이트들 사이를 점으로 구별한다는 특징이 있다. 예를 들어서 128.2.194.242
는 주소 0x8002c2f2
의 Dotted-Decimal
표현이다.
인터넷 클라이언트와 서버는 서로 통신할 때 IP주소를 사용하지만, 크기가 큰 정수인 IP주소는 기억하고, 또 구별하기에는 너무 복잡하다. 이를 해결하기 위해 인터넷은 사람에게 친숙한 Domain Names
들의 집합을 사용할 수 있게 해준다. 도메인 이름은 단어들의 배열로, whaleshark.ics.cs.cmu.edu와 같이 점으로 구별한다.
도메인 이름들의 집합은 계층구조를 띄고 있으며, 각각의 도메인 이름은 자신의 위치에 알맞은 계층을 인코드한다. 사진의 예를 들면,
계층구조의 첫 번째 단계는 이름이 없는 루트 노드이다.
Fisrt-Level Domain
은 국가 코드 최상위 수준 도메인과 일반 최상위 수준 도메인으로 나뉜다. 국가 코드 최상위 수준 도메인의 예로는 .us(미국)
, .uk(영국)
등이 있으며, 일반 최상위 수준 도메인의 예로는 .com
, .org
, net
등이 있다.
Second-Level Domain
은 도메인의 구체적인 식별을 할 수 있는 부분으로, 기관, 회사, 조직 또는 개인의 이름 등으로 사용된다. 여기에 추가적으로 서브도메인이라고 하는 하위 도메인을 가질 수 있는데, 기관 또는 웹 사이트의 특정 부분이나 서비스를 나타낸다.
Third-Level Domain
은 도메인 이름 계층구조의 가장 하위 부분으로, 특정한 컴퓨터나 장치를 식별한다. 이러한 예로는 www
나 mail
를 들 수 있다.
요약하면, www.blog.example.com
이라는 도메인의 예에서 com
이 최상위 도메인, example
이 Second-Level 도메인, blog
가 서브도메인, 마지막으로 www
가 Third-Level Domain이다.
소켓은 인터넷 연결의 끝 부분으로, 양쪽 컴퓨터 간에 데이터를 주고받을 수 있는 도구이자 프로그래밍 인터페이스다. 각 소켓은 인터넷 주소와 16비트 정수 포트로 이루어진 소켓 주소를 가지며, 이것은 address : port
로 나타낸다.
클라이언트의 소켓 주소 내의 포트는 연결 요청 시 운영체제 커널이 자동으로 할당하며, 이를 단기 포트라고 한다. 반면에 서버의 소켓 주소에 있는 포트는 대부분 영구적으로 이 서비스에 연결되는, 잘 알려진 포트다. 예를 들어, 웹 서버는 대개 포트 80
을 사용하고, 이메일 서버는 포트 25
를 사용한다. 이러한 잘 알려진 포트들은 대응되는 서비스 이름들이 존재하는데, 에를 들어 웹 서비스에 대한 서비스 이름은 http
이고, 이메일에 대해서는 smtp
이다. 포트들과 이름들 간의 매핑 Socket Pair
라고 하며, 이 녀석들은 /etc/services
파일에 보관되어 있다.
사진의 경우를 예로 들어보자.
웹 클라이언트의 소켓 주소는 다음과 같다. 128.2.194.242:51213
여기서 51213
포트는 커널이 할당한 단기 포트이다.
웹 서버의 소켓 주소는 다음과 같다. 208.216.181.15:80
여기서 80은 웹 서비스와 연관된 잘 알려진 포트이다.
이 클라이언트와 서버 소켓 주소가 주어졌다면, 둘 사이의 연결은 Socket Pair
에 의해 특별하게 식별된다.