본문 바로가기
Development/Network

CS | Network 개념 정리

by raphael3 2023. 8. 1.
반응형

네트워크

노드와 링크로 연결된 집단. 이 집단 내에서는 리소스와 데이터들이 공유된다.

노드: 서버, 라우터, 스위치, 핸드폰 등의 네트워크 장치

링크: 이들 노드들을 연결하는 연결매체, 통신수단(와이파이 등)

라우터와 스위치의 차이는?

라우터

  • 외부 통신 수행 → 통신 중계의 역할을 함
  • IP 주소 기반의 통신
  • 네트워크 계층(3계층)에서 동작
  • 보안 정책은 방화벽

스위치

  • 내부 통신 수행(로컬 네트워크)
  • MAC 주소와 포트 기반의 통신
  • 데이터 링크 계층(2계층)에서 동작
  • 스위칭 테이블을 사용하여 데이터를 전달함

스위칭 테이블이란?

  • 일종의 내부 네트워크 데이터베이스
  • 데이터 프레임을 목적지 포트로 정확히 전달하는 것을 목표로 함
  • MAC 주소와 포트 주소를 담고있는 테이블
  • 스위칭 테이블은 초기에는 비어있는 상태이다.
  • 데이터 프레임을 일단 스위치에 보내야 스위칭 테이블에 기록된다.
    • 데이터 프레임을 스위치에 보내면 → 스위치가 이 데이터 프레임의 출발지 MAC 주소와 포트를 확인 → 스위칭 테이블에 기록
컴퓨터 A: MAC 주소 - AA:AA:AA:AA:AA:AA
컴퓨터 B: MAC 주소 - BB:BB:BB:BB:BB:BB
컴퓨터 C: MAC 주소 - CC:CC:CC:CC:CC:CC
스위치(Switch): 스위치는 4개의 포트를 가짐

(1) 컴퓨터 A -> 스위치
스위칭 테이블에 기록되는 내용: AA:AA:AA:AA:AA:AA | 포트 1

(2) 컴퓨터 B -> 스위치
스위칭 테이블에 기록되는 내용: BB:BB:BB:BB:BB:BB | 포트 2

(3) 
컴퓨터 A가 다시 스위치로 데이터를 보내면 스위칭 테이블에 이미 
AA:AA:AA:AA:AA:AA가 등록되어 있기 때문에 
출발지 MAC 주소를 추가로 기록하지 않음

(4) 컴퓨터 C -> 스위치
스위칭 테이블에 기록되는 내용: CC:CC:CC:CC:CC:CC | 포트 3
MAC 주소           |   포트
-----------------------------------
AA:AA:AA:AA:AA:AA  |   1
BB:BB:BB:BB:BB:BB  |   2
CC:CC:CC:CC:CC:CC  |   3
  • 스위칭 테이블이 구성된 후에 → 데이터 프레임이 스위치에 도착하면 → 스위치는 스위칭 테이블을 기반으로 목적지의 MAC 주소와 포트를 확인하고 → 해당 포트로 데이터를 전달
  • 스위칭 테이블은 일시적인 정보. 스위치가 재부팅되면 다시 구성되어야 한다.

왜 스위칭 테이블이 필요한가?

  • 전체 네트워크를 검색하지 않아도 되기 때문에 빠르고 정확한 데이터 전달이 가능
  • 포트가 바뀌더라도, 새로운 장치가 추가되더라도 스위칭 테이블만 업데이트해주면 됨

데이터 프레임=패킷(Packet)=프레임(Frame)

  • 네트워크에서는 패킷(Packet) 또는 프레임(Frame)
  • 모양은 엑셀 시트처럼 행과 열로 구성됨
  • 네트워크를 통해 전송되는 데이터의 최소 단위
  • 헤더(Header)와 페이로드(Payload)로 구성
    • 헤더(Header): 목적지 주소, 출발지 주소, 오류 검출을 위한 체크섬(Checksum)
    • 페이로드(Payload): 헤더 다음에 오는 실제 데이터
    • 이메일을 예로 들면, 수신자 주소, 발신자 주소 → 헤더 이메일의 내용 → 페이로드

