kh교육

(20250813035)apache서버,Go-Back-N, Selective Repeat

boangod 2025. 8. 13. 22:39

웹서버의 문제 : 커넥션 리스(접속이라는 개념이 없음, 접속은 하는데 유지를 안 함))

 

 

개요

 

HTTP : Hyper text transfer protocol

■  Web application layer protocol

■  Client/server model

      • Client : browser는 웹용 client app, 질의를 전달하고 요구한 web page를 보여주는 기능을 담당

      • Server : Web server로 client의 질의에 응답하고 여러 web object를 client에 전송한다.

■  HTTP 1.0 : RFC 1945

■  HTTP 1.1 : RFC 2068

 

 

  Apache

• 공식 홈페이지: www.apache.org

• 1995년 NCSA httpd 1.3을 기반으로 탄생

• GNU GPL 라이센스를 통해 무료 배포

• 가장 높은 웹 서버 소프트웨어 시장 점유율

• 현재 2.2.X 버전이 발표

• 빠른 버그패치와 공개로 보안성이 뛰어남

• 거의 모든 플랫폼을 지원

A patch server에서 유래

 

 

설치과정

 

/usr/local/

 

dnf install -y gcc gcc-c++ cmake apr apr-util zlib-devel wget net-tools expat-devel

 

wget https://archive.apache.org/dist/httpd/httpd-2.2.34.tar.gz

 

tar xvfz httpd-2.2.34.tar.gz

 

cd./httpd-2.2.34

 

./configure --prefix=/app/apache --enable-so

 

make

 

make install

 

 

prefix → 어디에 설치될지 지정하는 거

--enable-so → 기능을 추가할 때 컴파일 새로 안 하고 기능을 추가할 수 있게 하는 거

make → 만드는 과정

make install → 설치하는 과정

 

 

주요 구성 파일

 

• 실행 데몬 : /app/apache/bin/httpd

• 관리 스크립트 : /app/apache/bin/apachectl

• 설정 파일 : /app/apache/conf/httpd.conf

• 초기 서비스 파일 : /app/apache/htdocs/index.html

• 컴파일 옵션에 따라 달라질 수 있다.

• 추가 설정

/app/apache/conf/httpd.conf에 'ServerName localhost'를 추가한다.

 

Apache 서버 구동

 

# /app/apache/bin/apachectl start (stop | restart)

 

 

==========================================

실습

 

네임서버 : 192.168.10.146

웹 서버 : 192.168.10.147

 

네임서버는 저번 dns실습때 했던 거처럼 구축.

 

구동을 하게 되면 주소창에 입력

http://www.st10.sec

192.168.10.147

ㄴ 기본 DNS를 192.168.10.11로 설정

 

 

==========================================

 

 

 

아파치 설정파일 → httpd.conf

extra = 특정목적에 사용되는 애들을 빼놓았음

ㄴ 사용하려면 httpd.conf에서 불러와서 사용해야 함.

 

 

 

httpd.conf 파일의 구문 점검

 

# /app/apache/bin/httpd -t

• httpd.conf 파일의 문법상의 오류를 찾아준다.

• “Syntax OK” : 오류 없음

 

3개의 섹션으로 구성

• 전역 환경 설정 부분

• 기본 서버 구성

• 가상 호스트 부분 - 이건 없음

 

 

전역 환경 설정

 

ServerRoot “/app/apache” → 기본적으로 어디에 파일들이 저장되는지 정하는 거

    • 웹서버의 설정파일, 로그파일 등이 저장되는 최상위 디렉토리

Timeout 120 → 클라가 서버로부터 기다리는 시간

    • 클라이언트와 아무런 메시지가 없을 때에 오류로 처리되는 초 단위 시간

MaxClients 150 → 메모리에 서버프로세스가 동시에 150개까지 뜰 수 있음.

    • 접속 가능한 최대 client 수

Startservers 20 → 소캣을 제한하는 거

    • 초기 서버 프로세스의 수

MinSpareServers/MaxSpareServers → 잘 지정은 안 함.

    • 대기 상태의 프로세스 수

ServerName [명칭] → 반드시 지정해야 함. (보통 local host라고 지정)

    • DNS나 hosts 파일에 등록된 Apache 서버의 이름

 

 

기본 서버 구성 → 서버에 여러 번 나올 수도 있다.

ㄴ 서비스하는 서버에 해당함

 

DocumentRoot “/app/apache/htdocs” → 클라가 접속하면 맨 처음 열리는 파일(고쳐야 함!)()

• 웹서버의 홈 디렉토리

DirectoryIndex index.html index.java index.php →

