1. Network Basic
네트워크 기본 개념
기본 네트워크 개념
자바는 네트워크 애플리케이션을 위해 설계도니 최초의 프로그래밍 언어로 네트워크의 중요성을 가장 먼저 생각했음
네트워크 프로그램 작성을 쉽게 만든다는 것이 큰 매력중 하나
TCP/IP 4계층의 application layer와 맞닿는 Transfort layer와의 관계에 대해 중점적으로 다룸
이 장에서는 TCP/IP 계층 모델, IP, TCP 및 사용자 데이터그램 프로토콜(UDP, User Datagram Protocol), 방화벽과 프록시 서버(proxy server), 인터넷, 인터넷 표중화 프로세스 등에 대해 설명
네트워크
네트워크 안의 각각의 장비는 노드(node)라고 부름. 노드 중 일반적인 PC를 호스트(host)라고 부름. 이 책에서는 네트워크상 어떤 장치는 ‘노드’라고 정의하며 노드 중 일반적인 PC를 언급할 땐 ‘호스트’라는 용어를 사용할 것임
패킷
모든 현대의 컴퓨터 네트워크는 **패킷 교환(packet-switched)**방식을 사용함. 네트워크를 여행중인 데이터는 패킷이라 불리는 덩어리로 나뉘고 각 패킷은 개별적으로 처리됨.
패킷에는 송신자와 수신자의 정보가 포함되어 있음
각각의 패킷은 구별 가능하기 때문에 단일 회선을 통해 간섭없이 많은 패킷을 교환할 수 있는것이 장점.(경제적)
또한 패킷의 체크섬(checksum)값을 이용하면 전송 중에 발생한 데이터 손상 여부를 확인할 수 있음
프로토콜 : 컴퓨터 통신 방법을 정의한 정밀한 규칙의 집합.
HTTP (Hyper Text Transfer Protocol)은 웹 서버와 웹 브라우저 간의 통신 방법을 정의함 (전송 규약)
네트워크 계층
네트워크를 통한 전송은 데이터의 논리적 특성뿐만 아니라 네트워크의 물리적 특성까지 고려되어야 하는 복잡한 작업임.
애플리케이션 개발자나 소프트웨어 사용자들에게 이런 과정들을 노출시키지 않기 위해 역할을 분리하여 몇 개의 계층으로 분리하였다. 이렇게 분리함으로써 인터페이스가 변경되지 않는 한 하나의 계층 안에 있는 소프트웨어를 다른 계층에 미치는 영향 없이 수정하거나 대체할 수 있다.
우리가 작성하게 될 자바 코드의 90%는 애플리케이션에서 동작하고 전송 계층하고만 대화(통신)를 하게 된다. host-to-network의 복잡함은 직접 노출이 되지 않으며, 이것이 계층 모델(layer model)의 핵심이다.
host-to-network layer(호스트 투 네트워크 계층)
이더넷 카드나 와이파이 안테나 같은 특정 네트워크 인터페이스가 물리적인 연결을 통해 로컬 네트워크 및 외부로 IP 데이터그램을 보내는 방법을 정의한다.
이 계층의 일부는 회선, 광케이블, 전파, 연결 신호 같은 다른 컴퓨터를 서로 연결하는 하드웨어로 구성되어 있으며, 때로 네트워크 물리 계층이라고 불린다.
자바는 물리 계층을 다룰 수 없고 이를 가능하게 하는 건 API를 사용한 인터넷 계층이다.
인터넷 계층
OSI 모델에서는 조금 더 포괄적인 이름인 네트워크 계층으로 불린다. 네트워크 계층 프로토콜은 데이터의 비트와 바이트를 좀 더 큰 그룹인 패킷으로 구성하는 방법과 다른 컴퓨터가 서로를 찾을 수 있도록 주소 체계를 정의한다. 인터넷 프로토콜(IP)은 세상에서 가장 널리 사용되는 네트워크 계층 프로토콜이며, 자바가 이해할 수 있는 유일한 네트워크 계층 프로토콜이기도 하다.
IP는 32비트 주소를 사용하는 IPv4와 128비트 주소를 사용하는 IPv6 두 종류가 존재하며 **데이터그램(datagram)**이라는 패킷으로 인터넷 계층을 통해 보내진다. IPv4는 payload에 최대 54,515바이트를 포함할 수 있는 반면 IPv6는 최대 4GB데이터를 포함할 수 있다.
전송 계층
데이터그램(datagram)은 전송 중에 손상될 가능성이 있으며 전송한 순서대로 도착하지 않는다. 헤더에 있는 체크섬(checksum)은 헤더의 손상만 발견할 수 있을 뿐 데이터 그램의 데이터 부분에 대한 손상은 발견할 수 없다.
각각의 데이터그램은 출발지에서 목적지까지 서로 다른 경로로 전달되며, 데이터그램 A가 데이터그램B보다 먼저 보내졌다고 먼저 도착한다는 의미는 아니다.
전송계층(transport layer)은 보낸 순서대로 수신되도록 보장할 책임이 있다. 만약 패킷이 손실되면 송신자에게 재전송을 요청한다.
전송 계층에는 TCP(Transmission Control Protocol)와 UDP(User Datagram Protocol) 두가지 주요한 프로토콜이 있다.
애플리케이션 계층
사용자에게 데이터가 전달되는 계층을 애플리케이션 계층(application layer)라고 부른다
웹을 위한 HTTP외에도 이메일 전송을 위한 SMTP(Simple Mail Transfer Protocol), POP(Post Office Protocol), IMAP(Internet Message Access Protocol) 등이 있다. 파일 전송을 위한 프로토콜은 FTP, FSP(File Service Protocol), TFTP등이 있고, 파일 접근을 위한 NFS(Network File System)프로토콜 파일 공유를 위한 Gnutella, BitTorrent 프로토콜등이 있다. 음성 통신에는 SIP(Session Initiation Protocol)와 Skype프로토콜이 널리 사용된다.
IP, TCP 그리고 UDP
인터넷 프로토콜 IP
IP는 두 지점 사이의 여러 경로를 허용하고 손상된 라우터 주변 데이터의 패킷을 라우팅할 수 있도록 설계됨
패킷은 보내진 순서대로 도착하지 않을 수 있다. 이러한 IP 기본 설계 요소들을 개선하기 위해서 (1)각 연결의 끝에 IP 패킷의 수신 여부 확인 기능과 (2)손상되거나 손실된 패킷에 대한 재전송 요청 기능을 추가하는 TCP가 IP계층위에 놓인다.
TCP(신뢰성)
손실된 데이터에 대한 재전송을 요청하거나 헤더의 크기가 클 때 오버헤드 유발
UDP(비신뢰성)
패킷의 도착 순서와 손실, 손상 여부를 보장하지 않는 신뢰할 수 없는 프로토콜
IP 주소와 도메인
IP주소 체계에 대해서는 알아 둘 필요가 있음
IPv4는 32비트 주소 IPv6는 16진수를 8개의 블록으로 표기
DNS(Domain Name System) : ip 주소를 사람이 기억하기 쉬운 hostname으로 변환해주는 시스템이 DNS이다. 자바 프로그램은 네트워크에 접근할 때 숫자로 된 주소와 이에 대응하는 호스트네임을 모두 처리해야 하며, 이것을 처리하는 방법은 java.net.InetAddress 클래스에서 제공된다. java.net.InetAddress 클래스는 4장에서 자세히 다룸
~ 범위와 172.16 ~ 172.31 까지 그리고 192.168로 시작하는 모든 IPv4 주소들은 일반적으로 인터넷 주소로 할당되지 않는다. 이러한 주소들은 라우팅이 불가능한 주소기에 외부 인터넷에 보여지지 않는 사설 네트워크를 구성하는데에 유용히 사용된다.
IPv4 주소들은(일반적으로 127.0.0.1) 항상 로컬 루프백 주소(local loopback address)을 의미한다. 이러한 주소들은 실행중인 컴퓨터에 상관없이 항상 로컬 컴퓨터를 가르키며, 이 주소에 대한 호스트네임으로 localhost가 일반적으로 사용된다. IPv6에서는 0:0:0:0:0:0:1(줄여서 ::1로 쓸 수 있음)이 루프백 주소로 사용된다. 주소 0.0.0.0은 항상 패킷이 발생한 호스트의 주소를 가르키며, 목적지 주소(destination address)로는 사용할 수 없고 출발지 주소(source address)로만 사용할 수 있다. 마찬가지로 0으로(0비트 8개) 시작하는 IPv4 주소들은 같은 로컬 네트워크 안의 호스트에 대한 참조로 간주된다.
포트
포트는 1에서 65535까지의 숫자로 표현 되며, 각 포트는 특정 서비스에 할당될 수 있다.
유닉스 계열의 환경에선 서비스별로 포트목록이 /etc/services 파일에 정리되어 있음.
HTTP 프로토콜은 일반적으로 80번 보트를 사용하고 80번에 들어오는 연결에 대해서 수신(listen)한다고 말함. 데이터는 특정 포트로 보내지는데 데이터를 수신한 장비는 포트를 검사하기 위해 각각의 패킷을 검사하고, 해당 포트로 수신을 기다리고 있는 프로그램으로 데이터를 전달한다. 이것이 바로 여러 종류의 트래픽을 분류하는 방법이다.
인터넷
**인터넷(Internet)**은 세상에서 가장 큰 IP 기반 네트워크이다. 인터넷은 단순히 표준 프로토콜로 서로 대화하도록 약속된 컴퓨터들의 매우 큰 집합에 불과하다.
또 다른 IP 기반 네트워크로 소문자로 i로 시작하는 **인터넷(internet)**이 있다. Internet(대문자)와 연결되지 않은 높은 보안 수준이 요구되는 내부 네트워크가 이에 해당하며, 일반적으로 회사에서 외부 사용자가 접근할 수 없도록 분리하여 사용하는 인트라넷(Intranet)이 이와 비슷하다.
인터넷 주소 블록
ISP(Internet Service Provider)들은 지역 인터넷 등록기관으로부터 IPv4 주소 블록을 할당받는다. 그리고 회사나 단체가 인터넷에 연결된 IP기반의 네트워크를 구성하고자 할 때, ISP는 다시 그들에게 IP주소 블록을 할당한다. 예를 들어 앞자리 주소가 216.254.85 일 경우면 앞자리 24비트가 고정되어 있기에 ‘/24’ 라고 불리고 ‘/23’ 은 23비트가 고정되어 있음을 나타낸다. 이 경우엔 나머지 9비트인 2^9인 512개의 로컬 IP주소를 이용할 수 있다. (하지만 해당 블록에서 가장 낮은 주소는 네트워크 자체를 식별하는데에 사용되고, 가장 큰 주소는 해당 네트워크에 대한 브로드캐스트 주소로 사용되기 때문에 실제 예상하는 것보다 두 개가 적은 네트워크 주소를 사용할 수 있다.)
네트워크 주소 변환
IP 주소의 결핍과 요구의 증가에 대해 NAT(Network Address Translation)의 약자로 네트워크 주소 변환 기술을 사용한다. NAT 기반의 네트워크에서 대부분의 노드들은 라우팅 되지 않는다. private ip(로컬 네트워크)를 NAT을 통해 ISP로 연결하는 라우터는 이러한 로컬 주소를 라우팅 가능한 몇 개의 주소로 변환한다.
라우터는 사용자 PC로부터 나가거나 들어오는 연결을 감시하고 IP 패킷 안의 주소를 변경한다. 라우터는 나가는 패킷에 대해서 출발지 주소를 라우터의 외부주소(211.머시기)로 변경하고 들어오는 패킷에 대해서는 목적지 주소를 로컬 주소(192..저시기) 중 하나로 변경한다.
외부와 내부의 주소가 다를 수 있다는 사실만 기억하면 된다.
방화벽(firewall)
네트워크 인터페이스를 오가는 각각의 패킷을 검사하고 규칙에 따라 연결 요청을 받아들이거나 거부하는 기능을 한다.
프록시 서버(Proxy Server)
프록시 서버는 내부와 외부 사이의 중계자 역할을 하며 외부 세상으로 직접 연결하는 것을 방지한다.
장점
프록시를 사용하면 얻을 수 있는 한가지 보안 이점은 외부 호스트나 사용자는 프록시 이외에 로컬 네트워크의 어떠한 장비의 IP나 이름도 찾을 수 없으며, 내부 시스템을 해킹하기 어렵게 만든자는 점이다.
프록시 서버는 일반적으로 애플리케이션 계층에서 동작함(방화벽은 전송 계층이나 인터넷계층에서 동작함) 프록시 서버는 HTTP나 FTP같은 애플리케이션 수준의 프로토콜에 대해 알고 있다(SOCKS 프록시는 전송계층에서 동작)
Telnet 데이터를 포함하는 FTP패킷차단이나 특정 url에 대한 접근을 프록시 서버에서 차단할 수 있다.
프록시 서버는 로컬 캐시를 구현하기 위해 사용되기도 한다.(캐싱) → 인터넷 연결의 부하 감소 및 응답 시간 향상
단점
일부 프로토콜만 지원함(HTTP, FTP, SMTP같은 TCP 연결은 처리가능. 하지만 BitTorrent같은 최신 프로토콜은 지원 X)
클라이언트/서버 모델
대부분의 최신 네트워크 프로그래밍은 클라이언트/서버 모델을 기반으로 한다. 클라이언트/서버 애플리케이션은 서버에 비해 상대적으로 저렴한 개인용 컴퓨터에서 실행되는 클라이언트 소프트웨어에서 처리된다. 반면 많은 양의 데이터는 ㅇ리반적으로 값비싼 고성능 서버나 클라우드 서버에 저장한다. 대부분의 경우 서버는 주로 데이터를 보내고 클라이언트는 주로 서버가 보낸 데이터를 받는다. 그러나 하나의 프로그램이 오직 데이터를 받거나 주기만 하는 역할을 하진 않는다.
인터넷 표준
애플리케이션 계층 프로그래밍과 프로노콜에 관련된 대부분의 표준을 만드는 곳은 IETF(Internet Engineering Task Force)와 W3C(World Wide Web Consortium)이다.
IETF는 관심 있는 사람이나 단체에게 참여의 기회가 열려 있는 상대적으로 비형식적이고 민주적인 단체이다. IETF의 표준들은 ‘대략적인 합의와 실제적인 구현’에 근거하고 구현을 선도하기보다는 쫓아가는 경향이 있다. IETF 표준에는 TCP/IP, MIME, SMTP가 포함되어 있다.
이에 반해, W3C는 개인의 참여를 명시적으로 배제하며 구성원이 되기 위해 비용을 지불하는 기업체들에 의해 관리되는 단체이다. W3C 표준에는 HTTP, HTML, XML등이 포함된다.
Last updated