트래픽과 처리량과 대역폭은 모두 연결된 개념이다.

트래픽: 발생한 실제 데이터의 양 그 자체

  • 서버와 클라이언트 간에 데이터를 주고받을 때 생성됨
  • KB, MB, GB 등의 단위로 측정됨 → 양적인 개념
  • 순간적으로 많은 트래픽이 발생하면 병목현상 발생

처리량(Throughput): 전달/처리되는 데이터의 속도/양

  • 단위 시간당 전송되는 데이터의 양
  • 단위: bps(bits per second) 초당 전송 또는 수신되는 비트 수 → 속도의 개념
  • 네트워크의 성능 지표
  • 처리량이 높다: 단위 시간당 많은 데이터가 전송/처리된다. = 네트워크 속도가 빠르다.

대역폭(bandwidth)

  • 단위 시간당 최대로 처리할 수 있는 데이터의 양
  • 단위: bps(bits per second) 초당 전송 또는 수신되는 비트 수 → 속도의 개념
  • 네트워크 세계의 고속도로
  • 최대동시접속자수 유추 가능

100KB 이미지를 1,000명이 다운로드 시 누적 트래픽은 100MB

100Mbps라는 대역폭을 가진 서버가 있고 한사용자당 100kbps로 동영상 파일을 요청한다 할 때, 최대 동접자수는 약 1000명

RTT(Round Trip Time)

  • 전송하고 수신까지 걸린 시간
  • 어떤 메시지가 두 장치 사이를 왕복하는 데 걸린 시간. 즉, RTT의 입장은 clinet다.
  • ping

클라이언트가 서버로 Request를 send하면, 서버는 클라이언트로 response를 send한다. 이 시간이 RTT다.

 

병목현상(bottleneck)=핫스팟: 데이터 전송 속도가 저하 또는 연결이 중단되는 문제

병목지점: 전체 시스템의 성능을 제한하는, 네트워크 구성 요소 중에서 가장 느린 요소

병목현상의 해결:

  • 토폴로지를 분석하여 병목현상을 해결한다.
    • 토폴로지 분석 → 병목 지점 식별 → 해당 지점 강화 또는 대체
  • 대역폭을 늘린다.
  • 로드 밸런싱(부하 분산)
  • 네트워크 하드웨어 업그레이드(리소스 자체 성능 향상)
  • 라우팅 프로토콜 최적화
  • 캐시 서버 사용

→ 패킷 스위칭 기술과 연관됨.

토폴로지: 노드들과 링크들을 어떻게 구성하고 연결하는지에 대한 개념적/물리적인 구성 방식

  • 버스 토폴로지
  • 스타 토폴로지
  • 트리 토폴로지
  • 링 토폴로지
  • 메쉬 토폴로지

버스 토폴로지

하나의 회선, 여러 노드

→ 한 노드에 문제 발생해도 괜찮음, 노드 추가/삭제 쉬움

→ 메인 회선 문제 발생 시, 전체 시스템 다운

스타 토폴로지

중앙 노드와 여러 노드

→ 한 노드에 문제 발생해도 괜찮음, 구성 쉬움, 노드 추가/삭제 쉬움

→ 중앙 노드 문제 발생 시, 전체 시스템 다운

→ 중앙 노드에 높은 보안 정책 적용 가능

트리 토폴로지=계층적 토폴로지

 

버스 토폴로지와 스타 토폴로지의 하이브리드

노드 추가와 삭제 난이도가 경우에 따라 다름(리프노드에선 쉬움)

→ 리프노드에 문제 발생해도 괜찮음, 리프노드 추가/삭제 쉬움

→ 리프노드들이 특정 노드에 영향을 받음, 루트노드 문제 발생 시, 전체 시스템 다운

