SlideShare a Scribd company logo
1 of 12
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]
수신 받기 위한 버퍼

More Related Content

What's hot

리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초Yu Yongwoo
 
스트리밍 프로토콜
스트리밍 프로토콜스트리밍 프로토콜
스트리밍 프로토콜greenday96
 
Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명진우 이
 
20150525 open flow1.3_ryu_sdn_link aggregation 1_김지은
20150525 open flow1.3_ryu_sdn_link aggregation 1_김지은20150525 open flow1.3_ryu_sdn_link aggregation 1_김지은
20150525 open flow1.3_ryu_sdn_link aggregation 1_김지은jieun kim
 
Icmp Attak Against Tcp
Icmp Attak Against TcpIcmp Attak Against Tcp
Icmp Attak Against Tcpxyzlee
 
파이썬+네트워크 20160210
파이썬+네트워크 20160210파이썬+네트워크 20160210
파이썬+네트워크 20160210Yong Joon Moon
 
Python Network Programming
Python Network ProgrammingPython Network Programming
Python Network ProgrammingTae Young Lee
 
Ryu with OpenFlow 1.3, Traffic Monitor
Ryu with OpenFlow 1.3, Traffic MonitorRyu with OpenFlow 1.3, Traffic Monitor
Ryu with OpenFlow 1.3, Traffic Monitorjieun kim
 
Cse342 chapter 04
Cse342 chapter 04Cse342 chapter 04
Cse342 chapter 04Jinil Nam
 
150416 OpenStack Networking with Neutron Jieun, Kim
150416 OpenStack Networking with Neutron Jieun, Kim150416 OpenStack Networking with Neutron Jieun, Kim
150416 OpenStack Networking with Neutron Jieun, Kimjieun kim
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io modelNam Hyeonuk
 
grade server - block socket
grade server - block socketgrade server - block socket
grade server - block socketGyuhyeon Nam
 
비디오 코덱
비디오 코덱비디오 코덱
비디오 코덱greenday96
 
ACL - cisco 2811 router
ACL - cisco 2811 router ACL - cisco 2811 router
ACL - cisco 2811 router 준기 홍
 
Python socket programming
Python socket programmingPython socket programming
Python socket programmingTae Young Lee
 
Jnetpcap quickguide
Jnetpcap quickguideJnetpcap quickguide
Jnetpcap quickguideSukjin Yun
 
Netmanias L2,L3 Training (3) L2, L3 QoS
Netmanias L2,L3 Training (3) L2, L3 QoSNetmanias L2,L3 Training (3) L2, L3 QoS
Netmanias L2,L3 Training (3) L2, L3 QoSChris Changmo Yoo
 

What's hot (20)

리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초
 
스트리밍 프로토콜
스트리밍 프로토콜스트리밍 프로토콜
스트리밍 프로토콜
 
Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명
 
TCP/IP
TCP/IPTCP/IP
TCP/IP
 
20150525 open flow1.3_ryu_sdn_link aggregation 1_김지은
20150525 open flow1.3_ryu_sdn_link aggregation 1_김지은20150525 open flow1.3_ryu_sdn_link aggregation 1_김지은
20150525 open flow1.3_ryu_sdn_link aggregation 1_김지은
 
Icmp Attak Against Tcp
Icmp Attak Against TcpIcmp Attak Against Tcp
Icmp Attak Against Tcp
 
파이썬+네트워크 20160210
파이썬+네트워크 20160210파이썬+네트워크 20160210
파이썬+네트워크 20160210
 
Python Network Programming
Python Network ProgrammingPython Network Programming
Python Network Programming
 
Ryu with OpenFlow 1.3, Traffic Monitor
Ryu with OpenFlow 1.3, Traffic MonitorRyu with OpenFlow 1.3, Traffic Monitor
Ryu with OpenFlow 1.3, Traffic Monitor
 
Cse342 chapter 04
Cse342 chapter 04Cse342 chapter 04
Cse342 chapter 04
 
150416 OpenStack Networking with Neutron Jieun, Kim
150416 OpenStack Networking with Neutron Jieun, Kim150416 OpenStack Networking with Neutron Jieun, Kim
150416 OpenStack Networking with Neutron Jieun, Kim
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io model
 