• 메인페이지 파일명

ErrorLog logs/error_log → 컴바인 형식으로 저장해 주세요

• 웹서버에 문제가 발생 시에 에러를 기록하는 로그파일.

CustomLog logs/access_log combind

• 외부에서 접근한 기록에 대한 로그파일

UserDir public_html → 개인 홈디렉터리 지정해 주는 거.

• 개인 홈디렉토리 지정

ServerAdmin root@localhost

• 관리자의 메일주소

 

Directory 설정

 

<Directory “/app/apache/htdocs”> … </Directory>

• 웹서버는 디렉토리 단위로 설정

 

<Directory "/app/apache/htdocs">

  Options Indexes FollowSymLinks → 외부에 있는 파일에 심볼릭 링크를 허용하냐 안 하냐

  AllowOverride None → 어디 들어갈 때 아이디 비번을 입력하라고 뜸.(데이터베이스에서 연동해야 함)

  IndexOptions Charset=UTF-8 → 이거 안 하면 한글 다 깨짐.

  Order allow, deny → 예전 방식, 디렉터리에 들어올 수 있는 ip 지정

  Allow from all → 모든 아이피에서 접속할 수 있음.

</Directory>

 

 

option 항목

 

• ALL : 가능한 모든 옵션을 다 사용한다.

• None : 아무런 옵션도 없다.

• Indexes : 메인 페이지가 없는 경우 파일 목록을 보여준다.

• FollowSymLinks : 디렉토리의 심볼릭 링크를 이용한다.

• ExecCGI : CGI를 실행한다.

 

IndexOptions 항목

• Charset=UTF-8 : 디렉토리나 파일명을 UTF-8로 엔코딩 한다.

 

AllowOverride 항목

• 디렉토리에 대한 apache 레벨에서의 접근 제한

• 사용자 인증 파일인. htaccess 파일 사용여부

• 현재 인증은 apache 레벨에서 구현하지 않는다.

 

Order 항목(2.2)

• 접근 권한 적용 순서

ex)

Order deny, allow

Deny from all

Allow from 192.168.123.- 192.168.123.으로 시작하는 IP를 제외하고 모든 접속을 막는다.

ㄴ 192.168.123.으로 접속하는 애들은 다 접속 가능

 

 

Require 설정

Require 설정 Require all [denied | granted] : 기본 설정 

Require [not] ip ip_주소 : IP별 설정 → 특정한 거만 지정하겠다.

 

  Require all granted

  Require not ip 192.168.123.0/24

  • 192.168.123.0 네트워크를 제외하고 모두 접속 허용
  • - not 안쓰면 지정한 애만 허용한다는 거, 나머지는 모름.

 

자기 할 일만 하면 됨.

지금은 require 많이 사용함.

 

 

각 사용자의 개인 홈디렉토리에 대한 설정 예

 

<Directory "/home/*/public_html">

 Options Indexes FollowSymLinks

 AllowOverride None

 Order allow, deny

 Allow from all

</Directory>

 

 

<Directory "/home/*/public_html">

 Options Indexes FollowSymLinks

 AllowOverride None

 Require all granted

</Directory>

 

==========================================

실습

DocumentRoot 바꿔보기

 

 

mkdir -p./httpd/html

cd /httpd/html

vi index.html    →  <html><body><h1> this is main page </h1></body></html>

 

 

vi /app/apache/conf/httpd.conf

 

수정하고

/app/apache/bin/apachectl restart

하면 바뀐 페이지로 나오는 걸 확인할 수 있습니다.

 


 

tcp

 

Pipelining : sender에게 ACK를 기다리지 않고 여러 개의 pkt를 전송하도록 하용 하는 것

 

piplining protocol : go-Back-N, selective repeat

 

 

 

go-Back-N

 

기본 ack10 = ack10을 잘 받았어 8번 9번은 잘 몰라

누적 ack10 = 10번까지 잘 받았어 8번도 잘 받았고 9번도 잘 받았어.

 

Go-Back-N = 누적 ACK

timeout발생하면 재전송함.

go-Back-N에서 타이머는 윈도우 안에 가장 오래된 패킷 안에 있다.

윈도우 안에 있는 가장 오래된 패킷 = send_base

 

 

ACK(n) → n번까지 잘 받았다는 뜻.

가장 오래된 수신확인 안 된 timer를 단일 timer로 사용한다. → send_base에만 timer 있음.

Timeout 발생 시 : 송신되었으나 ACK가 없는 모든 pkt를 재전송한다.

ㄴ (window내에 전송된 모든 pkt)

 

 