링 토폴로지

 

노드 수가 많아져도 데이터 손실이 없음

토큰 기반의 통신 → 권한 있는 노드에게만 공유

링크 또는 노드가 하나만 끊어져도 전체 시스템 다운

토큰 없이는 통신에 참여 불가

메쉬 토폴로지

 

  • fully-connected
  • partially-connected

한 노드 장애 시, 다른 노드는 영향 받지 않음, 중앙 방식이 아님, 트래픽 분산 가능

노드 추가/삭제 어려움, 회선 구축 고비용

패킷 전송 방식: 데이터를 전송하는 방법

  • 유니캐스트(Unicast)
    • 1:1 통신
    • 한 송신자가 한 수신자에게만 데이터를 전송하는 방식
    • 개별적인 요청과 응답
    • 일반적인 웹 브라우징, HTTP 통신
  • 멀티캐스트(Multicast)
    • 1:특정 N 통신
    • 한 송신자가 특정 그룹의 여러 수신자들에게 동시에 데이터를 전송하는 방식
      • 그룹에 속해 있는 호스트들만 해당 데이터를 수신
    • IPTV, OTT, 카카오 단톡방
  • 브로드캐스트
    • 1:불특정 N 통신
    • 일방적 송신과 불특정 다수의 수신
    • 한 송신자가 모든 호스트들에게 데이터를 전송하는 방식
    • 라디오, TV

유니캐스트

public class UnicastServer {
    public static void main(String[] args) {
        final int serverPort = 8888;
        try {
            DatagramSocket serverSocket = new DatagramSocket(serverPort);

            ...

            while (true) {
                DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
                serverSocket.receive(receivePacket);

                ...

                // 클라이언트로 메시지를 그대로 돌려줌
                DatagramPacket sendPacket = new DatagramPacket(receivePacket.getData(), receivePacket.getLength(), receivePacket.getAddress(), receivePacket.getPort());
                serverSocket.send(sendPacket);
            }
        } ...
    }
}
public class UnicastClient {
    public static void main(String[] args) {
        final String serverIP = "127.0.0.1"; // 서버 IP 주소
        final int serverPort = 8888; // 서버 포트 번호

        try {
            DatagramSocket clientSocket = new DatagramSocket();

            ...

            InetAddress serverAddress = InetAddress.getByName(serverIP);
            DatagramPacket sendPacket = new DatagramPacket(sendBuffer, sendBuffer.length, serverAddress, serverPort);

            clientSocket.send(sendPacket);

            byte[] receiveBuffer = new byte[1024];
            DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
            clientSocket.receive(receivePacket);

            ...
        } ...
    }
}

서버는 요청한 클라이언트의 IP와 포트를 명시하여 해당 클라이언트에게만 메세지를 보내고 있다.

멀티캐스트

public class MulticastSender {
    public static void main(String[] args) {
        try {
            // 멀티캐스트 주소와 포트 설정
            InetAddress group = InetAddress.getByName("230.0.0.1");
            int port = 8888;

            ...

            // 멀티캐스트 패킷 생성
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length, group, port);

            // 데이터 전송
            socket.send(packet);

            ...
        } ...
    }
}
public class MulticastReceiver {
    public static void main(String[] args) {
        try {
            // 멀티캐스트 주소와 포트 설정
            InetAddress group = InetAddress.getByName("230.0.0.1");
            int port = 8888;

            // 멀티캐스트 소켓 생성 및 그룹에 가입
            MulticastSocket socket = new MulticastSocket(port);
            socket.joinGroup(group);

            ...
        } ...
    }
}

InetAddress group = InetAddress.getByName("230.0.0.1"); : 멀티캐스트 수신자(Receiver)가 속한 그룹 주소. 230.0.0.x 네트워크에 속한 장치 중 x번째 장치. 여기서 230.0.0은 네트워크 주소, .x는 호스트 주소라고 한다.

