이롭게 현명하게

[JAVA] TCP,UDP,포트,소켓 본문

JAVA

[JAVA] TCP,UDP,포트,소켓

dev_y.h 2023. 1. 13. 18:36
728x90
반응형

※본 포스팅은 윈도우 11, Eclipse 환경을 바탕으로 작성되었습니다.

 


목차

프로토콜(Protocol)

TCP(Transmission Control Protocol)

UDP(User Datagram Protocol)

포트(Port)

소켓(Socket)

소켓 예제


 


[프로토콜(Protocol)]

한국어를 사용할 수 있는 사람과 스페인어를 사용할 수 있는 사람이 있다.

이 두 사람이 대화를 하기 위해서는 서로 알고 있는 동일한 언어를 사용할 때만 의사소통이 가능하다.

 

 

컴퓨터도 동일하다. 컴퓨터들끼리 데이터를 주고받기 위해서는 어떠한 규칙이 필요하다.

이것을 프로토콜(Protocol)이라고 한다.

프로토콜은 컴퓨터들 간에 상호통신을 할 때 데이터를 원활하고 신뢰성 있게 주고받기 위해 필요한 약속을 규정하는 것이다. 프로토콜에는 정보의 교환 형식과 송수신 방법 등을 규정하는 규칙이 있다. 만약 같은 프로토콜을 사용한다면 컴퓨터의 기종이 달라도 컴퓨터 상호 간에 통신이 가능하고, 데이터의 의미를 일치시켜 원하는 동작을 시킬 수 있게 한다.

네트워크 구조에서는 통신을 원하는 두 컴퓨터 사이를 무엇을, 어떻게 언제 통신할 것인가를 서로 약속한 규약이다.

 

A가 B와 통화를 하길 원한다. 아주 짧고 간단한 동작에서 몇 가지의 과정을 거치게 된다.

A는 전화기를 손에 들고 전화번호를 입력 후 B가 전화를 받을 때까지 기다리다 B가 전화를 받으면 통화가 시작된다.

통화가 끝나면 전화기를 내려놓는다.

 

 

컴퓨터도 마찬가지이다. 컴퓨터끼리 데이터를 주고받기 위해서는 데이터를 받을 주소를 먼저 알려주어야 한다.

상대방 또한 데이터를 받을 수 있는지를 검사해야 한다.

 

 

서로 다른 기종의 컴퓨터 간에도 통신이 이루어져야 하기 때문에 프로토콜은 몇 개의 기능적인 계층으로 나누어서 정의한다.

 

 


[TCP(Transmission Control Protocol)]

TCP는 신뢰성 있게 통신하기 위해 먼저 서로 간에 연결을 설정한 후에 데이터를 보내고 받는 방식이다.

TCP는 전화와 비슷하다. 전화를 하기 위해 전화번호를 입력하고 전화 버튼을 누르고 상대방이 전화를 받을 때까지 기다린다. 상대방이 전화를 받아야지만 통화가 가능하고, 통화가 끝나면 연결이 끊어진다.

이처럼 TCP의 장점은 신뢰성 있게 데이터를 보낼 수 있다. 중간에 데이터들이 잘 도착하는지 상대방의 응답을 통해 확인하고 분실된 데이터가 있다면 다시 보낸다. 또한 데이터를 받는 순서가 데이터를 보내는 순서와 동일하게 관리한다.

TCP의 단점은 연결을 하는 과정과 연결을 해제하는 과정에서 많은 시간이 걸린다. 만약 짧은 데이터를 보내는 경우에는 낭비가 된다.

 

HTTP, FTP, Telnet 등은 모두 TCP를 사용한다. TCP를 사용해야지만 데이터의 순서가 보장되기 때문이다.

FTP로 파일을 인터넷에서 다운로드하였을 때 파일 데이터가 엉망이라면 사용자는 없을 것이다.

 


[UDP(User Datagram Protocol)]

UDP는 TCP와 다르게 연결을 하지 않고 데이터 몇 개의 고정 길이의 패킷(=다이어그램)으로 분할한 후 패킷의 앞에 주소를 붙여 데이터를 전송한다.

UDP는 편지와 비슷하다. 편지는 주소가 붙어있는데 우체국에서는 이 주소를 보고 편지를 배달한다. 하지만 편지는 배달 중간에 분실될 수도 있고 배달되는 순서가 바뀔 수도 있다.

