Java Category/Java

[Java] 네트워크 개념 & IP 주소 얻기

ReBugs 2023. 8. 11.

이 게시글은 이것이 자바다(저자 : 신용권, 임경균)의 책과 동영상 강의를 참고하여 개인적으로 정리하는 글임을 알립니다. 


네트워크

  • 네트워크 : 여러 컴퓨터들을 통신 회선으로 연결한 것
  • LAN(Local Area Network) : 가정, 회사, 건물, 특정 영역에 존재하는 컴퓨터를 연결한 것
  • WAN(Wide Area Network) : LAN을 연결한 것

WAN이 우리가 흔히 말하는 인터넷이다.

 

출처 : 이것이 자바다 유튜브 동영상 강의

  • Switch(Hub) : 특정 영역에 존재하는 컴퓨터를 연결하는 물리적인 장치
스위치와 허브의 개념은 엄연히 다르지만 특정 영역에 존재하는 컴퓨터를 연결하는 물리적인 장치라는 면에서 공통점을 가진다.

 

서버와 클라이언트

네트워크에서 유무선으로 컴퓨터가 연결되어 있다면 실제로 데이터를 주고받는 행위는 프로그램들이 한다.

  • Server(서버) : 서비스를 제공하는 프로그램
  • Client(클라이언트) : 서비스를 요청하는 프로그램

인터넷에서 두 프로그램이 통신하기 위해서 먼저 클라이언트가 서비스를 요청하고, 서버는 처리 결과를 응답으로 제공해 준다.

출처 : 이것이 자바다 유튜브 동영상 강의

 

IP 주소

IP(Internet Protocol)란 컴퓨터의 고유한 주소이다.

IP 주소는 네트워크 어댑터(LAN 카드) 마다 할당된다.

만약 컴퓨터에 두 개의 네트워크 어댑터가 장착되어 있다면, 두 개의 IP 주소를 할당받을 수 있다.

자동으로 IP주소 받기가 설정되어 있다면 Switch또는 Hub가 할당해 주는 IP주소를 사용하는 것이고, 사용자가 직접 설정할 수도 있다.

 

IP는 3자리의 부호 없는 0~255 사이의 정수가 4자리로 구성되어 있다. (xxx.xxx.xxx.xxx)

 

 IP 주소는 아래의 두 가지로 나뉜다.

  • 내부 IP : 같은 LAN에서 컴퓨터를 식별하기 위한 고유 번호
  • 외부 IP : WAN에서 컴퓨터를 식별하기 위한 고유 번호

내부 IP로 네트워킹을 하려면 같은 LAN에 있어야 하고, 한정된 공간이 아닌 광범위한 인터넷이 가능한 지역에서 네트워킹을 하려면 외부 IP로 통신을 해야 한다.

 

네트워크 어댑터에서 내부 IP 주소를 확인하려면 윈도우에서 ipconfig 명령어를, 맥OS 에서는 ifconfig 명령어를 실행하면 된다.

 

외부 IP 주소를 확인하려면 윈도우 기준 CMD 창에서 아래의 명령어를 입력하면 된다.

외부 IP 확인하는 명령어
nslookup myip.opendns.com resolver1.opendns.com

MAC Address
명령프롬프트에서 ipconfig /all 을 입력하면 아래와 같이 물리적 주소를 확인할 수 있는데, 이것이 MAC Address이다.

맥 어드레스는 네트워크 어댑터마다 모두 고유한 값을 가지고 있다.
따라서 스위치는 해당 주소를 통해 컴퓨터를 구별하고, IP주소를 부여해 준다.

 

연결한 상대방 컴퓨터의 IP 주소를 모르면 프로그램들은 서로 통신할 수 없다.

우리가 모르면 114로 문의하듯이 프로그램은 DNS를 이용해서 컴퓨터의 IP 주소를 검색한다.


DNS(Domain Name System)

우리는 네이버 서버의 IP 주소를 모르는데 웹 서버를 이용할 수 있다.

www.naver.com  을 주소창에 입력하면 바로 네이버를 접속할 수 있다.

이는 DNS 때문에 가능한 것이다.

DNS에 도메인을 알려주면 DNS는 해당 도메인에 맞는 IP주소 값을 알려준다.

DNS
DNS는 도메인 이름으로, IP를 등록하는 저장소이다.
대중에게 서비스를 제공하는 대부분의 컴퓨터는 도메인 이름과 IP를 DNS에 미리 등록해 놓는다.
또한 DNS도 하나의 서버이다.

DNS도 서버이므로 IP를 알아야 우리가 요청을 할 수 있는데, 이는 명령프롬프트에서 ipconfig /all 명령어로 알 수 있다.
그리고 DNS 서버의 IP 주소는 Switch가 제공한다.

DNS 서버 또한 사용자가 다른 서버로 변경할 수 있는데, 유효한 서버 주소여야 한다.

 

웹 브라우저는 웹 서버와 통신하는 클라이언트로, 사용자가 입력한 도메인 이름으로 DNS에서 IP 주소를 검색해 찾은 다음 웹 서버와 연결해서 웹 페이지를 받는다.


Port 번호