socket.joinGroup(group); : 해당 그룹에 가입하는 부분

브로드캐스트

public class BroadcastSender {
    public static void main(String[] args) {
        try {
            ...

            // 브로드캐스트 주소 설정
            InetAddress broadcastAddress = InetAddress.getByName("255.255.255.255");

            ...
        } ...
    }
}
public class BroadcastReceiver {
    public static void main(String[] args) {
        try {
            ...
            socket.receive(packet);

            ...
        } ...
    }
}

255.255.255.255는 브로드캐스트 주소

네트워크 상의 모든 장치에게 데이터를 보낼 때 사용됨

해당 주소로 보낸 데이터는 네트워크 상의 모든 장치에 도달함

IP주소에 대하여

인터넷 프로토콜 주소

논리적인 주소

내/외부 통신과 식별에 필요한 고유한 숫자

IPv4와 IPv6 두 가지 버전이 있음

  • IPv6: 128비트
  • IPv4: 32비트, 네 개의 8비트 숫자로 표현됨
    • 255.255.255.255 브로드캐스트 주소 네트워크 상의 모든 장치에게 데이터를 보낼 때 사용됨 해당 주소로 보낸 데이터는 네트워크 상의 모든 장치에 도달함
    • 255.0.0.1 특정 네트워크에 속한 장치 중 첫 번째 장치

192.168.0.1 → 네트워크 주소가 "192.168.0", 호스트 주소가 "1"

소켓

네트워크 프로그래밍에서 통신을 위해 사용하는 추상적인 개념

import java.io.*;
import java.net.*;

public class ServerExample {
    public static void main(String[] args) throws IOException {
        int portNumber = 12345;
        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("예외 발생: " + e.getMessage());
        }
    }
}

서버 소켓과 클라이언트 소켓을 설정 및 데이터 처리 후 전달

import java.io.*;
import java.net.*;

public class ClientExample {
    public static void main(String[] args) throws IOException {
        String serverAddress = "127.0.0.1";
        int portNumber = 12345;
        try (
            Socket clientSocket = new Socket(serverAddress, portNumber);
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        ) {
            String userInput;
            while ((userInput = stdIn.readLine()) != null) {
                out.println(userInput);
                System.out.println("서버에서 받은 메시지: " + in.readLine());
            }
        } catch (IOException e) {
            System.out.println("예외 발생: " + e.getMessage());
        }
    }
}

포트와 소켓은 무슨 차이?

포트

일종의 통로다.

특정 서비스/프로세스를 구별/식별하는 번호

16비트 숫자다.

TCP/IP기반에서, 0부터 65535(2^16-1)까지의 숫자로 구성

  • 0은 포트 번호로서 사용되지 않음
  • 웹 서버: 80
  • 보안, HTTPS: 443
  • SSH: 22

소켓: 프로그램 간에 통신할 수 있게 하는 추상적인 개념

MAC 주소: 물리적 주소

IP주소: 논리적 주소

내부 통신과 식별에 필요한 고유한 숫자

Media Access Control

전세계에서 유일함

총 두 개의 숫자씩, 6개의 16진수 블록, XX:XX:XX:XX:XX:XX 형태

네트워크에 연결된 각 장치를 구분할 수 있음. 특히 NAT에 의해 하나의 가상 IP를 사용하는 경우에, 데이터를 정확하게 송수신하려면 각 장치를 MAC주소로 식별해야 한다.

  • 우리 회사가 할당받은 공인 IP주소는 1개이지만, 이 1개의 주소로 200명의 직원이 써야한다.

NAT

Network Address Translation

인터프리터같은 애 아닐까.

하나의 공인 IP를 여러 가상 IP로 사용할 수 있게 함

IP 개수가 부족하기 때문

각 장치는 MAC주소로 구분함

LAN

  • Local Area Network

MAN

  • Metropolitan Area Network
  • 각 도시의 LAN끼리의 연결

WAN

  • Wide Area Network
  • 국가간 연결

