본문 바로가기
카테고리 없음

[Network Programming] TCP/IP Protocal & Socket

by winter_sunshine 2023. 11. 1.

※   TCP/IP 프로토콜

  • TCPTransmission Control Protocol
  • 두 시스템 간에 신뢰성 있는 데이터의 전송을 관장하는 프로토콜
    • 프로토콜:  통신할 때 사용하는 약속
      • 예) 무전기의 ‘오버’
      • 동시에 두 사람이 같이 말할 수 없다. 등  규칙이 필요
  • TCP에서 동작하는 응용프로그램 사례
    •  e-mail, FTP, 웹(HTTP)

※   IP

  • Internet Protocol
  • 패킷 교환 네트워크에서 송신 호스트수신 호스트데이터를 주고 받는 것을 관장 하는 프로토콜
  • TCP보다 하위 레벨 프로토콜

 

=>  이와 같이 통신기기 환경의 특성에 따라 대화자 간에 약속을 정한 것프로토콜

      인터넷에 연결된 컴퓨터 간 에는 TCP/IP라는 프로토콜 사용, 대표적인 것으로 http, ftp 모두 TCP/IP를 기반으로 하는          프로토콜

 

※ TCP/IP : 송신자가 수신자에게 IP 주소를 사용하여 데이터를 전달하고 그 데이터가 제대로 갔는지, 너무 빠르지는 않는지, 제대로 받았다고 연락은 오는지에 대한 이야기를 하는 것

 

 

※  프로토콜(Protocal)

  • 프로토콜(Protocol)은 컴퓨터 간에 상호통신을 할 때 데이터를 원활하고 신뢰성 있게 주고 받기 위해 필요한 약속을 규정하는 것

 

※  IP 주소

  • 네트워크 상에서 유일하게 식별될 수 있는 컴퓨터 주소
    • 숫자로 구성된 주소
    • 4개의 숫자가 '.' 으로 연결
      • ex)  127.0.0.1
  • 숫자로 된 주소는 기억하기 어려우므로 www.naver.com과 같은 문자열로 구성된 도메인 이름으로 바꿔 사용
    • DNS(Domain Name System) 서버
      • => 문자열로 구성된 도메인 이름을 숫자로 구성된 IP 주소로 자동 변환
  • 현재는 32비트의 IP 버전 4  IPv4 가 사용되고 있음
    • IP 주소 고갈로 인해 128비트의 IP 버전 6  IPv6이 점점 사용되는 추세

 

※  포트(Port)

  • 통신하는 프로그램 간에 가상의 연결단  포트 생성
    • IP 주소는 네트워크 상의 컴퓨터 또는 시스템을 식별하는 주소
    • 포트 번호를 이용하여 통신할 응용프로그램 식별
  • 모든 응용프로그램은 하나 이상의 포트 생성 가능
    • 포트를 이용하여 상대방 응용프로그램과 데이터 교환
  • 잘 알려진 포트(well-known ports)
    • 시스템이 사용하는 포트 번호
    • 잘 알려진 응용프로그램에서 사용하는 포트 번호
      • " 0 ~ 1023 " 사이의 포트 번호
      • ex) FTP  21, SSH  22  HTTP  80,  HTTPS  443
    • 잘 알려진 포트 번호는 개발자가 사용하지 않는 것이 좋음
      • (0부터 1023 사이의 포트 번호를 제외한 나머지 ~ 65535까지의 포트 사용)
      • 충돌 가능성 있음

 

※  소켓 프로그래밍

  • 소켓 (socket)
    • TCP/IP 네트워크를 이용하여 쉽게 통신 프로그램을 작성하도록 지원하는 기반 기술
    • 두 응용프로그램 간의 양방향 통신 링크의 한쪽
    • 소켓끼리 데이터를 주고받음
    • 소켓은 특정 IP 포트 번호와 결합
    • 자바는 소켓 통신할 수 있는 라이브러리 지원
  • 소켓 종류
    • 서버 소켓
    • 클라이언트 소켓

 

 

※  소켓을 이용한 웹 서버와 클라이언트 사이의 통신 사례

 

※  소켓을 이용한 서버 클라이언트 통신 프로그램의 전형적인 구조

 

 

※  Socket 클래스:  클라이언트 소켓

  • Socket 클래스
    • 클라이언트 소켓에 사용되는 클래스
    • java.net 패키지에 포함

     생성자)

※  Socket 클래스의 메소드

 

