네이글 알고리즘은 네트워크에서 작은 데이터 패킷이 과도하게 전송되는 것을 방지하여 대역폭 사용을 최적화하고
혼잡을 줄이기 위한 알고리즘이다.

 

앞서 언급했듯이 소켓은 본질적으로 파일이라고 생각할 수 있다.

그러므로 소켓도 버퍼를 사용하게 되는데, 소켓에는 입력 버퍼와 출력 버퍼 2가지가 있다.

 

소켓에 send를 호출하면 우리가 보내고자 하는 내용이 소켓의 출력 버퍼에 복사된다.

복사된 데이터가 TCP 레이어에서 Segment가 되고, IP 레이어에서 Packet이 된다. 

 

Packet은 인터엣에서의 유통의 단위다. 네트워크에서 속도를 2가지로 정의 하는데, 하나는 bps고 다른 하나는 pps다.

bps는 초당 비트가 얼마만큼 전송이 되즌지를 나타내고, pps는 초당 패킷이 얼마만큼 전송 되는지를 나타낸다.

pps보다는 bps가 높아야 좋은 상황이라고 생각하면 된다.

 

packet은 Header와 payload로 구성되는데, 여기서 Header가 대략 40바이트의 크기를 갖는다.

만약 hello라는 문자열을 전송한다고 생각하면, 겨우 5바이트를 전송하려고 40바이트를 붙이는 아이러니한 상황이 생기게된다.

 

버퍼에 데이터를 많이 담아서 전송하면 bps가 증가하게 되는 것이므로 해당 알고리즘을 만들게 되었는데 이를 Nagle 이라 한다.

 

📌 네이글 알고리즘 동작 원리

네이글 알고리즘의 핵심 아이디어는 이전 패킷에 대한 ACK를 받기 전까지는 작은 패킷을 계속해서 모으는 것이다.

동작 과정

  1. 전송할 데이터가 MSS보다 크면 즉시 전송한다.
  2. 전송할 데이터가 MSS보다 작은데 이전 패킷에 대한 ACK를 받지 않았으면, 현재 데이터를 버퍼에 저장하고 추가 데이터를 기다린다. ACK를 받았으면, 즉시 새로운 패킷을 보낸다.

위처럼 동작하면 작은 데이터가 여러 개 있을 때, 첫 번째 데이터가 전송된 후 ACK을 받을 때까지 기다렸다가 한꺼번에 보낼 수 있어 네트워크 부하를 줄일 수 있다.

 

📌 네이글 알고리즘 단점

네이글 알고리즘이 항상 유리한 것은 아니다. 일부 환경에서 문제가 될 수 있다.

 

대기 시간이 중요한 프로그램에서의 문제

  • 실시간 프로그램( 게임, 금융 거래 등 )
    • 네이글 알고리즘이 적용되면 작은 데이터가 즉시 전송되지 않기 때문에 지연이 증가할 수 있다.
힙 단편화는 동적 메모리 할당 및 해제 과정에서 메모리가 비효율적으로 조각나면서 사용 가능한 메모리가 줄어드는 현상을 말한다. 단편화가 심해지면 메모리가 충분히 남아 있어도 큰 크기의 할당이 불가능해져 성능 저하와 메모리 낭비를 초래할 수 있다.

 

📌 힙 단편화의 종류

힙 단편화는 크게 외부 단편화와 내부 단편화로 나뉜다.

1️⃣ 외부 단편화

  • 할당과 해제를 반복하면, 작은 크기의 빈 공간(조각)이 여러 곳에 생겨 새로운 할당이 어려워지는 현상을 말한다.
  • 힙 메모리 전체 용량은 충분해도, 연속된 큰 블록을 할당할 공간이 부족해진다.
  • 메모리의 낭비가 발생하게 된다.
[  할당됨  ][  할당됨  ][ 빈 공간 ][  할당됨  ][ 빈 공간 ][  할당됨  ][ 빈 공간 ]

 