네트워크는 데이터를 전송하기 위함이 목적이다.

데이터를 어떻게해야 잘 보냈다고 소문이날까?

현재까지 소문난 가장 좋은 방식은, 데이터를 잘게 쪼개고(패킷), 네트워크 계층을 거치면서 헤더를 덕지덕지 붙이고, 그걸 라우터를 통해 최적의 경로로 보냄: 각 계층이 자신의 헤더를 까서 책임지고 전송 → 목적지 수하물센터에서는 쏟아져 들어오는 패킷들을 순서대로 다시 잘 패키징함 → 완성된 택배물 ⇒ TCP/IP임

TCP/IP 4계층

TCP/IP: 데이터 전송하기 위한 프로토콜의 집합

계층

데이터를 주고받는 과정을 개념적으로 몇 개의 계층으로 나눈 모델

각 계층은 독립적으로 자신만의 기능을 담당

Application → Network Access 방향: 송신 (캡슐화) ⇒ 헤더를 막 붙임 Network Access → Application 방향: 수신 (비캡슐화) ⇒ 헤더를 하나하나 깜

OSI 7계층

Open Systems Interconnection

국제 표준 모델

  • Open Systems: 개방형 시스템/열린 체계
  • Interconnection: 상호 접속

응용 계층 (Application Layer)

protocol: HTTP, SMTP, FTP, SSH

PDU(Protocol Data Unit): message

사용자와 네트워크 간의 인터페이스를 담당

최종 사용자에게 서비스를 제공함

HTTP(Hypertext Transfer Protocol): 서버와 서버간 통신, 서버와 브라우저간 통신

헤더의 확장성이 좋기 때문에 쉽게 값을 추가할 수 있다.

stateless: 상태를 저장하지 않음.

기존에 연결되었던 클라이언트라 하더라도 서버에서는 이를 알 수 없음

SMTP(Simple Mail Transfer Protocol): 이메일 보낼 때 사용되는 프로토콜

SSH(Secure SHell): 서버와 통신할 때 암호화된 통신을 할 수 있게 도와주는 프로토콜

FTP(File Transfer Protocol): 노드와 노드 간에 파일을 전송하기 위한 프로토콜. SFTP가 주로 쓰임

DNS(Domain Name Service)

표현 계층 (Presentation Layer)

데이터의 압축, 암호화, 문자 인코딩

세션 계층 (Session Layer)

양 끝단의 애플리케이션 사이에 세션을 만들고 관리

세션은 데이터 교환의 흐름을 설정하고, 유지하며, 종료하는 역할을 함

장애로 인해 세션이 끊어졌을 때 재연결을 담당함

전송 계층 (Transport Layer)

protocol: TCP, UDP

PDU(Protocol Data Unit): segment(TCP), datagram(UDP)

포트 번호가 주로 사용됨

데이터가 손실 없이(신뢰성) 순서대로 목적지로 전달되도록 하고(효율성), 데이터의 오류를 검증한다(신뢰성).

종단 간(End-to-End) 통신을 지원

message → segments로 쪼갬(이 때 SP와 DP 정보가 붙는다.)

네트워크 계층 (Network Layer)

장치: 라우터

protocol: IP, ICMP

PDU(Protocol Data Unit): packet

segments → packet화(segments(SP, DP가 붙은 정보)에 출발지IP, 목적지IP를 붙인 데이터 단위)

패킷을 분할 → 최적 경로 결정 → 목적지 호스트로 전달(IP 주소) → 패킷 조립

  • 패킷 = IP헤더 + 페이로드

ICMP(Internet Control Message Protocol): 연결 확인을 위한 프로토콜(ping). 데이터는 교환할 수 없음

데이터 링크 계층 (Data Link Layer)

장치: 스위치 & Ethernet, Wi-Fi

PDU(Protocol Data Unit): frame

동일한 네트워크(내부 네트워크)에 연결된 장치 간의 효율적인 데이터 전송을 보장함

