웹서버의 문제 : 커넥션 리스(접속이라는 개념이 없음, 접속은 하는데 유지를 안 함))
개요
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실습때 했던 거처럼 구축.
구동을 하게 되면 주소창에 입력
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로 이동.
'kh교육' 카테고리의 다른 글
(20250814036)아파치 서버, TCP (0) | 2025.08.17 |
---|---|
(20250812034)DNS 서버 구성, tcp (신뢰적인 데이터 통신) (2) | 2025.08.12 |
(20250811033) DNS, tcp(신뢰적인 데이터 통신), 패킷지연,손실 (4) | 2025.08.11 |
(20250808032)다중 도메인서버, 전자서명, PKI 폼,배열 (3) | 2025.08.08 |
(20250807031)DNS서버, 키분배,해쉬함수 (1) | 2025.08.07 |