sender

 

timer

■  send_base에 단일 timer

 

상위 layer에서 Data가 수신되면

■  pkt의 다음 seq#를 검사 window내에 있으면 pkt를 전송한다.

 

timeout(n)

■  send_base에서부터 윈도우 내에 모든 패 킷을 재전송한다.

 

ACK(n) 이 수신

■  n < send_base  →  무시.

■  n >= send_base   

• send_base를 윈도우내에 미확인 패킷 중 가장 오래된 패킷으로 이동

• 윈도내에 미발송 패킷 전송

 

receiver

 

pkt n [n in rcvbase, rcvbase+N-1]

■ 누적 ACK을송신

■  out-order인 경우: 버림. → 내가 안기다리는 것이 오는 것.

■  in-order인 경우: 정상처리 → 처리를 한다.
     - 아크날리지가 중복될 수 있다.

■  이외의 경우는 무시한다.

 

■ ACK만 사용 → pkt가 수신될 때마다 항상 현재까지 수신된 가장 높은 seq#를 가진 pkt에 대한 ACK를 전송한다.

• 중복된 ACK가 발생할 수 있다.

• 단지 expectedseqnum만을 유지한다. → 현재까지 수신된 pkt의 seq#의 다음 seq#

■  순서가 잘못 수신된 pkt의 처리

• 그냥 버린다. → 순서가 잘못된 pkt에 대해서 buffering 할 필요가 없다.

• 현재까지 수신된 가장 큰 seq#에 대한 ACK를 재전송한다.

 

 

 

문제 풀어보기

 

window size 4 mss

seq : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12

 

1. 문제없이 패킷이 전달되는 경우
2. seq 2번 패킷이 손실되는 경우
3. ACK 2번 손실되는 경우

 

 

selective repeat

 

go-Back-N에서 타이머는 send_base안에만 있지만, Selective Repeat 모든 패킷이 timer를 가지고 있다.

그래서 timeout이 발생해도 모든 pkt을 보내지 않아도 된다.

 

 

 

sender

 

상위 layer에서 Data가 수신되면

- pkt의 다음 seq#를 검사 window내에 있으면 pkt를 전송한다.

 

timeout(n)

- timeout이 발생한 pkt n을 재전송하고 timer를 restart 한다.

 

ACK(n) 이 수신

- n이 윈도우에 있다면 pkt가 수신된 것을 확인한다.

- n이 send_base와 같다면 send_base는 가장 작은 seq#를 갖는 미확인 pkt로 이동하고 window내에 이 전송 pkt 가 있으면 전송한다.

 

 

receiver

 

pkt n [n in rcvbase, rcvbase+N-1]

 

- ACK(n)을 송신

 

- out-order인 경우 buffering 한다.(메모리에 보관)

 

- in-order인 경우 필요하다면 buffer에 저장된 번호가 연속적인 pkt와 함께 상위 layer에 전달하고 rcv_base를 가장 낮은 seq#를 가진 미전송 pkt로 옮긴다.

 

 

pkt n [n in rcvbase-N, rcvbase-1]

 

- ACK(n)

 

이 외의 경우는 무시한다.

 

불필요한 재전송은 없음.

 

 

 

 

내가 그려본 selective repeat

 

sender

(위에서부터 1번)

1번

  • 1, 2, 3, 4번 패킷 전송 (2, 3번 손실)
  • 1, 4번 패킷 ACK 수신 
  • 2, 3번 ACK는 못 받음

2번

  • 1번 패킷은 ACK를 받았으므로 윈도우가 앞으로 한 칸 이동.
  • 5번 패킷 새로 전송.
  • 2, 3번은 timeout 대기 중.

3번

  • 2, 3번이 timeout 되어 재전송.
  • 개별 타이머 덕분에 손실된 것만 재전송.
  • 모두 ACK 받으면 윈도우가 6~9로 이동.

 

 

receiver

 

패킷을 받으면 ack를 보냄.(못 그림... 수정 필요)

(위에서부터 1번)

1번

  • 1, 2, 3, 4번 패킷 수신 (2번 손실)
  • 1번은 바로 app로 전달
  • 3, 4번은 버퍼에 저장
  • 윈도우 앞으로 한 칸 이동

2번

  • 5번 패킷 수신
  • 5번 버퍼에 저장
  • 2번이 비어 있으므로 3, 4, 5번은 app로 전달하지 않음

3번

  • 2번 재전송 후 패킷 수신
  • 2, 3, 4, 5번 app로 전달
  • 다 전달되었기 때문에 윈도우가 6~9로 이동.