위와 같이 작은 빈 공간들이 여기저기 퍼져 있으면, 큰 크기의 데이터를 할당할 공간이 부족할 수 있다.

 

2️⃣ 내부 단편화

  • 메모리 할당 단위와 실제 요청 크기 간 차이로 인해 발생하는 낭비를 말한다.
  • 일반적으로 OS나 메모리 할당자는 페이지 크기( 보통 4KB ) 또는 특정 블록 크기 단위로 메모리를 관리한다.
  • 만약 64바이트 단위로 메모리를 할당하는 시스템에서 50바이트를 요청하면, 14바이트가 낭비 되는 것
[  64B 블록  ][  64B 블록  ][  64B 블록  ][  64B 블록  ]
[  50B 사용  ][  30B 사용  ][  10B 사용  ][  5B 사용   ]

 

위와 같이 일부 공간이 채워지지 않고 낭비된다.

 

📌 힙 단편화가 성능에 미치는 영향

1️⃣ 메모리 부족 문제 발생

  • 실제로 사용할 수 있는 메모리는 충분해도 단편화로 인해 새로운 할당이 불가능하다.

2️⃣ 메모리 접근 성능 저하

  • 캐시 친화도가 낮아지고, 불필요한 페이지 테이블 조회가 증가한다.

 

📌 힙 단편화를 줄이는 방법

1️⃣ 메모리 풀 사용

  • 미리 정해진 크기의 메모리 블록을 관리하여 단편화를 방지한다.

2️⃣ 메모리 압축

  • 외부 단편화를 줄이기 위해 메모리를 재정렬하는 방법을 말한다.

'CS' 카테고리의 다른 글

[CS] Bias ( 부동소수점 보정값 )  (0) 2025.04.15
[CS] 부동소수점  (0) 2025.04.15
[CS] 스택과 힙  (0) 2025.04.09
[CS] 메모리 보호 기법 ( ASLR )  (0) 2025.03.11
[cs] 문자열 상수  (0) 2025.02.23

스택의 용량이 무제한이라면, 힙이 필요할까?

 

📌 스택과 힙 간단 비교

특징 스택
할당 방식 자동 ( 컴파일러가 관리 ) 수동 ( 프로그래머가 malloc / free 관리 )
메모리 크기 일반적으로 작음 상대적으로 큼
할당 속도 매우 빠름 상대적으로 느림
데이터 수명 함수 실행 동안만 유지 free() 호출 전까지 유지
사용 방식 지역 변수, 함수 호출 스택 동적 할당된 객체, 대량 데이터

 

스택이 무제한이라면, 할당 속도가 빠르고, 자동 해제되므로 힙을 대체할 수 있을것 처럼 보인다.

하지만, 다음과 같은 이유 때문에 여전히 힙이 필요하다.

 

1️⃣ 데이터의 수명이 함수 호출을 넘어야 하는 경우

스택 변수는 함수가 종료되면 자동으로 해제된다.

 

int* createNumber() {
    int num = 42;  // 스택에 할당됨
    return #   // 잘못된 포인터 반환! (dangling pointer)
}

 

위 코드는 num의 주소를 반환하나, 함수가 끝나면 해당 변수의 메모리는 해제(소멸) 된다.

이때 힙을 사용하면, 함수가 끝난 뒤에도 데이터를 유지할 수 있다.

 

2️⃣  동적으로 크기가 변하는 데이터를 다룰 때

스택에서는 변수가 컴파일 타임에 크기가 정해져야 한다.

 

void stackExample(int size){
    int arr[size];
}

 

위 코드에서 size가 런타임에 결정되면, 일부 컴파일러에서 오류가 발생할 수 있다.

반면, 힙은 런타임에 동적으로 크기를 정할 수 있어 유연하다.

void heapExample(int size){
    int* arr = (int*)malloc(size * sizeof(int));
    free(arr);
}

 

동적 크기 조정이 필요한 경우, 힙이 필수적이다.

 

3️⃣ 동적으로 크기가 변하는 데이터를 다룰 때

