2024.02.08

김무영·2024년 2월 13일

Network Programming

  • C/S( Client / Server ) Programming ( 통신 프로그램 )

  • java.net 패키지에서 관련 클래스들을 제공

  • network : 서로 다른 컴퓨터를 연결하기 위한 데이터 통신망

    • 인터넷 , LAN , WAN, MAN 등 여러가지 환경으로 사용될 수 있다.
  • 데이터 통신망 : 컴퓨터가 제어하는 통신망

  • NIC ( Network Interface Card ) : LAN card

    • 컴퓨터에서 네트워크를 사용하기 위해 장착하는 카드.
    • RJ-45를 사용하여 UTP Cable을 사용하여 연결.
      ( 전송하는 데이터의 양에 따라 두께가 달라진다. CAT1. CAT6 )
    • MAD주소 할당 (제조사에서 할당 - 유일 Hub에서 식별 )
    • IP 주소 할당 ( 사용자가 할당 - 네트워크에서 컴퓨터를 식별하기 위한 주소 )
  • Hub - 여러 개의 컴퓨터를 연결하고, 연결된 컴퓨터의 MAC주소로 컴퓨터를 찾기 위한 장비

  • Router - 여러 개의 Hub를 관리하고, 목적지 컴퓨터의 최단거리를 테이블로 저장하고 관리하는 일

  • Protocol - 데이터를 송,수신하기 위한 전송규약

OSI 7 Layer Reference Model

  • 개방형 시스템에서 데이터를 주고 받는 것을 이해하기 쉽도록 정의한 7가지 계층.

    • 실제 네트워크 구성은 TCP / IP 4계층 모델을 사용
  • 상위계층은 하위 계층으로 PDU( Protocol Data Unit )을 내려주고, 서비스를 요청(Service Request)한다.

  • 응용계층 ( Application Layer )

    • 사용자가 네트워크에 접속하기 위해 사용하는 프로그램.( http, ftp , telnet , ssh)
  • 표현계층 ( Presentation Layer )

    • 사용자가 입력한 값이 어떻게 변화되어 컴퓨터에 보여질 지 설정하는 계층.
    • charset encoding, 암호화 등
  • 세션계층 ( Session Layer )

    • 가상연결( 호 단위 연결 )
  • 전송계층 ( Transport Layer )

    • 실제연결 ( Protocol 사용 - TCP, UDP)
  • 네트워크계층 (Network Layer )

    • 경로 찾기 ( 길 찾기 ), Packet 시작점에서 최종 목적지까지 성공적으로 전달될 수 있도록 경로를 설정하는 일.
  • 데이터링크계층 ( Data Link Layer )

    • 데이터를 오류 없이 전송하기 위해 전송선로(media)에 link해 줄지를 설정하는 일.
  • 물리계층 ( Physical Layer )

    • 데이터를 물리적인 매체에 실제 매핑하여 보내는 일 (비트의 흐름 제어)

데이터 전송 시 장애 원인 ( Transmission Impairment )

  • Packet : 데이터를 보내기 위해 정보를 싣는 단위
  • TCP - 패킷이 1byte로 고정
  • UDP - 패킷의 크기를 개발자가 설정할 수 있다.
  • 장애원인 3가지
    • 외부에서 발생하는 큰 충격 ( 천둥 )
    • 데이터를 전송하는 회선에서 열이 발생하는 경우
    • 혼선

패킷은 일반적으로 헤더, 데이터, 트레일러로 구성

  • header - 패킷제어 정보를 가진다.

    • 출발지와 목적지의 ip주소 , 포트번호, 전송제어 정보등 포함
  • data - 실제 전송하는 정보가 포함. ( 예 : 이메일의 본문 내용, 웹 페이지의 HTML코드 )

  • trailer - 패킷의 끝에 추가되는 부분으로 패킷이 올바르게 전송되었는지 오류 검사 정보를 포함

  • TCP 프로토콜은 데이터를 네트워크 상황에 따라 MTU가 결정되는 가변적인 segment로 분할되어 전송한다.

    • segment에는 패킷에 있는 정보가 포함되어 있다.
  • MTU ( Maximum Transmission Unit )는 데이터 링크에서 전송할 수 있는 최대 크기

    • 이더넷에서는 최소 68byte 최대 1500byte로 설정된다.(Jumbo프레임 최대 9000byte가능)

