12. 네트워크 프로그래밍

2023. 9. 10. 20:25네트워크

 

IP주소

기기들을 구분하는 주소, 고유번호

 


Port

컴퓨터 안에 있는 서버들을 구분하는 값

 

Well Known Port  0~1023  국제 인터넷 주소 관리 기구에서 미리 예약해둔 포트
Registered Port  1024~49151  개인 또는 회사에서 사용하는 포트
Dynamic 또는 Private Port  49152~65535  운영체제가 부여하는 동적 포트 또는 개인적인 목적으로 사용할 수 있는 포트

 


도메인 네임 서버(Domain Name Server : DNS)

도메인 주소로 접속했을 때, 도메인 주소를 IP 주소로 바꾸고 해당 IP 주소로 접속하는 과정을 일컫음.

 

 

* DNS 구성 요소

 

1. 도메인 네임 스페이스(Domain Name Space)

2. 네임 서버(Name Server) = 권한 있는 DNS 서버

3. 리졸버(Resolver) = 권한 없는 DNS 서버

 

도메인 네임 스페이스라는 규칙으로 도메인 이름을 계층적으로 저장,분산한다.

네임 서버가 해당 도메인 이름의 IP주소를 찾는다.

리졸버가 DNS 클라이언트 요청을 네임 서버로 전달하고 찾은 정보를 클라이언트에게 제공하는 기능 수행

 

* nslookup 도메인 주소 - 위 명령으로 도메인에 해당하는 ip주소를 알아낼 수 있다

 

 

 


Client & Server  socket 프로그래밍

클라이언트 방향 서버
    ServerSocket
클라이언트 요청을 받기 위한 준비를 한다.
Socket
서버에 접속 요청한다.
-> accept
클라이언트의 요청을 받아들인다.
BufferWriter
서버에 메시지를 보낸다.
-> BufferReader
클라이언트가 보낸 데이터를 출력한다.
BufferReader
서버가 보낸 메시지를 출력한다.
<- BufferWriter
클라이언트 메시지를 보낸다.
socket.close()
종료한다.
  socket.close()
종료한다.

 - 서버는 클라이언트 요청을 기다리다가 서버에 접속을 하면 socket을 반환한다.

 

package com.example.net;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class WebServer {

    public static void main(String[] args) throws Exception {
    
        //9090 port에서 클라이언트를 기다린다.
        // 클라이언트가 접속하는 순간, 클라이언트와 통신할 수 있는 socket을 반환한다.
        // 브라우저에서 http://127.0.0.1:9090/ 입력한다.
        ServerSocket ss = new ServerSocket(9090);
        System.out.println("클라이언트 접속을 기다립니다.");


        // Socket은 브라우저(client)와 통신할 수 있는 객체
        // 클라이언트의 접속 요청을 받아들여 연결됨.
        Socket socket = ss.accept();

        //Client와 읽고 쓸 수 있는 InputStream, OutputStream이 반환된다.
        OutputStream out = socket.getOutputStream();
        InputStream in = socket.getInputStream();
        
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(out));
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        
        //요청정보 읽기 시작
        String firstLine = br.readLine();
        List<String> headers = new ArrayList<>();
        String line = null;

        //빈줄을 만나면 while문을 끝낸다.
        while ((line = br.readLine()).equals("")){
            headers.add(line);
        }

        //요청정보 읽기 끝
        System.out.println(firstLine);
        for (int i =0; i<headers.size(); i++){
            System.out.println(headers.get(i));
        }

        //서버에게 응답보내기
        pw.println("HTTP/1.1 200 OK");
        pw.println("name : kim");
        pw.println("email : yaya");
        pw.println();
        pw.println("<html>");
        pw.println("<h1>Hello!</h1>");
        pw.println("</html>");
        pw.close();

	    //종료
        ss.close();
        System.out.println("서버가 종료됩니다.");

    }
}

** socket과 socket간에는 IO객체를 이용하여 통신할 수 있다.

 

 

 


TCP/IP 프로토콜

인터넷 환경에서 정보 전송을 위해 쓰이는 프로토콜
IP : 패킷 통신 방식의 인터넷 프로토콜(Ineternet layer)
                       +
TCP : 전송 조절 프로토콜(Transport layer)

=> IP 주소 체계를 따르고, 목적지를 찾아가는 과정에서

     TCP의 특성을 활용해 송신자와 수신자의 논리적 연결을 생성하고 신뢰성을 유지할 수 있도록 하겠다는 의미

(송신자가 수신자에게 IP 주소를 사용하여 데이터를 전달하고 그 데이터가 제대로 갔는지, 받았는지, 속도는 괜찮은지에 대한 이야기)

 

 

 

* TCP의 작동 (3-way handshake)

 

1) 송신자가 수신자에게 'SYN'을 날려 통신 가능 여부를 확인한다. (Port는 열려있어야함.)

2) 수신자가 송신자로부터 'SYN'을 받고, 'SYN/ACK'을 송신자에게 날려 통신할 준비가 되었음을 알린다.

3) 송신자가 수신자의 'SYN/ACK'를 받고 'ACK'를 날려 전송 시작을 알린다.

 

 

* TCP의 특징

 

1) 흐름 제어 

한번에 받고/ 보낼 수 있는 데이터의 양을 정하고 데이터를 어디까지 받았는지 계속해서 확인한다.

 

2)혼잡 제어

데이터가 지나가는 네트워크망의 혼잡도를 파악하여

Slow Start를 통해 연결 초기에는 송출량을 낮게 잡고 점차 늘리며 현재 네트워크에서 가장 적합한 데이터 송출량을 확인할 수 있다.

 

 


HTTP 프로토콜

텍스트 기반 통신 규약으로,
웹에서 클라이언트와 서버 간에 데이터를 주고받기 위한 방식으로 사용되며 TCP/IP 위에서 작동됨.
클라이언트에서 요청(request)을 보내면 서버는 요청을 처리해서 응답(response)한다.

 

 

* HTTP 특징

Connectionless & Stateless
서버에 연결하고, 요청해서 응답을 받으면 연결을 끊어버림. - Connectionless
 

장점

- 데이터를 주고 받기 위한 각각의 데이터 요청이 서로 독립적으로 관리가 된다.
(이전 데이터 요청과 다음 데이터 요청이 서로 관련이 없다. )
=> 별도의 추가 정보를 관리하지 않아도 되고, 다수의 요청 처리 및 서버의 부하를 줄일 수 있다

 

단점 

- 연결을 끊어버리기 때문에, 클라이언트의 이전 상태를 알 수 없다. - Stateless
 

 

 

* HTTP 요청 메서드

  • GET : 기존 자원 요청
  • POST : 새로운 자원 생성
  • PUT : 기존 자원에 대한 변경
  • DELETE : 기존 자원에 대한 삭제
  • HEAD : 서버 헤더 정보만 요청
  • OPTIONS : 웹 서버가 지원하는 메소드 종류 요청

'네트워크' 카테고리의 다른 글

12. 프로세스와 스레드  (0) 2023.09.10