그래서  UDP는 높은 신뢰도가 필요하지 않은 통신에서 사용한다.

송수신 측이 서로 데이터를 주고받는 방식이 TCP이고

수신 측과 접속 절차를 거치지 않고 송신 측에서 일방적으로 데이터를 보내는 방식이다.

UDP의 장점은 연결 절차가 필요 없으므로 빠르고 효율적인 통신이 가능하다.

인터넷상의 동영상 서비스는 일반적으로 UDP로 서비스를 제공한다.

약간의 패킷손실이 있어도 영상을 시청하는 것에는 지장이 없기 때문이다.

P2P 방식의 네트워크 게임에서는 TCP와 UDP 방식을 병행해서 사용한다. 캐릭터의 이동처럼 비교적 중요하지 않은 부분은 UDP를 사용한다.


TCP/IP 통신을 이용하기 전에 결정해야 하는 것이 전송(Transport) 계층 중에서 TCP를 사용할 것인지 UDP를 사용할 것인가를 결정해야 한다. TCP는 신뢰성 있는 점대점 통신 채널을 제공한다. 따라서 클라이언트-서버 응용에서 사용될 수 있다. TCP를 이용하여 통신을 하기 위해서는 클라이언트와 서버 프로그램은 서로 간의 연결을 만들어야 한다. 각 프로그램은 소켓을 연결의 양 끝점에 접속한다. 데이터를 주고받기 위해서는 클라이언트와 서버는 연결에 붙어있는 소켓에서 읽고 쓴다.


[포트(Port)]

IP주소와 포트는 아파트의 동 호수로 비유할 수 있다.

IP주소는 아파트의 동에 해당하고,포트는 해당 동의 호수에 해당한다.

아파트의 동이나 호수 둘 중하나마 알고있다면 찾아가야하는 집을 알수가없다.

컴퓨터에는 하나의 물리적인 통신선을 통하여 외부와 연결되어 있다.

컴퓨터 안에서는 여러 개의 네트워크 응용프로그램들이 수행될 수 있다.

하나의 통신선을 타고 들어오는 데이터를 각각의 응용프로그램에 차질 없이 전송하기 위해서는 각각의 응용프로그램이 사용하는 가상적인 통신선로가 필요한데 이것을 포트 라고 한다.

하나의 컴퓨터 안에는 여러 개의 포트가 존재하고 있으고 인터넷을 통하여 데이터를 보내려면 반드시 어떤 포트를 사용할 것인지를 지정해야 한다.

따라서 네트워크를 통해 전달되는 모든 데이터의 주소는 컴퓨터를 가리키는 32비트의  IP주소와 16비트의 포트 번호로 구성된다.

포트번호는 192.168.1.1:80과 같이 IP주소에 콜론을 붙여 표시한다.


[소켓(Socket)]

소켓은 TCP를 위한 구조이다.

TCP를 사용하여 응용프로그램끼리 통신을 하기 위해서는 먼저 연결을 해야 하는데 연결을 하기 위해서는 연결 끝점이 있어야 한다. 이 연결 끝점을 소켓이라고 한다.

소켓은 포트를 이용하여 만들어진다. 하나의 포트에 하나의 소켓을 만들어 결합한다. 소켓은 개념적으로 응용프로그램과 포트 사이에 존재한다고 생각할 수 있다.


[소켓 예제]

소켓은 Socket 클래스에 의하여 제공된다. Socket 클래스 생성자의 첫 번째 인수는 사이트 주소이고 두번째 인수가 포트번호이다.

NIST 서버를 지정하는 소켓을 생성하면 바로 서버와 연결된다.

소켓으로부터 입력 스트림을 얻어서 스트림에 읽으면 현재 시각을 알 수있다.

 

미국 시각알려주는 서버

SocketTest.java

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.Scanner;

public class SocketTest {

	public static void main(String[] args) throws IOException {
		try(Socket s= new Socket("time-c.nist.gov",13)){//NIST 서버를 13번 포트로 연결 시도
			InputStream inStream = s.getInputStream();
			Scanner in = new Scanner(inStream);
			
			while (in.hasNext()) {
				String line = in.nextLine();
				System.out.println(line);
			}
		}
	}

}

 

 

 


잘못된 정보는 댓글에 남겨주시면 감사하겠습니다!😊

댓글과 좋아요는 큰 힘이 됩니다!

728x90
반응형
Comments