java 언어에서는 OSI 7 Layer의 상위 4계층에 해당하는 코딩을 한다.

  • 쉽다.
  • 응용계층 : Application 개발 . ( JFc - Swing )
  • 표현계층 : charset ( encoding, decoding )
  • 세션계층 : 가상연결관리
  • 전송계층 : 프로토콜을 선택 ( TCP , UDP ) - Socket

TCP ( Transmission Control Protocol )

  • 전화
  • 신뢰성통신
  • 패킷의 크기가 고정되어있다. ( 1Packet은 1byte )
  • 오류 검출가능.
  • 속도가 느림
  • 데이터의 안정성이 요구되는 프로그램에서 사용 (결제, 반드시 데이터가 전달되어야 하는 경우)

UDP ( User Datagram Protocol )

  • 우편
  • 비신뢰성
  • 패킷의 크기를 개발자가 변경할 수 있다.
  • 오류 검출 불가능.
  • 속도가 빠름.
  • 속도에 민감한 프로그램 작성 (화상채팅)

java.io 패키지에서 관련 클래스를 제공

  • TCP를 구현한 클래스 : ServerSocket, Socket
    • 서버와 클라이언트의 역할이 명확하게 구분
  • UDP를 구현한 클래스 : DatagramSocket, DatagramPacket
    • 서버와 클라이언트의 역할이 명확하지 않다.
  • 사용법 )
  1. (서버) 서버 소켓 열기
    //ServerSocket server = new ServerSocket( 포트 );
    ServerSocket server = new ServerSocket ( 60000 );
  2. (클라이언트) 소켓 생성
    • 자신의 컴퓨터의 임의의 포트를 열고, 지정한 서버의 주소와 포트를 사용하여 연결을 수행
    Socket slient = new Socket ("192.168.10.xx",60000);
  3. (서버) 접속된 소켓을 받는다.
    Socket client = server.accept();
  • 클라이언트가 생성되면 3단계를(3way handshake) 거쳐 회선 확립 ( Established )을 수행
    1. 서버가 닫혀있고 클라이언트가 닫혀있음
    2. (서버)서버가 실행되면 포트가 열리고 접속자가 들어오기를 대기한다 (LISTENING 상태)
    3. (클라이언트)클라이언트가 실행되면 서버로 SYN을 보냄
    4. (서버)클라이언트의 정보를 받아 ACK보냄
    5. (클라이언트)서버의 응답을 받고 회선 확립을 수행한 후 ACK보냄
    6. (서버)클라이언트가 보내온 응답을 받고 회선 확립을 수행하고 데이터를 주고 받는다.
  • socket은 연결만 수행하고, 데이터를 주고 받는 것은 stream을 사용한다.
  • 사용법 )
    1. Com A-서버소켓을 생성
      //Com A
      ServerSocket server = new ServerSocket(60000);
    2. Com B-소켓을 생성
      //Com B ( 서버로 접속을 시도 )
      Socket client = new Socket("서버ip",60000);
    3. Com A-접속자 소켓을 받는다.
      //Com A
      Socket client = server.accept();
    4. Com A-소켓에서 출력스트림을 얻는다.
      //Com A
      DataOutputStream dos = new DataOutputStream(client.getOutputStream());
      4.1 Com B-소켓에서 출력스트림을 얻는다.
      //Com B
      DataInputStream dis = new DataInputStream(client.getInputStream());
    5. Com A-스트림에 메시지 쓰기
      //Com A
      dos.writeUTF("메시지");
    6. Com A-스트림의 내용을 목적지로 분출
      //Com A
      dos.flush();
    7. Com A-연결 끊기
      //Com A
      dos.close();
      client.close();
      server.close();
      7.1 Com B-스트림에 메시지 읽기
      //Com B
      String str = dis.readUTF();
    8. Com B-연결 끊기
      //Com B
      dis.close();
      client.close();

0개의 댓글