DNS를 통해 IP 주소를 알았다고 하더라도 포트 번호를 모르면 정상적으로 네트워킹을 할 수 없다.

 

한 대의 컴퓨터에는 다양한 서버 프로그램들이 실행될 수 있다.

예를 들어 웹 서버, DBMS, FTP 서버 등이 하나의 IP 주소를 갖는 컴퓨터에서 동시에 실행될 수 있다.

이 경우 클라이언트는 어떤 서버와 통신해야 할지 결정해야 한다.

IP는 컴퓨터의 네트워크 어댑터까지만 갈 수 있는 정보이기 때문에, 컴퓨터 내부에서 실행하는 서버를 선택하기 위해서는 추가적인 Port 번호가 필요하다.

Port 번호
Port는 운영체제가 관리하는 서버 프로그램의 연결번호이다.
서버는 시작할 때 특정 Port 번호에 바인딩한다.
예를 들어 웹서버는 80번으로, DBMS는 1521(오라클 DBMS)번으로 바인딩할 수 있다.
따라서 클라이언트가 웹 서버와 통신하려면 80번으로, DBMS와 통신하려면 1521번으로 요청을 해야 한다.
출처 : 이것이 자바다 유튜브 동영상 강의

클라이언트가 서버의 IP 번호와 Port 번호까지 알아서 서버에 특정 작업을 요청을 했다면, 이제는 반대로 서버가 클라이언트의 IP 주소와 Port번호를 알아야 한다.

 클라이언트의 Port 번호는 서버와 같이 고정적인 Port 번호에 바인딩하는 것이 아니라 운영체제가 자동으로 부여하는 번호를 사용하기 때문에 애초에 클라이언트가 서버에 요청을 할 때, 클라이언트의 IP 주소와 Port 번호를 같이 전송된다.

 

프로그램에서 사용할 수 있는 전체 Port 번호의 범위는 0~65535로, 아래와 같이 사용 목적에 따라 세 가지 범위를 가진다.

출처 : 이것이 자바다 유튜브 동영상 강의

  • Well Know Port Numbers : 특정 프로그램이 아니라 전 세계 사람들이 공통적으로 사용하는 포트 번호(고유함)
  • Registered Port Numbers : 특정 회사가 비용을 지불하여 고정적인 포트 번호를 사용(고유함)
  • Dynamic Or Private Port Numbers : 이 포트 번호는 동적 포트 번호이므로 수시로 바뀔 수 있고, 고유하지 못하다. 따라서 다른 서버와 포트가 겹칠 수 있고, 겹친다면 네트워킹을 할 수 없다.

 

 


 

IP 주소 얻기

자바는 IP 주소를 java.net 패키지의 InetAddress로 표현한다.

InetAddress를 이용하면 로컬 컴퓨터의 IP 주소를 얻을 수 있고, 도메인 이름으로 DNS에서 검색한 후 IP 주소를 가져올 수도 있다.

 

로컬 컴퓨터의 InetAddress를 얻고 싶다면 InetAddress.getLocalHost() 메소드를 호출하면 된다.

InetAddress ia = InetAddress.getLocalHost();

 

InetAddress의 객체를 통해 IP를 얻고 싶다면 아래와 같이 호출하면 된다.

리턴값은 문자열로 된 IP주소이다.

String ip = ia.getHostAddress();

 

 

만약 컴퓨터의 도메인 이름을 알고 있다면 아래 두 개의 메소드를 사용하여 InetAddress 객체를 얻을 수 있다.

InetAddress ia = InetAddress.getByName(String domainName)
InetAddress[] = iaArr = InetAddress.getAllByName(String domainName)
  • getByName() : DNS에서 도메인 이름으로 등록된 단 하나의 IP 주소를 가져옴
  • getALLByName() : DNS에 등록된 모든 IP 주소를 배열로 가져옴
보통 큰 서버들은 하나의 도메인 이름으로 여러 IP가 등록되어 있다.
이유는 사용자가 많기 때문에 하나의 서버에서 감당하기 힘들기 때문에 여러 IP에서 나눠서 관리하기 때문

 

이 메소드들로부터 얻은 InetAddress 객체에서 IP 주소를 얻으려면 getHostAddress() 메소드를 아래와 같이 호출하면 된다.

리턴 값은 문자열로 된 IP 주소이다.

String ip = InetAddress.getHostAddress();

사용 예제

import java.net.InetAddress;
import java.net.UnknownHostException;
	
public class InetAddressExample {
	public static void main(String[] args) {
		try {
			InetAddress local = InetAddress.getLocalHost();
			System.out.println("내 컴퓨터 IP 주소: " + local.getHostAddress());

			InetAddress[] iaArr = InetAddress.getAllByName("www.naver.com");
			for(InetAddress remote : iaArr) {
				System.out.println("www.naver.com IP 주소: " + remote.getHostAddress());
			}
		} catch(UnknownHostException e) {
			e.printStackTrace();
		}
	}
}
/*
내 컴퓨터 IP 주소: 192.168.xxx.xxx
www.naver.com IP 주소: 223.130.200.104
www.naver.com IP 주소: 223.130.200.107
*/

 

댓글