스택은 Last In, First Out ( LIFO ) 구조이므로 중간 데이터를 자유롭게 관리하기 어렵다.

 

void example(){
    int a = 10;
    int b = 20;
    // 스택에서 b를 해제하고 a만 유지하는 것이 불가능하다.
}

 

힙은 필요할 때마다 메모리를 할당(malloc)하고, 필요 없을 때 해제(free)할 수 있어 더 유연하다.

 

4️⃣ 멀티스레드 환경에서 공유 메모리가 필요

스택은 각 스레드마다 독립적으로 할당되므로, 스레드 간 공유 데이터를 저장할 수 없다.

힙에 할당된 메모리는 여러 스레드에서 공유할 수 있다.

 

 

결론, 대부분의 현실적인 프로그램에서는 힙이 꼭 필요하다.

'CS' 카테고리의 다른 글

[CS] 부동소수점  (0) 2025.04.15
[CS] 힙 단편화  (0) 2025.04.09
[CS] 메모리 보호 기법 ( ASLR )  (0) 2025.03.11
[cs] 문자열 상수  (0) 2025.02.23
[CS] 빅 엔디안, 리틀 엔디안  (0) 2025.02.23
Echo Server는 클라이언트가 보낸 데이터를 그대로 다시 반환하는 서버를 말한다.
즉, 클라가 서버에 메세지를 전송하면, 서버는 그 메세지를 그대로 클라이언트에게 다시 보낸다.

 

🔹 Echo Server, Echo Client 의 주요 특징

  • 구현이 간단하기 때문에 네트워크 프로그래밍을 학습하는 초보자에게 적합하다.
  • 클라이언트와 서버 간 통신이 정상적으로 이루어지는지 확인할 때 유용하다.

 

TCP 기반 Echo Server

#include<winsock2.h>
#pragma comment(lib, "ws2_32")

