TCP/IP Protocol
제작자 : 쿠디(cooddy)
제작자 Blog :
Tistory Blog : http://cooddy.tistory.com/
TCP/IP Protocol
• 프로토콜(Protocol) : 통신 규칙
• 현재 TCP/IP Protocol이 주류
• TCP/IP Protocol이란?
• TCP/IP Protocol이란 TCP프로토콜 + IP프로토콜을 함께 부르는 용어
• IP 프로토콜은 네트워크에 연결된 개개의 컴퓨터에 유일한 주소를 붙이는 규칙을 정의한 프로토콜
• IP 프로토콜에 의해 컴퓨터에 붙여지는 주소를 IP 주소(IP address)라고 함
• IP주소는 인터넷 통신 서비스 회사에 비용을 지불하고 할당
• 집에서 개인적으로 인터넷 통신 서비스에 가입할 때는 보통 하나의 IP 주소를 할당
• IP주소 확인을 위해서는 윈도우의 경우 cmd 창에서 “ipconfig” 를 치면 나옴
• IP주소
• 고정IP주소 : 컴퓨터 재부팅해도 항상 같은 IP주소가 나옴
• 유동IP주소 : 컴퓨터를 재부팅하면 다른 IP주소가 나옴
• IP주소는 컴퓨터들을 유일하게 식별하기 때문에 통신 프로그램이 대상 컴퓨터를 찾을 때 IP주소를 이용
• But, 통신 프로그램이 실질적으로 데이터를 교환하는 대상은 컴퓨터가 아닌 프로그램이기 때
문에, 네트워크 통신을 하기 위해서는 상대 컴퓨터에서 작동 중인 여러 프로그램들 중 하나를
식별해야 함
•  식별은 OS에서 관리하는 포트(Port)를 통해 가능
TCP/IP Protocol
• 포트(Port)란?
• 네트워크를 통해 데이터를 주고받는 가상의 출입구
• TCP/IP를 지원하는 OS에서는 포트마다 번호를 붙여서 관리
• 번호는 0~65535범위
• IP 주소와 함께 포트번호를 사용하면 통신할 컴퓨터의 프로그램을 찾을 수 있음
• 같은 포트를 여러 프로그램이 사용하려고 하면 안 됨
• 통신 프로그램을 작성할 때는 다른 프로그램이 사용하고 있는 포트 번호를 확인
• 포트번호 확인법
• OS에서 ‘netstat’ 명령을 실행해서 확인
• 주의점
• 0~1023 까지는 시스템이 사용하는 포트번호
• 1024 이상의 포트 번호 중 하나를 선택해야 함
• 도메인(Domain)
• 숫자로 구성된 IP주소는 기억이 어렵기 때문에 도메인 이름을 등록해서 IP 주소 대신 사용하기도 함
• 이런 이름은 도메인을 관리하는 공인 기관에 대가를 지불하고 등록 해야 함
TCP/IP Protocol을 이용한 데이터 교환
• TCP/IP 프로토콜로 통신하는 두 프로그램은 데이터 교환전에 먼저 연결(Connection)을 맺어야 함
• 연결을 맺기 위해선 한 프로그램은 포트를 열어놓고 연결 요청이 오기를 기다려야 함  서버 프로그램
• 그리고 다른 프로그램은 그 포트로 연결 요청을 보내야 함  클라이언트 프로그램
클라이언트
프로그램
서버
프로그램
1) 포트를 열어놓고
연결 요청이 들어오기를 기다림
2) 서버에게 연결 요청
포
트
포
트
3) 연결이 맺어지면 연결 통로를 통해
데이터를 주고받을 수 있음
TCP/IP 통신 프로그램의 작성 방법
• 서버와 클라이언트는 연결을 맺을 때도 포트를 사용해야 하고, 데이터를 교환 시에도 포트를 사
용해야 함
• But, 포트는 운영체제 관점에서 보았을 때 데이터 통신 출입구이고, 프로그램 안에서는 직접 사용
할 수 없음
• JAVA 프로그램에서는 포트 사용을 위해 소켓(Socket)을 사용
• 클라이언트 소켓 & 서버 소켓
• 서버소켓
• 서버 프로그램에서만 사용되는 소켓
• 이 소켓은 포트를 통해 연결 요청이 오기를 기다리다가, 연결 요청이 오면 클라이언트와 연결을 맺고 또 다른 소켓(클라이언트 소켓)을 만듬
• 실제로 데이터 전송에 사용되는 것은 이 새롭게 만들어진 소켓(클라이언트 소켓)임
• 클라이언트 소켓
• 서버 프로그램으로 연결 요청을 하는 일과 데이터 전송을 하는 일을 둘 다 함
TCP/IP 통신 프로그램의 작성 방법
클라이언트
프로그램
서버
프로그램
1) 서버 소켓을 통해
연결 요청이 들어오기를 기다림
2) 서버에게 연결 요청
포
트
포
트
소
켓
서버
소켓
클라이언트
프로그램
서버
프로그램
3) 서버 프로그램은 서버 소켓이 만든
소켓을 통해 데이터를 주고 받음
4) 클라이언트 프로그램은 연결 요청에 사용한
소켓을 통해 데이터를 주고 받음
포
트
포
트
소
켓
서버
소켓 소
켓
소켓을 이용한 클라이언트 프로그램과 서버 프로그램의 통신 과정
클라이언트/서버 프로그램의 작성
• 서버 소켓과 클라이언트 소켓은 자바 프로그램 안에서 모두 객체로 표현
• 서버 소켓 : java.net Package에 있는 ServerSocket 클래스
• 클라이언트 소켓 : java.net Package에 있는 Socket 클래스
• 서버 소켓을 생성하고 사용하는 방법
• 서버 소켓을 생성할 때는 생성자 파라미터로 포트 번호를 넘겨주어야 함
• 이때 넘겨주는 포트 번호는 다른 프로그램이 사용하지 않는 포트 번호라야 함
• ServerSocket serverSocket = new ServerSocket(9000);
• accept() 함수
• ServerSocket 객체의 함수, 클라이언트로부터 연결 요청이 오기를 기다리는 기능
• Socket socket = serverSocket.accept();
• accept 함수는 포트를 열어두고 연결 요청이 오기를 기다리다가, 연결 요청이 들어오면 클라이언트 프로그램과 연결을 맺고 그 후 그 결과를 가지고 클라
이언트 소켓을 생성하여 리턴
포트 번호
서버 소켓으로 연결 요청이 들어오면 연결을 맺고,
클라이언트 소켓을 생성해서 리턴하는 함수
클라이언트/서버 프로그램의 작성
• 클라이언트 소켓을 생성하고 사용하는 방법
• Socket 클래스의 생성자를 이용하여 클라이언트 소켓을 직접 생성해야 함
• 파라미터(인자)로는 서버 프로그램이 있는 컴퓨터의 IP주소와 포트 번호를 넘겨주어야 함
• Socket socket = new Socket(“219.153.21.14”, 9000);
• Socket 클래스의 생성자를 호출하면 이 생성자 안에서 서버 프로그램으로 연결 요청이 전송되고, 그 결과 클라이언트
프로그램과 서버 프로그램의 연결이 맺어짐
• 클라이언트와 서버 프로그램은 소켓을 생성하는 방법은 다르지만, 일단 클라이언트 소켓이 생성
되고 난 다음에 그 소켓을 가지고 데이터를 주고받는 방법은 동일
• ※ 클라이언트 소켓을 생성할 때는 클라이언트 프로그램이 사용할 포트 번호를 넘겨줄 필요 없음
• 클라이언트 소켓이 생성되는 과정에서 OS로부터 사용되지 않는 포트 번호를 자동으로 할당받기 때문
서버 프로그램이 열어 놓은 포트 번호
서버 프로그램이 있는 컴퓨터 IP 주소
InputStream/OutputStream
• getInputStream()/getOutputStream()
• getInputStream() : 메시지 수신에 사용할 입력 스트림 리턴(InputStream을 가져오는(get) 함수)
• InputStream in = socket.getInputStream();
• getOutputStream() : 메시지 송신에 사용할 출력 스트림 리턴(OutputStream을 가져오는(get) 함수)
• OutputStream out = socket.getOutputStream();
• out.write(data);  파라미터로 넘겨준 데이터를 송신
• int data = in.read();  수신된 데이터를 읽어서 리턴
• close() 함수 : 데이터의 전송을 모두 마친 다음에는 클라이언트 소켓을 닫아야 함
• socket.close();
• serverSocket.close();  서버 소켓도 마찬가지로 close 함수를 호출해서 닫을 수 있음
• ※ 소켓을 사용하고 나서 닫지 않으면, 운영체제로부터 할당받은 포트번호가 해제되지 않기 때문
에 다른 프로그램이 그 포트 번호를 사용할 수 없는 상태로 남아 있게 됨
클라이언트/서버 프로그램 작성하기
TCP/IP 프로토콜에서는 데이터 전송의 기본 단위가 바이트이기 때문에, 문자 데이터를 전송하기 위해
송신할 문자를 바이트 타입으로 바꾸고, 수신된 바이트를 문자 타입으로 바꾸는 과정이 필요
InputStreamReader/OutputStreamReader Class(java.io)
• InputStreamReader/OutputStreamReader
• 앞에서 송신 할 때 문자열을 바이트 배열로 치환하고 수신할 때 바이트 배열을 문자열로 치환 하였음
• 이를 자동으로 해주는 클래스가 바로 InputStreamReader/OutputStreamReader
• InputStreamReader Class
• 입력된 바이트 스트림을 문자 스트림으로 바꿔주는 클래스
• 생성자에 소켓으로 부터 얻은 InputStream 객체를 넘겨주면, 네트워크로 수신된 데이터를 문자 스트림 형태로 읽을
수 있는 InputStreamReader 객체가 생성(데이터 배열  문자열)
• InputStreamReader reader = new InputStreamReader(InputStream 객체);
• OutputStreamReader Class
• 문자열  바이트 배열로 바꿔주는 클래스
• But, 출력하는 데이터가 주로 문자열일 경우  PrintWriter 클래스를 사용하는 것이 더욱 편리
• PrinterWriter writer = new PrinterWriter(OutputStream 객체);
• 이렇게 생성한 PrintWriter객체를 가지고 println(), print(), printf() 메소드를 호출하면 파라미터로 넘겨준 문자열이 바이트 스트림으로 변환되어 네트워크
로 전송
InputStreamReader/OutputStreamReader Class(java.io)
• [CODE]
[Client] [Server]
수신 받기 위한 버퍼