맥 주소(MAC address)가 주로 사용됨

데이터 링크 계층에서 주로 데이터의 오류 검출 및 수정이 일어남

물리 계층 (Physical Layer)

장치: 전선, 광섬유, 케이블 등

PDU(Protocol Data Unit): bit

네트워크의 하드웨어적인 부분

실제 물리적인 연결매체(전선, 광섬유, 케이블)에 데이터를 비트 단위로 전송함

TCP

Transmission Control Protocol

네트워크 세계의 우체국

가상회선패킷교환방식을 사용

패킷 전송/도착 순서를 확인 & 제한 시간 초과 시, 재전송을 요청함

데이터 신뢰성/무결성 보장, 데이터 손실 방지

TCP 헤더의 길이는 20-60바이트로 가변적임

연결은 3-way 핸드쉐이크로, 연결 해제는 4-way 핸드쉐이크로 → 속도 느림

UDP

User Datagram Protocol

데이터그램패킷교환방식을 사용

데이터를 빨리 보내는 것에만 관심있고, 데이터의 순서/신뢰성/무결성/유실 따위는 신경쓰지 않음 → 신뢰성이 낮음 → 보이스톡, 스트리밍 등의 브로드캐스트에 사용됨

UDP 헤더의 길이는 8바이트로 고정적임

TCP처럼 별도의 연결 절차가 필요없음 → 속도가 빠름

가상회선패킷교환방식

물리적인 방식이 아닌, 가상의 논리적인 경로를 정하고 데이터를 전송하는 방식

현재는 가상 회선 패킷 교환 방식을 사용하는 전통적인 네트워크는 줄어들고 있음

데이터그램패킷교환방식

연결 설정이 필요없고 빠른 전송 속도를 제공하며, 비신뢰적인 환경에서도 유연하게 동작할 수 있음

경로나 순서가 동적으로 변경될 수 있음

체크섬

TCP와 UDP의 헤더에 붙는 정보

데이터의 오류를 검출하는데 사용된다.

IP

Internet Protocol

데이터의 신뢰성을 보장하지 않고, 그냥 보내는 거에만 관심있는 프로토콜

따라서 패킷이 유실되거나 중복되어도 IP는 이를 무시함

: “잘 도착하는지 아닌지는 관심없어. “

패킷 스위칭을 사용하여 최적의 경로로 데이터를 전달(라우터 관여)

패킷 스위칭?

스위칭?

어떤 것을 교체/전환하는 행위

어떤 것 = 데이터 전송 경로.

즉, 패킷(쪼갠 것)의 전송 경로를 바꾼다(스위칭).

이짓을 왜 하냐?

가장 좋은/가장 빠른/최적화된 경로로 전달하려는 것이 목표 → 병목 현상과 연관됨

  • 최적의 경로 선택 대역폭, 지연 시간, 혼잡도 등을 고려함 (”이 경로가 제일 좋은데?)

정리하자면, 패킷 스위칭은 데이터를 작은 단위(패킷)로 쪼개어, 잘 전송하는 기술

Load Balancing (부하 분산) & 동적 경로 조정

네트워크는 항상 변함 그래서 특정 경로에 혼잡이 발생하면 동적으로 다른 경로로 데이터를 전송 (마치, 고속도로에서 2차선 갔다가 1차선 갔다가 칼치기하는 차같이.)

→ 경로의 스위칭(”이 경로 막히니까 버리고(끄고), 이 경로로 가자(켜자).”) → 특정 경로의 혼잡 회피

내 앞길 막지마

 

SP와 DP?

SP와 DP는 TCP와 UDP 통신(전송 계층)에서 사용됨

segment에 붙는 정보임

SP (Source Port): 출발지 응용 프로그램 포트 번호

DP (Destination Port): 목적지 응용 프로그램 포트 번호

이렇게 출발지 애플리케이션과 도착지 애플리케이션의 구체적인 포트 번호를 명시하기 때문에, 종단간 통신을 지원한다.

