이번 네트워크 프로그래밍에서 표현할 프로그램에 대한 이야기는 모두 끝났다. 마지막으로 첫 시간에 소개한 OSI 7계층에 대한 이야기와 주요 프로토콜에 대한 소개를 하며 마쳐볼까 한다. 만약 이전 글들을 모두 읽었다면 다시 보는 OSI 계층이 다른 느낌으로 올 것이 분명하다. - 물리 계층 (Physical Layer) OSI 계층 중 가장 낮은 계층으로 네트워크에서 다른 네트워크로 전달되는 하드웨어로 구성된다. 물리 계층의 데이터 단위는 비트(Bits)이다. 데이터 계층에서 받은 데이터를 기계가 알아들을 수 있는 비트로 변환되어야 한다. 전자기적 신호로 구성되므로 매우 복잡한 기술을 필요로 한다. 물리 계층의 데이터 단위 : 비트(Bits)물리 계층의 프로토콜(장비) : 전선, 전파, 도파관 - 데이터 ..
1. IP Cast 우리가 지금껏 배운 네크워크 연결은 모두 송신지 IP 주소와 수신지 IP 주소가 존재했다. 그리고 IP 주소를 입력하는 공간에는 단 하나의 주소만 입력할 수 있었다. 즉, 지금까지의 송수신은 모두 One to One 방식이었다. 하지만, 같은 정보를 여러명에게 전달해야 하는 경우도 분명 존재할 것이다. 예를들어 우리가 프리미어리그 스트리밍 경기를 네트워크를 통해 본다고 가정해보자. 스트리밍 제공자가 각각의 클라이언트와 1:1로 연결을 해야 한다면, 각 사용자에게 따로따로 데이터를 만들어 전달해줘야한다. 제공자 입장에서 엄청난 데이터를 사용해야 하는 불편함이 소모된다. 이를 해결하기 위한 좋은 방법이 한명의 송신자와 여러명의 수신자를 동시에 연결시켜 전송 한번으로 여러명의 사용자가 이를..
앞선 시간에 말했듯이 UDP 클래스에는 총 2개의 주요 클래스가 존재한다. 이번 시간에는 각 클래스가 가지는 의미와 특징에 대해알아보자. 그리고 추가적으로 UDP에서 Java 7의 NIO를 적용하게 되면 어떠한 특징을 갖게 되는지 역시 알아보도록 하자. DatagramPacket : 데이터를 전송하기 위해서 Packet으로 감싸야 함DatagramSocket : 보내야 되는 패킷을 전송하거나 받은 패킷을 확인하는 역할 수행1. DatagramPacket 클래스 UDP 데이터그램은 IP 헤더와 UDP 해더로 구성된다. UDP 헤더에는 출발지와 목적지의 포트에 대한 정보가 들어있고, IP 헤더에는 출발지와 목적지의 IP 주소를 포함하여 데이터 무결성을 보장하기 위해 필요한 다른 정보들이 들어가게된다. UDP..
1. UDP(User Datagram Protocol) 란? 이제껏 TCP 환경에서의 소켓 송수신을 살펴봤다면 이번엔 UDP 데이터에서 전송되는 네트워크 애플리케이션에 대해 살펴보자. 기본적으로 UDP는 TCP보다 단순한 방식으로 데이터를 주고 받는다. TCP가 데이터의 신뢰성에 초점을 맞춘 방식이라면 UDP는 데이터 전송 속도에 초점을 맞춘 방식이다. - UDP의 특징전송 방식이 매우 단순하고 신뢰성이 낮다.전송 도중 데이터가 유실되더라도 재전송 하지 않는다.송신자가 수신자에게 정보가 정확히 전달 되었는지 알 방법이 없다.데이터가 보낸 순서로 도달 했는지 알 수 없고, 재정립도 하지 않는다. 그렇다면 왜 이렇게 신뢰성이 한참 떨어지는 프로토콜을 사용하는 것일까? 앞서 말했듯이 속도에 더 초첨을 두어야하..
Java NIO의 3번의 시리즈 마무리 채널에 대해 알아보자. 앞서도 간략히 설명했지만, Java NIO는 채널로 동작하게 된다. 1. 채널(Channel)이란? 실제 네트워크 환경과는 살짝 다르지만 쉬운 예시를 들어 생각해보자. 기존의 Java I/O는 Blocking 하고, Java NIO는 Non-blocking 하다는 사실을 알고 있다. 그렇기에 Java IO에서 스레드에서 Reader와 Writer만 존재해, Reader로 블로킹을 하고, Writer로 블로킹을 풀어주면 된다. 하지만, Java NIO는 Non-blocking 방식이다. 따라서, 데이터를 주고 받기 위해서 스레드와 데이터가 들어간 버퍼사이의 일종의 터널을 만들어주어야 한다. 이것이 채널이 하는 역할이다. 그리고 이 채널은 파일,..
1. 버퍼의 사용 지난 시간에 Java NIO에서 버퍼가 어떻게 사용되는지와 더불어 Direct 버퍼와 Non-Direct Buffer에 대해서 알아보았다. 이번 시간에는 버퍼를 Java에서 어떻게 사용 할 수 있는지 알아보도록 하자. 버퍼는 Java.nio에 클래스로 소속되어 있다. 그리고 해당 클래스는 우리가 주고받게 될 데이터 양식을 기반으로 두고 있다. 상위에 Buffer 클래스가 존재하고 하위 서브클래스로 데이터 양식에 맞는 클래스가 존재하게 된다. 버퍼 종류 설명 ByteBuffer 바이트 타입의 데이터를 받는 버퍼 CharBuffer 문자열 타입의 데이터를 받는 버퍼 ShortBuffer Short형 타입의 데이터를 받는 버퍼 IntBuffer 정수형 타입의 데이터를 받는 버퍼 LongBuf..
1. Java IO 이전에도 한번 설명한 바가 있는데, 자바에서 지원하는 기본 스트림 기반의 입출력 체계를 I/O 혹은 I/O 스트림 이라고 한다. I/O는 당연히 각각 Input과 Output을 뜻한다. Java IO라는 단어만 보게 된다면, Java 프로그램에서 사용되는 Input과 Output 이라는 의미다. 그리고 Java에선 기본적으로 Stream 방식의 IO를 사용하므로 Java IO라는 단어를 보게 되면 당연하게 우린 스트림을 떠올리게 된다. Java IO는 아래와 같은 특징을 가진다.Stream 방식버퍼 사용하지 않음블로킹 방식 (Blocking) Java IO 는 바이트(Byte) 방식의 입력과 문자열(Char) 방식의 입력 2가지로 크게 나뉜다. InputStream / OutputSt..
이번에는 소켓 프로그래밍이 네트워크 프로그래밍에 있어서 매우 중요한 부분을 차지하기 때문에 아주 간단한 서버와 클라이언트 소켓 프로그램을 보여주면서 매우 기본적이고 범용적으로 사용할 수 있는 소켓에 대해 소개하도록 하겠다. 만약 Server/Client 프로그래밍을 하게 된다면 필연적으로 만들어야 하는 부분이기에 아주 중요한 개념이다. 또한, 양쪽에서의 송수신이 어떤 방식으로 이루어지는지도 한번 살펴보면서 기초적인 소켓 프로그래밍에 대해 살펴볼 뿐만 아니라 이제껏 소개한 개념을 Rewind 하는 방식으로 진행해볼까 한다. 1. 서버 소켓 만들기 간단한 Server / Client 소켓 프로그래밍 예제를 살펴보자. 우선 서버 소켓을 만들기 위해 포트와 서버 소켓을 연결하고, Accept() 메소드를 통해서..
1. 암호 알고리즘 네트워크 환경은 누구나 접속할 수 있는 만큼 외부의 공격도 당한다. 따라서 국가적 기밀이나 군사적 자료 등 보안이 중요한 자료들도 편의성을 위해 인터넷 환경으로 전달되곤 하는데, 이런 경우 무엇 보다도 보안 문제에 대한 고민이 절실하다. 그렇기에 우린 암호화 방식을 이용해 이런 상황들에 대한 보완을 진행한다. 우리가 네트워크 상에서 작성된 평문을 일련의 암호화 알고리즘을 이용하여 암호문으로 변경하는 것이 기본적인 암호 매커니즘이다. 누군가에게 전달하고싶은 파일이 있는데, 이 파일을 암호화 시켜야 한다고 가정하자. A 라는 사람은 B에게 암호문을 전달하게 되는데, 이 두사람은 서로 어떤 방법으로 암호화를 진행했는지 반드시 알아야 우리의 정보를 정확히 전달 해줄 수 있다. 이렇게 암호화를..
1. 서버 소켓(Server Socket) 서버 소켓은 클라이언트의 연결 요청을 서버가 받기 위해 존재한다. 서버 소켓은 서버에서 실행 되며 클라이언트에서 오는 연결을 서버 장비의 특정 포트에 연결을 시켜준다. 클라이언트의 요청을 받은 서버는 해당 요청을 읽고 클라이언트가 요청한 정보를 다시 서버 소켓을 통해 보내주게 된다. 서버 소켓의 일반적인 실행 흐름은 다음과 같다 특정 포트에서 연결을 받기 위해 서버 소켓을 생성한다. 이렇게 생성된 소켓은 클라이언트의 요청이 올때 까지 대기하게 된다.서버 소켓은 accept() 메소드를 사용하여 클라이언트의 연결을 대기한다.서버 소켓에서 InputStream / OutputStream 을 이용해 클라이언트와의 통신에 필요한 데이터를 주고 받는다.정해진 프로토콜 (..