grade server - block socket
grade server - block socketgrade server - block socket
grade server - block socket
 
비디오 코덱
비디오 코덱비디오 코덱
비디오 코덱
 
ACL - cisco 2811 router
ACL - cisco 2811 router ACL - cisco 2811 router
ACL - cisco 2811 router
 
Python socket programming
Python socket programmingPython socket programming
Python socket programming
 
Jnetpcap quickguide
Jnetpcap quickguideJnetpcap quickguide
Jnetpcap quickguide
 
퀴즈요약
퀴즈요약퀴즈요약
퀴즈요약
 
Tcpdump
TcpdumpTcpdump
Tcpdump
 
Netmanias L2,L3 Training (3) L2, L3 QoS
Netmanias L2,L3 Training (3) L2, L3 QoSNetmanias L2,L3 Training (3) L2, L3 QoS
Netmanias L2,L3 Training (3) L2, L3 QoS
 

Similar to TCP/IP Protocol - JAVA

[NodeJS] - NET 모듈 소개
[NodeJS] - NET 모듈 소개[NodeJS] - NET 모듈 소개
[NodeJS] - NET 모듈 소개문학청년
 
HeadFisrt Servlet&JSP Chapter 1
HeadFisrt Servlet&JSP Chapter 1HeadFisrt Servlet&JSP Chapter 1
HeadFisrt Servlet&JSP Chapter 1J B
 
Servlet&jsp 1장
Servlet&jsp 1장Servlet&jsp 1장
Servlet&jsp 1장JeongBong Kim
 
ChainHero web application hyperledger fabric analysis v 1.0
ChainHero web application hyperledger fabric analysis v 1.0ChainHero web application hyperledger fabric analysis v 1.0
ChainHero web application hyperledger fabric analysis v 1.0병준 김
 
Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편준철 박
 
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요dgmit2009
 
Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본ssuser0c2478
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPSeungmo Koo
 
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Python으로 채팅 구현하기
Python으로 채팅 구현하기Python으로 채팅 구현하기
Python으로 채팅 구현하기Tae Young Lee
 
웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD활 김
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기흥배 최
 
Network programming report
Network programming reportNetwork programming report
Network programming reportJongwon
 
세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발Jay JH Park
 
Block chain architecture and hyperledger fabric overview
Block chain architecture and hyperledger fabric overviewBlock chain architecture and hyperledger fabric overview
Block chain architecture and hyperledger fabric overview병준 김
 
Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Sung-jae Park
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Esun Kim
 
Proxy pattern
Proxy patternProxy pattern
Proxy patternscor7910
 

Similar to TCP/IP Protocol - JAVA (20)

[NodeJS] - NET 모듈 소개
[NodeJS] - NET 모듈 소개[NodeJS] - NET 모듈 소개
[NodeJS] - NET 모듈 소개
 
HeadFisrt Servlet&JSP Chapter 1
HeadFisrt Servlet&JSP Chapter 1HeadFisrt Servlet&JSP Chapter 1
HeadFisrt Servlet&JSP Chapter 1
 
Servlet&jsp 1장
Servlet&jsp 1장Servlet&jsp 1장
Servlet&jsp 1장
 
ChainHero web application hyperledger fabric analysis v 1.0
ChainHero web application hyperledger fabric analysis v 1.0ChainHero web application hyperledger fabric analysis v 1.0
ChainHero web application hyperledger fabric analysis v 1.0
 
Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편
 
pkcserver
pkcserverpkcserver
pkcserver
 
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
 
Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
 
Python으로 채팅 구현하기
Python으로 채팅 구현하기Python으로 채팅 구현하기
Python으로 채팅 구현하기
 
웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
Network programming report
Network programming reportNetwork programming report
Network programming report
 
세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발
 
Block chain architecture and hyperledger fabric overview
Block chain architecture and hyperledger fabric overviewBlock chain architecture and hyperledger fabric overview
Block chain architecture and hyperledger fabric overview
 
Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Implementing remote procedure calls rev2
Implementing remote procedure calls rev2
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
 
Proxy pattern
Proxy patternProxy pattern
Proxy pattern
 

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() 메소드를 호출하면 파라미터로 넘겨준 문자열이 바이트 스트림으로 변환되어 네트워크 로 전송