Global IP Internet
Global IP Internet은 internet중 가장 유명하고 성공적으로 구현된 것이다. 인터넷의 내부 구조가 복잡하고 지속적으로 바뀌고 있지만, Client-Server 구조는 1980년대 초 이후로 매우 안정적으로 남아 있다.
각 인터넷 host는 TCP/IP Protocol Transmission Control Protocol/Internet Protocol을 구현한 소프트웨어를 실행하며, 거의 모든 현대 컴퓨터 시스템에서 지원되고 있다. 인터넷 클라이언트와 서버는 Socket Interface와 Unix I/O 함수들을 혼합해서 통신한다. Socket 함수들은 일반적으로 시스템 콜들로 구현되는데, 이 시스템 콜은 커널에서 Trap을 발생시키며, TCP/IP에서 다양한 커널 모드 함수들을 호출한다.
TCP/IP는 실제로는 Protocol의 집합으로 각각은 서로 다른 기능을 제공한다.
- IP: Internet Protocol
- 기본 명명법 basic naming scheme과 Datagram이라고 하는 Packet을 한 인터넷 호스트에서 다른 호스트로 보낼 수 있는 Delivery Mechanism을 제공한다.
- IP 메커니즘은 네트워크에서 Datagram이 손실되거나 중복될 경우 복구하는데 아무 일도 하지 않는다는 점에서 신뢰할 수 없다.
- UDP: Unreliable Datagram Protocol
- IP를 사용하여 프로세스 간 신뢰할 수 없는 Datagram 전송을 제공한다.
- TCP: Transmission Control Protocol/Internet Protocol
- TCP는 IP위에 구현한 복잡한 Protocol로 프로세스들 간에 안전한 완전 양방향 연결을 제공한다.
A Programmer’s View of the Internet
- host의 집합은 32비트 IP주소 집합에 매핑된다.
ex) 128.2.293.179 - IP 주소의 집합은 Internet Domain Name이라고 부르는 식별자의 집합에 매핑된다.
ex) 128.2.203.179는 www.cs.cmu.edu에 매핑되어있다. - 하나의 인터넷 호스트의 프로세스는 연결을 통해서 다른 인터넷 호스트의 프로세스와 통신할 수 있다.
IPv4 and IPv6
32비트 주소를 이용하는 Original Internet Protocol은 Internet protocol Version 4 (IPv4)라고 알려졌다.
1996년에 Internet Enginerring Task Frofce(IETF)는 Internet Protocol Version 6 (IPv6)라고 부르는 IPv4 네트워크에 후속으로 등장하였고, 128비트 주소를 갖는 IP의 새로운 버전이 제시되었다.
하지만, 현재에도 거의 대부분의 인터넷 트래픽이 IPv4 네트워크로 전송되고 있다.
IP 주소
IP 주소는 unsigned 32-bit이다. 네트워크 프로그램은 IP 주소를 IP 주소 구조체에 저장된다.
/* Internet address structure */
struct in_addr {
uint32_t s_addr; /* network byte order (big-endian) */
};
인터넷 호스트들이 서로 다른 host byte orders를 가질 수 있기 때문에, TCP/IP는 Packet header에서 네트워크를 통해 전송되는 IP 주소와 같은 정수형 데이터 아이템에 대해서 통일된 Network byte order(Big endian order)를 정의한다. IP 주소 구조체의 주소는 host byte order가 little endian인 경우에도 항상 Network byte order(Big endian order)로 저장된다. Unix는 네트워크와 host byte 순서 간의 변환을 위해 다음과 같은 함수를 제공한다.
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
Returns: value in network byte order
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(unit16_t netshort);
Returns: value in host byte order
Dotted Decimal Notation
IP주소는 보통 Dotted Decimal Notation라고 하는 형식으로 작성되며, 이것은 각 바이트가 십진수 값을 사용하고 다른 바이트들과 .을 사용해서 구분한다.
ex) IP address: 0x8002C2F2 = 128.2.194.242
Internet Domain Names
인터넷 클라이언트와 서버는 서로 통신할 때 IP 주소를 사용한다. 하지만 크기가 큰 정수는 사람들이 기억하기 어려워서 인터넷에서는 Domain 이름들의 집합을 IP 주소 집합으로 매핑하는 메커니즘과 함께 사람들에게 친숙한 별도의 Domain Name set을 정의한다.
Domain Name의 Set은 계층 구조를 형성하고 있으며, 각각의 도메인 이름은 계층 구조에서 자신의 위치를 인코드 한다.
계층 구조는 트리로 나타나며 트리의 노드들은 root로 돌아가는 경로로 형성되는 Domain Name을 나타낸다. 서브 트리는 sub domain이라고 한다. 계층 구조의 첫 번째 단계는 이름이 없는 root 노드이다.
인터넷은 도메인 이름의 집합과 IP 주소 집합 사이에 매핑을 정의한다. 이 매핑은 DNS (Domain Name System)라고 하는 전 세계에 분산된 데이터베이스에 의해 관리된다. 개념적으로 DNS 데이터베이스는 수백만 개의 Host Entry로 구성되어 있으며, 각각은 도메인 이름의 집합과 IP 주소 집합 사이의 매핑을 정의한다.
Properties of DNS Mappings
도메인 이름과 연관된 IP 주소를 표시하는 NSLOOKUP프로그램으로 DNS 매핑의 특성을 알 수 있다.
인터넷 host는 지역적으로 정의된 도메인 이름 localhost를 가지고 있으며, 항상 loopback address 127.0.0.1에 매핑된다.
linux> nslookup localhost
Address: 127.0.0.1
localhost 이름은 같은 머신에서 돌고 있는 클라이언트와 서버들을 참조하는데 편리하며 디버깅 시에 유용하다.
실제 우리의 localhost의 도메인 이름을 알기 위해서는 hostname을 사용할 수 있다.
linux> hostname
whaleshark.ics.cs.cmu.edu
간단한 경우에, 도메인 이름과 IP 주소 사이에는 일대일 one-to-one 매핑이 존재한다.
linux> nslookup whaleshark.ics.cs.cmu.edu
Address: 128.2.210.175
그러나 일부 경우에, 여러 도메인 이름이 동일한 IP 주소에 매핑된다.
linux> nslookup cs.mit.edu
Address: 18.62.1.6
linux> nslookup eecs.mit.edu
Address: 18.62.1.6
대부분의 일반적인 경우에, 여러 도메인 이름들은 다수의 IP 주소로 매핑될 수 있다.
linux> nslookup www.twitter.com
Address: 199.16.156.6
Address: 199.16.156.70
Address: 199.16.156.102
Address: 199.16.156.230
linux> nslookup twitter.com
Address: 199.16.156.102
Address: 199.16.156.230
Address: 199.16.156.6
Address: 199.16.156.70
마지막으로 일부 유효한 도메인 이름들은 어떤 IP주소에도 매핑되어 있지 않을 수 있다.
linux> nslookup ics.cs.cmu.edu
*** Can't find ics.cs.cmu.edu: No answer
Internet Connections
인터넷 클라이언트와 서버는 연결을 통해서 Streams of bytes을 주고받는 방식으로 통신한다.
- Point-to-point: 두 개의 프로세스를 연결한다는 점에서 point-to-point 연결이다.
- Full-duplex: 데이터가 동시에 양방향으로 흐를 수 있다는 점에서 완전 양방향 Full-duplex
- Reliable: 소스 프로세스가 보낸 stream of bytes이 결국은 보낸 것과 동일한 순서로 목적지 프로세스에서 수신된다는 의미에서 신뢰할 수 있다.
socket 소켓은 연결의 endpoint다.
각 소켓은 인터넷 주소와 16비트 정수 port로 이루어진 소켓 주소를 가지며 이것은 IP Address: Port로 나타낸다.
Port는 프로세스를 식별하는 16bit 정수다.
- Ephemeral port: 클라이언트의 소켓 주소 내의 port는 클라이언트가 연결 요청을 할 때 커널이 자동으로 할당한다.
- Well-known port: 서버의 소켓 주소에 있는 port는 대개 영구적으로 이 서비스에 연결되는 잘 알려진 port다.
예를 들어, 웹 서버는 보통 port 80을 사용하고, 이메일 서버는 port 25를 사용한다. 잘 알려진 port를 갖는 각 서비스에 연관되어 이에 대응되는 잘 알려진 서비스 이름들이 존재한다. 예를 들어 웹 서비스에 대한 잘 알려진 이름은 http이고, 이메일에 대해서는 smtp다. 잘 알려진 이름과 포트들 간의 매핑은 /etc/services 파일에 보관되어 있다.
Anotomy of a Connection
연결은 두 개의 endpoint의 소켓 주소에 의해 유일하게 식별된다. 이 두 개의 소켓 주소를 socket pair라고 한다.
socket pair는 tuple로 나타낸다.
(cliaddr: cliport, servaddr: servport)
- cliaddr: 클라이언트의 IP 주소
- cliport: 클라이언트의 port
- sevaddr: 서버의 IP 주소
- servport: 서버의 port