TCP/IP Protocol - JAVA

  • 1.
    TCP/IP Protocol 제작자 :쿠디(cooddy) 제작자 Blog : Tistory Blog : http://cooddy.tistory.com/
  • 2.
    TCP/IP Protocol • 프로토콜(Protocol): 통신 규칙 • 현재 TCP/IP Protocol이 주류 • TCP/IP Protocol이란? • TCP/IP Protocol이란 TCP프로토콜 + IP프로토콜을 함께 부르는 용어 • IP 프로토콜은 네트워크에 연결된 개개의 컴퓨터에 유일한 주소를 붙이는 규칙을 정의한 프로토콜 • IP 프로토콜에 의해 컴퓨터에 붙여지는 주소를 IP 주소(IP address)라고 함 • IP주소는 인터넷 통신 서비스 회사에 비용을 지불하고 할당 • 집에서 개인적으로 인터넷 통신 서비스에 가입할 때는 보통 하나의 IP 주소를 할당 • IP주소 확인을 위해서는 윈도우의 경우 cmd 창에서 “ipconfig” 를 치면 나옴 • IP주소 • 고정IP주소 : 컴퓨터 재부팅해도 항상 같은 IP주소가 나옴 • 유동IP주소 : 컴퓨터를 재부팅하면 다른 IP주소가 나옴 • IP주소는 컴퓨터들을 유일하게 식별하기 때문에 통신 프로그램이 대상 컴퓨터를 찾을 때 IP주소를 이용 • But, 통신 프로그램이 실질적으로 데이터를 교환하는 대상은 컴퓨터가 아닌 프로그램이기 때 문에, 네트워크 통신을 하기 위해서는 상대 컴퓨터에서 작동 중인 여러 프로그램들 중 하나를 식별해야 함 •  식별은 OS에서 관리하는 포트(Port)를 통해 가능
  • 3.
    TCP/IP Protocol • 포트(Port)란? •네트워크를 통해 데이터를 주고받는 가상의 출입구 • TCP/IP를 지원하는 OS에서는 포트마다 번호를 붙여서 관리 • 번호는 0~65535범위 • IP 주소와 함께 포트번호를 사용하면 통신할 컴퓨터의 프로그램을 찾을 수 있음 • 같은 포트를 여러 프로그램이 사용하려고 하면 안 됨 • 통신 프로그램을 작성할 때는 다른 프로그램이 사용하고 있는 포트 번호를 확인 • 포트번호 확인법 • OS에서 ‘netstat’ 명령을 실행해서 확인 • 주의점 • 0~1023 까지는 시스템이 사용하는 포트번호 • 1024 이상의 포트 번호 중 하나를 선택해야 함 • 도메인(Domain) • 숫자로 구성된 IP주소는 기억이 어렵기 때문에 도메인 이름을 등록해서 IP 주소 대신 사용하기도 함 • 이런 이름은 도메인을 관리하는 공인 기관에 대가를 지불하고 등록 해야 함
  • 4.
    TCP/IP Protocol을 이용한데이터 교환 • TCP/IP 프로토콜로 통신하는 두 프로그램은 데이터 교환전에 먼저 연결(Connection)을 맺어야 함 • 연결을 맺기 위해선 한 프로그램은 포트를 열어놓고 연결 요청이 오기를 기다려야 함  서버 프로그램 • 그리고 다른 프로그램은 그 포트로 연결 요청을 보내야 함  클라이언트 프로그램 클라이언트 프로그램 서버 프로그램 1) 포트를 열어놓고 연결 요청이 들어오기를 기다림 2) 서버에게 연결 요청 포 트 포 트 3) 연결이 맺어지면 연결 통로를 통해 데이터를 주고받을 수 있음
  • 5.
    TCP/IP 통신 프로그램의작성 방법 • 서버와 클라이언트는 연결을 맺을 때도 포트를 사용해야 하고, 데이터를 교환 시에도 포트를 사 용해야 함 • But, 포트는 운영체제 관점에서 보았을 때 데이터 통신 출입구이고, 프로그램 안에서는 직접 사용 할 수 없음 • JAVA 프로그램에서는 포트 사용을 위해 소켓(Socket)을 사용 • 클라이언트 소켓 & 서버 소켓 • 서버소켓 • 서버 프로그램에서만 사용되는 소켓 • 이 소켓은 포트를 통해 연결 요청이 오기를 기다리다가, 연결 요청이 오면 클라이언트와 연결을 맺고 또 다른 소켓(클라이언트 소켓)을 만듬 • 실제로 데이터 전송에 사용되는 것은 이 새롭게 만들어진 소켓(클라이언트 소켓)임 • 클라이언트 소켓 • 서버 프로그램으로 연결 요청을 하는 일과 데이터 전송을 하는 일을 둘 다 함
  • 6.
    TCP/IP 통신 프로그램의작성 방법 클라이언트 프로그램 서버 프로그램 1) 서버 소켓을 통해 연결 요청이 들어오기를 기다림 2) 서버에게 연결 요청 포 트 포 트 소 켓 서버 소켓 클라이언트 프로그램 서버 프로그램 3) 서버 프로그램은 서버 소켓이 만든 소켓을 통해 데이터를 주고 받음 4) 클라이언트 프로그램은 연결 요청에 사용한 소켓을 통해 데이터를 주고 받음 포 트 포 트 소 켓 서버 소켓 소 켓 소켓을 이용한 클라이언트 프로그램과 서버 프로그램의 통신 과정
  • 7.
    클라이언트/서버 프로그램의 작성 •서버 소켓과 클라이언트 소켓은 자바 프로그램 안에서 모두 객체로 표현 • 서버 소켓 : java.net Package에 있는 ServerSocket 클래스 • 클라이언트 소켓 : java.net Package에 있는 Socket 클래스 • 서버 소켓을 생성하고 사용하는 방법 • 서버 소켓을 생성할 때는 생성자 파라미터로 포트 번호를 넘겨주어야 함 • 이때 넘겨주는 포트 번호는 다른 프로그램이 사용하지 않는 포트 번호라야 함 • ServerSocket serverSocket = new ServerSocket(9000); • accept() 함수 • ServerSocket 객체의 함수, 클라이언트로부터 연결 요청이 오기를 기다리는 기능 • Socket socket = serverSocket.accept(); • accept 함수는 포트를 열어두고 연결 요청이 오기를 기다리다가, 연결 요청이 들어오면 클라이언트 프로그램과 연결을 맺고 그 후 그 결과를 가지고 클라 이언트 소켓을 생성하여 리턴 포트 번호 서버 소켓으로 연결 요청이 들어오면 연결을 맺고, 클라이언트 소켓을 생성해서 리턴하는 함수
  • 8.
    클라이언트/서버 프로그램의 작성 •클라이언트 소켓을 생성하고 사용하는 방법 • Socket 클래스의 생성자를 이용하여 클라이언트 소켓을 직접 생성해야 함 • 파라미터(인자)로는 서버 프로그램이 있는 컴퓨터의 IP주소와 포트 번호를 넘겨주어야 함 • Socket socket = new Socket(“219.153.21.14”, 9000); • Socket 클래스의 생성자를 호출하면 이 생성자 안에서 서버 프로그램으로 연결 요청이 전송되고, 그 결과 클라이언트 프로그램과 서버 프로그램의 연결이 맺어짐 • 클라이언트와 서버 프로그램은 소켓을 생성하는 방법은 다르지만, 일단 클라이언트 소켓이 생성 되고 난 다음에 그 소켓을 가지고 데이터를 주고받는 방법은 동일 • ※ 클라이언트 소켓을 생성할 때는 클라이언트 프로그램이 사용할 포트 번호를 넘겨줄 필요 없음 • 클라이언트 소켓이 생성되는 과정에서 OS로부터 사용되지 않는 포트 번호를 자동으로 할당받기 때문 서버 프로그램이 열어 놓은 포트 번호 서버 프로그램이 있는 컴퓨터 IP 주소
  • 9.
    InputStream/OutputStream • getInputStream()/getOutputStream() • getInputStream(): 메시지 수신에 사용할 입력 스트림 리턴(InputStream을 가져오는(get) 함수) • InputStream in = socket.getInputStream(); • getOutputStream() : 메시지 송신에 사용할 출력 스트림 리턴(OutputStream을 가져오는(get) 함수) • OutputStream out = socket.getOutputStream(); • out.write(data);  파라미터로 넘겨준 데이터를 송신 • int data = in.read();  수신된 데이터를 읽어서 리턴 • close() 함수 : 데이터의 전송을 모두 마친 다음에는 클라이언트 소켓을 닫아야 함 • socket.close(); • serverSocket.close();  서버 소켓도 마찬가지로 close 함수를 호출해서 닫을 수 있음 • ※ 소켓을 사용하고 나서 닫지 않으면, 운영체제로부터 할당받은 포트번호가 해제되지 않기 때문 에 다른 프로그램이 그 포트 번호를 사용할 수 없는 상태로 남아 있게 됨
  • 10.
    클라이언트/서버 프로그램 작성하기 TCP/IP프로토콜에서는 데이터 전송의 기본 단위가 바이트이기 때문에, 문자 데이터를 전송하기 위해 송신할 문자를 바이트 타입으로 바꾸고, 수신된 바이트를 문자 타입으로 바꾸는 과정이 필요
  • 11.
    InputStreamReader/OutputStreamReader Class(java.io) • InputStreamReader/OutputStreamReader •앞에서 송신 할 때 문자열을 바이트 배열로 치환하고 수신할 때 바이트 배열을 문자열로 치환 하였음 • 이를 자동으로 해주는 클래스가 바로 InputStreamReader/OutputStreamReader • InputStreamReader Class • 입력된 바이트 스트림을 문자 스트림으로 바꿔주는 클래스 • 생성자에 소켓으로 부터 얻은 InputStream 객체를 넘겨주면, 네트워크로 수신된 데이터를 문자 스트림 형태로 읽을 수 있는 InputStreamReader 객체가 생성(데이터 배열  문자열) • InputStreamReader reader = new InputStreamReader(InputStream 객체); • OutputStreamReader Class • 문자열  바이트 배열로 바꿔주는 클래스 • But, 출력하는 데이터가 주로 문자열일 경우  PrintWriter 클래스를 사용하는 것이 더욱 편리 • PrinterWriter writer = new PrinterWriter(OutputStream 객체); • 이렇게 생성한 PrintWriter객체를 가지고 println(), print(), printf() 메소드를 호출하면 파라미터로 넘겨준 문자열이 바이트 스트림으로 변환되어 네트워크 로 전송
  • 12.