int main()
{
    // 윈속 초기화
    WSADATA wsa = { 0 };
    if(::WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
    {
        puts("ERROR: 윈속을 초기화 할 수 없습니다.");
        return 0;
    }
    
    // 1. 접속대기 소켓을 생성한다.
    SOCKET hSocket = ::socket(AF_INET, SOCK_STREAM, 0);
    if(hSocket == INVALID_SOCKET)
    {
        puts("ERROR: 접속 대기 소켓을 생성할 수 없습니다.");
        return 0;
    }
    
    // 2. 포트 바인딩
    SOCKADDR_IN svraddr = { 0 };
    svraddr.sin_family = AF_INET;
    svraddr.sin_port = htons(25000);
    svraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    if(::bind(hSocket, (SOCKADDR*)&svraddr, sizeof(svraddr)) == SOCKET_ERROR)
    {
        puts("ERROR: 소켓에 IP주소와 포트를 바인드 할 수 없습니다.");
        return 0;
    }
    
    // 3. 접속대기 상태로 전환
    if(::listen(hSocket, SOMAXCONN) == SOCKET_ERROR)
    {
        puts("ERROR: 리슨 상태로 전환할 수 없습니다.");
        return 0;
    }
    
    // 4. 클라이언트 접속 처리 및 대응
    SOCKADDR_IN clientaddr = { 0 };
    int nAddrLen = sizeof(clientaddr);
    SOCKET hClient = 0;
    char szBuffer[128] = { 0 };
    int nReceive = 0;
    
    // 4.1 클라이언트 연결을 받아들이고 새로운 소켓을 생성한다. (개방)
    while((hClient = ::accept(hSocket,
        (SOCKADDR*)&clientaddr,
        &nAddrLen)) != INVALID_SOCKET)
    {
        puts("새 클라이언트가 연결되었습니다."); fflush(stdout);
        // 4.2 클라이언트로부터 문자열을 수신한다.
        while((nReceive = ::recv(hClient, szBuffer, sizeof(szBuffer, 0)) > 0)
        {
            // 4.3 수신한 문자열을 그대로 전송한다.
            ::send(hClient, szBuffer, sizeof(szBuffer), 0);
            puts(szBuffer); fflush(stdout);
            memset(szBuffer, 0, sizeof(szBuffer));
        }
        
        // 4.4 클라이언트가 연결을 종료한다.
        ::shutdown(hClient, SD_BOTH);
        ::closesocket(hClient);
        puts("클라이언트 연결에 끊겼습니다."); fflush(stdout);
    }
    
    // 5. 리슨 소켓 닫기
    closesocket(hSocket);
    
    // 윈속을 해제 한다.
    ::WSACleanup();
    return 0;
}

 

 

TCP 기반 Echo Client

#include <winsock2.h>
#pragma comment(lib, "ws2_32")


int main()
{
	// 윈속 초기화
	WSADATA wsa = { 0 };
	if (::WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
	{
		puts("ERROR: 윈속을 초기화 할 수 없습니다.");
		return 0;
	}

	//1. 접속대기 소켓 생성
	SOCKET hSocket = ::socket(AF_INET, SOCK_STREAM, 0);
	if (hSocket == INVALID_SOCKET)
	{
		puts("ERROR: 소켓을 생성할 수 없습니다.");
		return 0;
	}

	//2. 포트 바인딩 및 연결
	SOCKADDR_IN	svraddr = { 0 };
	svraddr.sin_family = AF_INET;
	svraddr.sin_port = htons(25000);
	svraddr.sin_addr.S_un.S_addr = inet_addr("192.168.77.2");
	if (::connect(hSocket,
		(SOCKADDR*)&svraddr, sizeof(svraddr)) == SOCKET_ERROR)
	{
		puts("ERROR: 서버에 연결할 수 없습니다.");
		return 0;
	}

	//3. 채팅 메시지 송/수신
	char szBuffer[128] = { 0 };
	while (1)
	{
		//사용자로부터 문자열을 입력 받는다.
		gets_s(szBuffer);
		if (strcmp(szBuffer, "EXIT") == 0)
        {
            break;
        }

		//사용자가 입력한 문자열을 서버에 전송한다.
		::send(hSocket, szBuffer, strlen(szBuffer) + 1, 0);
		//서버로부터 방금 보낸 문자열에 대한 에코 메시지를 수신한다.
		memset(szBuffer, 0, sizeof(szBuffer));
		::recv(hSocket, szBuffer, sizeof(szBuffer), 0);
		printf("From server: %s\n", szBuffer);
	}

	//4. 소켓을 닫고 종료.
	//::shutdown(hSocket, SD_BOTH);
	::closesocket(hSocket);
	//※윈속 해제
	::WSACleanup();
	return 0;
}

 

🔹 Wire shark로 연결 상태 확인

앞서 배운 내용 처럼 서버를 실행하고 클라를 실행한후 port를 25000으로 지정하면 

3 Way Handshake를 수행한 결과를 위 그림처럼 와이어 샤크로 확인할 수 있다. [SYN], [SYN, ACK], [ACK]

 

 

일반적인 데이터 주고 받을때

 

 

일반적인 종료 상황에서의 4 Way Handshake

4 Way handshake 종료 과정에서 클라이언트가 FIN 패킷을 전송한 후, 상대방의 ACK를 받은 뒤 일정 시간
동안 유지 되는 상태를 말한다.

 

📌 이유

마지막 ACK 패킷이 손실될 가능성이 있기 때문에 재전송을 대비해 일정 시간 동안 종료하지 않고 머문다.

네트워크에 남아있는 패킷( 지연된 패킷 )으로 인해 문제가 발생할 수 있기 때문에 대기한다.

  • 앞서 말한 문제란, 이전 연결에서 남아 있는 패킷이 새로운 연결에 영향을 미칠 수 있는 것을 말한다.

 

✅ TIME_WAIT 기본 조건

  • 일반적으로 2 * MSL 동안 유지 된다.
  • MSL은 한 패킷이 네트워크에서 생존할 수 있는 최대 시간을 말한다. ( 보통 30초에서 최대 2분 )
  • 즉, TIME_WAIT 상태는 1 ~ 4분 정도 유지 된다.

 

TIME_WAIT 상태가 많아지면, 서버의 포트가 빠르게 소진되어 새로운 연결을 맺기 어려울 수 있다.

이를 해결하기 위한 방법은 아래와 같다.

 

  1. 소켓 옵션 조정
    • SO_REUSEADDR 옵션 사용
      • 동일한 포트를 재사용할 수 있도록 허용하는 옵션이다.
      • 단, 이는 TIME_WAIT 상태를 없애는 것이 아니고, 해당 포트를 다른 프로세스가 빠르게 재사용 할 수 있도록 해준다.
  2. TcpTimeWaitDelay 값 줄이기
    • TcpTimeWaitDelay는 TIME_WAIT 상태를 유지하는 시간을 설정하는 레지스트리 값이다. 기본값은 240초 이지만, 이를 30초 정도로 줄여주면 포트가 빨리 해제된다.
4 Way Handshake는 TCP 연결 종료 과정에서 사용되는 절차를 말한다.
TCP 연결을 종료할 때 양쪽이 각각 연결 종료를 확인해야 하기 때문에 4단계 절차가 필요하다.

 

📌 4 Way Handshake 과정

 (1) FIN -> 연결 종료 요청 ( Client -> Server )

  • 클라이언트가 더 이상 데이터를 보낼 필요가 없으면 FIN 플래그를 설정하여 서버에게 보낸다.
  • 클라는 더 이상 데이터를 보내지 않고, 서버의 응답을 기다리고 있는 상태

(2) ACK -> 종료 요청 확인 ( Server -> Client )

  • 서버는 클라이언트의 FIN을 받았다는 것을 확인한 후 ACK(응답) 패킷을 보낸다.
  • 아직 서버는 데이터를 더 보낼 수 있는 상태

(3) FIN -> 서버도 연결 종료 요청 ( Server -> Client )

  • 서버도 모든 데이터를 보낸 후, 클라이언트에게 FIN 패킷을 보내면서 연결 종료 요청을 한다.
  • 이제 서버도 더 이상 데이터를 보낼 필요가 없으므로 종료 절차를 시작한다.

(4) ACK -> 연결 종료 확인 ( Client -> Server )

  • 클라이언트는 서버의 FIN 패킷을 받으면 ACK(확인 응답)을 보낸다.
  • 이제 연결이 완전히 종료되고, 서버와 클라 모두 더 이상 데이터 전송을 하지 않는다.

 

📌 4 Way Handshake가 필요한 이유

TCP는 양방향 통신을 지원하기 때문에 양쪽이 각각 연결을 종료해야 한다.
  • 3 Way Handshake는 한쪽이 요청을 보내면 상대방이 바로 응답하는 방식
  • 4 Way Handshake는 두 개의 독립적인 FIN + ACK 과정이 필요하다.

'IT' 카테고리의 다른 글

[IT] TIME_WAIT  (0) 2025.04.09
[IT] Sliding Window ( 슬라이딩 윈도우 )  (0) 2025.04.08
[IT] 3 Way Handshake  (0) 2025.04.08
[IT] 운영체제 명령어 삽입 ( OS Command Injection )  (0) 2025.04.01
[IT] 크로스사이트 스크립트  (0) 2025.04.01
슬라이딩 윈도우는 TCP 흐름 제어와 패킷 전송 최적화를 위해 사용되는 기술이다.
데이터를 효율적으로 보내고, 수신 측이 처리할 수 있는 만큼만 보내도록 조절하는 메커니즘을 말한다.

 

📌 Sliding Window 개념

TCP는 데이터를 세그먼트 단위로 전송한다. 하지만 매번 한 개의 패킷을 보내고 ACK(응답)를 기다리면 속도가

너무 느려지기 때문에, 여러 개의 패킷을 연속적으로 보낼 수 있도록 허용하는 기법을 Sliding Window라 한다.

 

✅ Sliding Window 방식

  • 송신자는 미리 여러 개의 패킷을 보내고, ACK을 기다린다.
  • 수신자는 데이터를 받은 후 ACK를 보낸다.
  • 일정 개수의 세그먼트(윈도우 크기)만큼만 한 번에 전송 가능하다.

📌 Sliding Window 동작 방식

Sliding Window는 윈도우 크기에 따라 한 번에 보낼 수 있는 패킷 개수를 결정한다.

즉, ACK 없이 미리 보낼 수 있는 데이터 양을 정하는 것이다.

  • 윈도우 크기 = 4일 경우, 송신자는 4개의 패킷을 연속적으로 보낼 수 있고, 이후 ACK을 받아야 다시 보낼 수 있다.

  송신 윈도우와 수신 윈도우

  • 송신 윈도우 : 송신자가 한 번에 보낼 수 있는 데이터 크기
  • 수신 윈도우 : 수신자가 한 번에 받을 수 있는 데이터 크기
  • 수신 윈도우 크기에 따라 송신 윈도우의 크기가 조정된다.
송신자                                      수신자
---------------------------------------------------
SEQ=1 [패킷1]  ---->   
SEQ=2 [패킷2]  ---->   
SEQ=3 [패킷3]  ---->   
SEQ=4 [패킷4]  ---->  (한 번에 4개 전송 완료!)

(수신자가 패킷을 받은 후)  
<----  ACK=5  (1~4번 패킷 정상 수신!)

SEQ=5 [패킷5]  ---->   
SEQ=6 [패킷6]  ---->   
...

 

위 처럼 송신자는 ACK을 기다리지 않고, 미리 4개 패킷을 보낼 수 있다.

ACK을 받으면 다음 데이터를 연속적으로 보낼 수 있다.

 

📌 윈도우 크기 조절 ( 흐름 제어 & 혼잡 제어 )

TCP에서는 윈도우 크기를 동적으로 조절하여 네트워크 상태에 맞게 최적의 속도로 데이터 전송을 수행한다.

 

🔸 흐름 제어 ( Flow Control )

  • 송신자가 너무 많은 데이터를 보내면 수신자가 처리하지 못하는 경우가 발생한다.
  • 수신자는 자신의 수신 윈도우 크기를 조정하여 한 번에 받을 수 있는 데이터 크기를 제한한다.
  • 수신 윈도우 크기가 0이 되면 일시적으로 전송을 중지한다..

🔸 혼잡 제어 ( Congestion Control )

  • 네트워크에 트래픽이 너무 많으면 패킷 손실이 발생할 수 있다.
  • 송신자는 혼잡 윈도우를 활용하여 네트워크 상태에 맞게 전송량을 조절한다.
    • 혼잡 윈도우는 TCP에서 네트워크 혼잡을 방지하기 위해 송신자가 조절하는 윈도우 크기를 말한다.

'IT' 카테고리의 다른 글

[IT] TIME_WAIT  (0) 2025.04.09
[IT] 4 Way Handshake ( TCP 연결 종료 )  (0) 2025.04.09
[IT] 3 Way Handshake  (0) 2025.04.08
[IT] 운영체제 명령어 삽입 ( OS Command Injection )  (0) 2025.04.01
[IT] 크로스사이트 스크립트  (0) 2025.04.01
TCP 3-Way Handshake는 신뢰성 있는 연결을 설정하기 위해 클라이언트와 서버 간에 세 번의 패킷 교환을 수행하는 과정을 말한다.

 

📌 개요

TCP는 연결형 프로토콜로, 데이터 전송 전에 송신자와 수신자가 서로 연결을 설정해야한다.

이를 위해 TCP는 3 Way Handshake를 사용하여 다음을 보장한다.

  • 양쪽이 데이터 전송 준비가 되었는지 확인
  • 초기 시퀀스 번호( ISN )를 교환하여 데이터 순서를 유지
  • 네트워크 상태를 점검하여 적절한 패킷 크기 및 흐름 제어 설정

📌 과정

 Step 1 : 클라이언트 -> 서버 ( SYN )

클라이언트가 서버에 연결 요청을 보낸다.

  • 클라이언트가 TCP 소켓을 열고, SYN 플래르가 설정된 패킷을 전송한다.
  • 이 패킷에 초기 시퀀스 번호 ( ISN )가 포함된다.
  • 윈도우 크기( Window Size), MSS, 윈도우 스케일( Window Scaling ) 등의 옵션 정보가 포함된다.

 Step 2 : 서버 -> 클라이언트 ( SYN + ACK )

서버가 클라이언트의 요청을 수락하고 응답을 보낸다.

  • 서버는 클라이언트의 SYN 요청을 수락한 후, SYN + ACK 플래그가 설정된 패킷을 전송한다.
  • 이 패킷에 서버의 초기 시퀀스 번호( ISN ) 와 클라이언트의 SYN에 대한 응답 번호(ACK)가 포함된다.

 Step 3 : 클라이언트 -> 서버 ( ACK )

클라이언트가 최종적으로 서버에 연결 완료를 알린다.

  • 클라이언트는 서버가 보낸 SYN + ACK 패킷을 받은 후, ACK 플래그가 설정된 패킷을 다시 서버로 보낸다.
  • 이 패킷에 서버의 SYN에 대한 응답 번호 ( ACK )가 포함된다.

📌 3 Way Handshake에서 설정되는 TCP 옵션

  • MSS : 한 번에 전송할 수 있는 최대 세그먼트 크기
  • 윈도우 크기 : 수신 가능한 버퍼 크기
  • 윈도우 스케일링 : 윈도우 크기 확장 옵션
  • 타임스탬프 : 패킷의 RTT 측정

📌 3 Way Handshake가 실패하는 경우

  • SYN 패킷이 도착하지 않는 경우
  • SYN + ACK 패킷이 도착하지 않는 경우
  • ACK 패킷이 도착하지 않는 경우

📌 3 Way Handshake가 성공하고 나서 데이터 전송

  • 클라이언트가 데이터를 전송한다 ( Sequence Number = 1001 )
  • 서버가 응답한다. ( ACK = 1001 )
  • 이후, Sliding Window를 활용하여 빠르게 데이터를 전송한다.
외부 입력이 시스템 명령어 실행 인수로 적절한 처리 없이 사용되면 위험하다.
일반적으로 명령어 줄 인수나 스트림 입력 등 외부 입력을 사용하여 시스템 명령어를 생성하는 프로그램이 많이 있다.
하지만 이러한 경우 외부 입력 문자열은 신뢰할 수 없기 때문에 적절한 처리를 해주지 않으면, 
공격자가 원하는 명령어 실행이 가능하게 된다.

'IT' 카테고리의 다른 글

[IT] Sliding Window ( 슬라이딩 윈도우 )  (0) 2025.04.08
[IT] 3 Way Handshake  (0) 2025.04.08
[IT] 크로스사이트 스크립트  (0) 2025.04.01
[IT] 자원 삽입 ( Resource Injection )  (0) 2025.04.01
[IT] SQL 삽입 ( SQL Injection )  (0) 2025.04.01
웹 페이지에 악의적인 스크립트를 포함시켜 사용자 측에서 실행되게 유도할 수 있다.

 

아래 그림과 같이 검증되지 않은 외부 입력이 동적 웹페이지 생성에 사용될 경우, 전송된 동적 웹페이지를 열람하는 접속자의 권한으로 부적절한 스크립트가 수행되어 정보유출 등의 공격을 유발할 수 있다.

 

'IT' 카테고리의 다른 글

[IT] 3 Way Handshake  (0) 2025.04.08
[IT] 운영체제 명령어 삽입 ( OS Command Injection )  (0) 2025.04.01
[IT] 자원 삽입 ( Resource Injection )  (0) 2025.04.01
[IT] SQL 삽입 ( SQL Injection )  (0) 2025.04.01
[IT] 레이턴시 ( Latency )  (2) 2024.10.24

+ Recent posts