CRC (Cyclic Redundancy:중복 Check) 또는 체크섬(checksum)

수학적 함수가 적용된 값

프레임의 오류가 있는지 검증하는 것이 목표 → 데이터 링크 계층에서 사용됨

검증만이 목표이고 에러 보정은 수행하지 않음

송신 측: 이 값을 원본 데이터에 추가

수신 측: 수신측에서도 이 값을 자기나름대로 계산하여, 송신 측에서 전송한 체크섬/CRC 값과 비교함 → 값이 일치하면 데이터가 손상되지 않은 것임

  • 오류 보정은 에러 정정 코드(Error Correction Code)를 사용하여 수행됨. 비트 단위의 계산을 통해서, 원본 데이터를 정확하게 복구할 수 있도록 하는 기술임. 오류 보정은 물리 계층에서 일어난다.

MTU

Maximum Transmission Unit

장치가 받아들일 수 있는 가장 큰 PDU의 크기

일반적인 이더넷의 MTU는 1500바이트

중간의 모든 라우터, 스위치, 서버의 MTU가 고려되어야 하며, MTU값을 찾기 위해 PMTUD(Path MTU Discovery) 매커니즘이 사용될 수 있다.

MTU는 헤더의 크기와 페이로드의 크기를 합친 값

 

MSS

Maximum Segment Size

페이로드의 크기만을 고려한 것

맥에서는 ifconfig 명령을 통해 MTU를 확인할 수 있다. 대부분의 인터페이스가 1500인 것을 알 수 있다.
MSS를 1500바이트로 보내면 timeout 발생. 이 때, 헤더의 Don’t Fragment 플래그가 설정되어 있기 때문에 패킷이 쪼개지지 않은 채 전달되어 거부가 발생함
MSS를 1472바이트로 보내면 정상적으로 ping 명령이 수행되며, RTT가 60ms대 인 것을 확인할 수 있음

 

PMTUD

Path MTU Discovery

전송 가능한 최대 패킷 크기를 발견하기 위한 메커니즘

송신자가 네트워크상의 최대 MTU를 알지 못한다면 큰 패킷을 전송하다가 중간에 패킷이 단편화되는 문제가 발생할 수 있음

송신자는 PMTUD를 통해 네트워크 상의 MTU를 알 수 있음

→ 데이터 전송 중 발생할 수 있는 패킷 단편화 문제를 방지함

  1. 송신자는 초기에 가능한 가장 큰 MTU를 가정한 패킷을 전송. 이 크기는 일반적으로 1500바이트임
  2. 이 패킷이 라우터나 다른 장비들을 거치면서 전송 경로 상에서 최소 MTU를 가진 장비를 만나게 됨
  3. 이 장비가 패킷을 드롭함. "Destination Unreachable - Fragmentation Needed" 메시지를 송신자에게 반환함. 이 메시지는 "ICMP (Internet Control Message Protocol)"를 사용하여 전달됨
  4. 송신자는 이 메시지를 수신하고, 처음에 가정한 MTU보다 작은 크기의 패킷을 생성하여 전송함
  5. 이 과정을 반복하여 결국 전송 경로 상의 최소 MTU를 알아내고, 그 크기로 패킷을 조정하여 안정적으로 패킷을 전송함

Transmission과 Transport의 차이는?