※  클라이언트에서 소켓으로  서버에 접속하는 코드

  • 클라이언트 소켓 생성서버에 접속
    • Socket clientSocket = new Socket("128.12.1.1", 5550);
      • =>  Socket 객체가 생성되면 곧 바로 128.12.1.1의 주소의 5550포트에 자동 접속
  • 소켓으로부터 데이터를 전송할 입출력 스트림 생성
    • BufferedReader in = new BufferedReader( new InputStreamReader(clientSocket.getInputStream()));
    • BufferedWriter out = new BufferedWriter( new OutputStreamWriter(clientSocket.getOutputStream()));
  • 서버로 데이터 전송
    • flush()를 호출하면 스트림 속에 데이터를 남기지 않고 모두 전송
    • out.write("hello"+"\n");
    • out.flush();
  • 서버로부터 데이터 수신
    • String line = in.readline();  //서버로부터 한 행의 문자열 수신
  • 네트워크 접속 종료
    • clientSocket.close();

 

※  ServerSocket 클래스:  서버 소켓

  • 서버 소켓에 사용되는 클래스
  • java.net 패키지에 포함

   생성자)

   함수)

 

 

※  서버에 클라이언트가 연결되는 과정

  • 서버는 서버 소켓으로 들어오는 연결 요청을 기다림(listen)
  • 클라이언트가 서버에게 연결 요청
  • 서버가 연결 요청 수락(accept)
    • 새로운 클라이언트 소켓을 만들어 클라이언트와 통신하게 함
    • 그리고 다시 다른 클라이언트의 연결을 기다림

 

※  서버가 클라이언트와 통신하는 과정

  • 서버 소켓 생성
    • ServerSocket serverSocket = new ServerSocket(5550);
      • =>  서버는 접속을 기다리는 포트로 5550 선택
  • 클라이언트로부터 접속 기다림
    • Socket socket = serverSocket.accept();
      • accept() 메소드는 연결 요청이 오면 새로운 Socket 객체 반환
      • 접속 후 새로 만들어진 Socket 객체를 통해 클라이언트와 통신
  • 네트워크 입출력 스트림 생성
    • BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); BufferedWriter out = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream()));
      • Socket 객체의 getInputStream()getOutputStream() 메소드를 이용하여 입출력 데이터 스트림 생성

 

※  스트림

  • 스트림 입출력
    • 버퍼를 가지고 순차적으로 이루어지는 입출력
  • 자바의 입출력 스트림
    • 응용프로그램과 입출력 장치를 연결하는 소프트웨어 모듈
      • 입력 스트림 : 입력 장치로부터 자바 프로그램으로 데이터를 전달
      • 출력 스트림 : 출력 장치로 데이터 출력

 

※  자바의 입출력 스트림  특징

  • 스트림의 양끝에 입출력장치와 자바 응용프로그램 연결
  • 스트림은 단방향
    • 입력과 출력을 동시에 하는 스트림 없음
  • 입출력 스트림 기본 단위
    • 바이트 스트림의 경우 : 바이트
    • 문자 스트림의 경우 : 문자  (자바에서는 문자1개 : 2바이트)
  • 선입선출 구조 (FIFO)

 

※  자바의 입출력 스트림  종류

  • 바이트 스트림
    • 입출력되는 데이터를 단순 바이트로 처리
  • 문자 스트림
    • 문자만 입출력하는 스트림
    • 문자가 아닌 바이너리 데이터는 스트림에서 처리하지 못함
  • JDK는 입출력 스트림을 구현한 다양한 클래스 제공

 

※  JDK의 바이트 스트림 클래스 계층 구조

  • 최상위 클래스는 InputStream, OutputStream
  • 클래스 이름이 공통적으로 Stream으로 끝남

 

※  JDK의 문자 스트림 클래스 계층 구조

  • 최상위 클래스는 Reader, Writer
  • 클래스 이름이 공통적으로 Reader/Writer로 끝남

 

※  스트림은 연결될 수 있다

  • 표준 입력 스트림 System.in InputStreamReader 스트림을 연결한 사례
    • InputStreamReader rd = new InputStreamReader(System.in);
    • int c = rd.read(); // 키보드에서 문자 읽음
    • System.in도 InputStream 클래스의 객체

 

※  문자 스트림

  • 유니 코드(2바이트) 문자를 입출력 하는 스트림
    • 문자로 표현되지 않는 데이터는 다루지 못함
    • 이미지, 동영상과 같은 바이너리 데이터는 입출력 할 수 없음
  • 문자 스트림을 다루는 클래스
    • Reader/Writer
    • InputStreamReader/OutputStreamWriter
    • FileReader/FileWriter
      • 텍스트 파일에서 문자 데이터 입출력