Tag Archives: IP

[Java] 현재 시스템의 IPv4기반의 IP주소 가져오기

Java에서 IP주소를 가져오는 방법은 매우 쉽고 간단합니다. 일반적으로 사용되는 간단한 방법으로는 다음과 같은 방법이 있습니다.
[code]InetAddress.getLocalHost().getAddress()[/code]
위의 단 한줄로 현재 시스템의 IP를 읽어올 수 있습니다. 그런데 개발시에는 문제가 없었는데 리눅스 서버에서 구동해 보니 127.0.0.1과 같이 loopback 주소가 나오는 경우가 있더군요. 찾아보다 다음과 같은 방법으로 깔끔하게 해결할 수 있었습니다.
[code]/**
 * 현재 서버의 IP 주소를 가져옵니다.
 *
 * @return IP 주소
 */
private String getLocalServerIp()
{
try
{
   for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();)
   {
       NetworkInterface intf = en.nextElement();
       for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();)
       {
           InetAddress inetAddress = enumIpAddr.nextElement();
           if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress() && inetAddress.isSiteLocalAddress())
           {
            return inetAddress.getHostAddress().toString();
           }
       }
   }
}
catch (SocketException ex) {}
return null;
}[/code]
현재 시스템의 모든 네트워크 인터페이스를 읽어와서 loopback장치인지 랜선에 연결된 장치인지 여부를 확인하여 실제 사용중인 인터페이스의 IP주소를 읽어오게 됩니다. 위와 같이 사용해서 실무에 적용해본 결과 어느 OS, 장치에 상관없이 IP가 정상적으로 출력되는것을 확인하였습니다.

소스코드가 좀 길고 더럽네요; 그냥 보관용으로 적어두는데 의미를 부여하겠습니다;;

[Network/TCP] Go-Back-N / Selective Repeat

TCP 통신에 사용되는 두가지 흐름제어(Flow-Control) 알고리즘

* Go-Back-N [링크]
– Cumulative ACK
– 순서대로 패킷을 주고받되 받아야할 순서의 ACK 이외의것이 들어오면 무조건 버린다.
– 누적ACK이기 때문에 가장 마지막의 ACK만을 받으면 된다.
– 특정 ACK를 받았다면 그 이전의 모든 패킷은 정상적으로 송/수신 된것으로 간주한다.
1032645086.java
* Selective Repeat [링크]
– Selective ACK
– 각각의 패킷에 대한 ACK를 전송한다.
– 개별ACK이며 순차 전송을 한다.
– Window 사이즈만큼 전송이 가능하다.
– Window의 가장 처음의 패킷이 ACK를 받지 못했다면 Window는 Shift되지 않는다.
1078733403.java