Transmission은 데이터를 한 장치에서 다른 장치로 물리적으로 전송하는 과정을 의미하고, "Transport"는 전송 계층에서 데이터의 신뢰성과 순서를 보장하는 기능과 프로토콜을 의미한다. 즉, 각각 데이터 전송의 물리적 측면과 프로토콜 기능에 초점을 맞춘 것이다.

  • Transmission: 데이터를 한 장치에서 다른 장치로 전송하는 것 데이터 전송은 주로 물리적인 매체를 통해 이루어지며, 네트워크 상에서 데이터를 송신자에서 수신자로 전달하는 과정을 지칭한다. 물리 계층(Physical Layer)에서 데이터 전송이 이루어지며, 이 과정은 전기적 신호로 데이터를 전송하는 역할을 다. 데이터 전송은 네트워크의 성능, 대역폭, 속도 등을 포함한 다양한 요소에 영향을 받는다.
  • Transport: 전송 계층(Transport Layer)에 해당하는 기능이나 개념 전송 계층은 데이터의 신뢰성과 순서를 보장하는 역할을 담당한다. 대표적으로 TCP (Transmission Control Protocol)와 UDP (User Datagram Protocol)가 전송 계층의 프로토콜로 사용된다.

3-way 핸드쉐이크

TCP에서 사용됨

데이터를 안정적으로 전송하기 위해 세 개의 단계로 이루어진 절차다. "SYN, SYN-ACK, ACK" 메시지로 이루어진다.

  • Synchronize: 동시에 발생하게[움직이게] 하다
  • Acknowledge: 받았음을 알리다

  1. SYN (Synchronize): 클라이언트가 서버에게 보내는 메시지 클라이언트의 ISN이 담긴다. 클라이언트와 서버 간의 연결이 성립하려고 함
  2. SYN-ACK (Synchronize-Acknowledge): 서버가 클라이언트에게 보내는 메시지 SYN에는 서버의 ISN이 담기고, ACK에는 클라이언트의 ISN+1이 담긴다. 서버가 클라이언트의 요청을 받아들였음 클라이언트가 다시 서버에게 응답해야 함
  3. ACK (Acknowledge): 클라이언트가 서버에게 보내는 메시지 서버의 ISN+1이 담긴다. 실제 데이터를 전송할 준비가 되었음

3-way 핸드쉐이크가 완료되면 서버와 클라이언트 간에 안정적인 연결이 성립되고, 이후에는 데이터를 신뢰성 있게 주고받을 수 있게 된다.

ISN

Initial Sequence Number

고유한 32비트 시퀀스 번호

TCP 통신 세션을 초기화할 때 사용됨

각 TCP 연결마다 고유한 ISN이 부여된다.

ISN은 두 컴퓨터 간의 통신이 충돌되지 않게 하고, 신뢰성 있는 데이터 전송을 보장

4-way 핸드쉐이크

TCP 연결 해제 과정

  1. 클라이언트 → 서버: FIN 세그먼트 → 클라이언트:FIN_WAIT_1 상태
  2. 서버 → 클라이언트: ACK 승인 세그먼트 → 서버:CLOSE_WAIT 상태 & 클라이언트: FIN_WAIT_2 상태
  3. 서버: LAST_ACK 상태 → 일정 시간 이후에 → 클라이언트로 FIN 세그먼트를 보냄
  4. 클라이언트: TIME_WAIT 상태 & 서버로 ACK를 보냄 → TIME_WAIT으로 설정된 시간을 대기 → 서버: CLOSED 상태 → 클라이언트: CLOSED 상태
  • TIME_WAIT 지연 패킷을 대비하여 기다리는 시간(2 * MSL) → 데이터 무결성을 위함
  • MSL Maximum Segment Lifetime 패킷의 최대 수명 CentOS6, 우분투: 60초 윈도우: 4분

연결성립 + 연결해제과정 정리

 

(계속 작성 예정)

 

Reference

- https://www.inflearn.com/course/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%A9%B4%EC%A0%91-cs-%ED%8A%B9%EA%B0%95/dashboard

반응형

'Development > Network' 카테고리의 다른 글

Tunnel Bear VPN 사용법 & 후기(속도 테스트)  (0) 2019.12.26
Full Echo Q-Routing.. 개념 정리  (0) 2018.12.18
VPN과 Proxy(프록시)  (0) 2018.12.18
URI 와 URL  (0) 2018.12.18
TCP 소켓 전화기 비유  (0) 2018.12.18