TCP/IP(Transmission Control Protocol/Internet Protocol)는 대부분의 인터넷 기반 애플리케이션과 서비스에서 사용되는 기본 통신 프로토콜입니다. 이는 서로 다른 장치에서 실행되는 애플리케이션 간의 신뢰성 있는, 순서가 지정된, 오류 검사된 데이터 전달을 제공합니다.
TCP/IP 를 이용해 어플리케이션을 개발할 때 알아야할 개념들
포트(port)는 인터넷 프로토콜에서 컴퓨터 내부의 프로세스들이 외부와 통신할 수 있도록 하는 추상적인 개념입니다.
각 프로세스는 포트 번호를 할당받아 이를 통해 외부와 통신합니다.
예를 들어, 웹 브라우저에서 웹 페이지를 요청하는 경우, 브라우저는 HTTP 프로토콜을 사용하여 웹 서버에 요청을 보냅니다. 이때 브라우저는 HTTP 프로토콜에 따라 포트 번호 80을 사용하여 요청을 보냅니다. 웹 서버는 이 요청을 받고, 해당 포트 번호를 통해 요청을 처리합니다.
포트는 0부터 65535까지의 범위에서 선택할 수 있으며, 일부 포트는 특정한 용도로 예약되어 있습니다.
예를 들어, 포트 번호 80은 HTTP 프로토콜에서 사용되며, 포트 번호 22은 SSH(Secure Shell) 프로토콜에서 사용됩니다.
포트 번호는 IP 주소와 함께 사용되어 특정한 프로세스를 구분하고, 데이터를 전송합니다. 이를 통해 인터넷 상에서 다양한 프로세스들이 동시에 실행되며, 각각의 프로세스가 다른 프로세스와 충돌하지 않고 통신할 수 있도록 보장합니다.
소켓은 TCP/IP 프로토콜에서 사용되는 개념으로, 프로세스 간의 통신을 가능하게 합니다.
소켓은 두 개의 컴퓨터 간의 네트워크 연결을 나타내는 추상적인 개념으로, 소켓을 이용하여 데이터를 주고받을 수 있습니다.
소켓은 프로세스가 네트워크를 통해 다른 프로세스와 통신할 수 있도록 인터페이스를 제공합니다.
이를 통해 프로세스는 다른 컴퓨터에서 실행되는 프로세스와 통신할 수 있으며, 데이터를 전송하고 받을 수 있습니다.
소켓은 IP 주소와 포트 번호를 사용하여 프로세스를 식별합니다. 이를 통해 소켓은 다른 소켓과 연결되어 데이터를 전송할 수 있습니다.
소켓은 클라이언트-서버 모델에서 매우 중요한 개념 중 하나입니다. 클라이언트는 서버에 연결하기 위해 소켓을 생성하고, 서버는 클라이언트의 소켓과 연결된 소켓을 생성합니다.
이후, 데이터는 클라이언트의 소켓을 통해 서버로 전송되며, 서버는 이를 처리하고 응답을 클라이언트로 전송합니다.
소켓 통신을 구현한 자바 코드
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException {
String hostName = "localhost";
int portNumber = 4444;
try (
Socket socket = new Socket(hostName, portNumber);
PrintWriter out =
new PrintWriter(socket.getOutputStream(), true);
BufferedReader in =
new BufferedReader(
new InputStreamReader(socket.getInputStream()));
BufferedReader stdIn =
new BufferedReader(
new InputStreamReader(System.in))
) {
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("echo: " + in.readLine());
}
} catch (UnknownHostException e) {
System.err.println("Don't know about host " + hostName);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to " +
hostName);
System.exit(1);
}
}
}
import java.net.*;
import java.io.*;
public class Server {
public static void main(String[] args) throws IOException {
int portNumber = 4444;
try (
ServerSocket serverSocket =
new ServerSocket(portNumber);
Socket clientSocket = serverSocket.accept();
PrintWriter out =
new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
) {
String inputLine;
while ((inputLine = in.readLine()) != null) {
out.println(inputLine);
}
} catch (IOException e) {
System.out.println("Exception caught when trying to listen on port "
+ portNumber + " or listening for a connection");
System.out.println(e.getMessage());
}
}
}
클라이언트
는 Socket
클래스를 사용하여 서버에 연결하고, PrintWriter
클래스를 사용하여 서버로 데이터를 전송합니다. 서버
는 ServerSocket
클래스를 사용하여 클라이언트의 연결을 받고, BufferedReader
클래스를 사용하여 클라이언트로부터 데이터를 수신합니다.
이를 통해, 소켓을 이용하여 클라이언트와 서버가 서로 데이터를 주고받을 수 있습니다. 이러한 기능을 바탕으로, 네트워크 프로그래밍을 구현할 수 있습니다.
연결은 두 소켓 간에 통신하려는 두 기기 사이에서 수립됩니다. 연결 설정 과정에서 최대 세그먼트 크기, 윈도우 크기 등 여러 매개변수가 협상되며, 이는 연결을 통해 데이터가 어떻게 전송될지를 결정합니다.
연결이 설정되면, 각 기기에서 실행되는 애플리케이션 간에 데이터를 전송할 수 있습니다. 데이터는 일반적으로 세그먼트로 전송되며, 각 세그먼트에는 순서 번호와 신뢰성 검사 등의 메타데이터가 포함되어 안정적인 전송이 보장됩니다.
TCP/IP를 이용하여 애플리케이션을 개발할 때는 적절한 포트, 소켓 및 연결을 사용할 수 있도록 애플리케이션을 설계해야 합니다.
또한 HTTP, FTP(File Transfer Protocol) 및 SMTP(Simple Mail Transfer Protocol)와 같은 TCP/IP와 함께 일반적으로 사용되는 다양한 프로토콜 및 표준에 대해 알아야 합니다.
이러한 개념과 프로토콜을 이해하는 것은 효과적이고 확장 가능하며 안전한 인터넷 기반 애플리케이션 및 서비스를 구축하기 위해 필수적입니다.
TCP/IP를 사용하여 애플리케이션을 개발할 때는, 적절한 포트, 소켓 및 연결을 사용할 수 있도록 애플리케이션을 설계해야 합니다.
또한 HTTP, FTP(File Transfer Protocol) 및 SMTP(Simple Mail Transfer Protocol)와 같은 TCP/IP와 함께 일반적으로 사용되는 다양한 프로토콜 및 표준에 대해 알아야 합니다. 이러한 개념과 프로토콜을 이해하는 것은 효과적이고 확장 가능하며 안전한 인터넷 기반 애플리케이션 및 서비스를 구축하기 위해 필수적입니다.
참고