1-1 프록시 서버 개요 및 Cache 디렉터리 생성
프록시 서버 개요
프록시 서버란?
- 인터넷의 캐시 프로그램으로 사용자가 계정을 가진 호스트 컴퓨터에서 최근 자료를 보관하는 저장장소
- 같은 자료 요구시 프록시 서버내의 cache에 있는 자료 제공으로 더 빠른 처리가능
- 사용자는 프록시 서버를 통해 자료를 받아오겠다는 사실을 호스트에 알려야 프록시 서버를 통해 자료 받기 가능
- 최근 자료 이용시 전송 속도가 빠르다는 장점이 있으나, 프록시에 미리 저장되지 않은 자료를 찾는 경우에 프록시 서버를 거쳐 가기 때문에 더 느려 질 수도 있음
프록시 서버 동작
- Hit인 경우 프록시 서버 내의 cache에 있는 자료를 제공하여 빠른 전송
- Miss인 경우 프록시 서버를 거쳐 Web Server에 자료 요청후 받아와서 전송
Hit, Miss
- 프록시 서버 내의 cache에서 해당자료를 갖고 있는지에 대한 응답
프록시 캐시 생성
해시 함수
캐시된 URL을 암호화 하기 위해 해시 함수 이용.
해시 함수(hash function) : 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이며, 얻어지는 값은 해시 값, 해시 코드, 해시 체크섬 또는 해시라고 함. 종류로는 MD5, SHA, CRC32
이 프로젝트에서는 미국 국림 표준 기술 연구소에서 발표한 최초의 함수 SHA1를 이용할 것임
SSH, SSL에서 많이 사용되고 있고, text data(최대 2^64 bits)를 160bits의 값으로 반환해줌.
URL의 길이는 가변적이기 때문에 해시 함수를 이용
시스템 콜
디렉터리를 생성하기 위한 mkdir 사용
헤더
SHA1함수를 이용하기 위해 openssl/sha.h 추가
디렉터리를 읽기 위한 dirent.h
문자열 string관련 함수를 위한 string.h
구현
내용: 캐시 디렉터리 생성 및 URL 해싱, HIT시 동작
홈에 캐시 디렉터리 생성 및 해시된 URL의 앞의 3글자는 디렉터리 명, 나머지 글자는 파일 이름으로 저장
// encrypt
char *sha1_hash(char *input_url, char *hashed_url){
unsigned char hashed_160bits[20];
char hashed_hex[41];
SHA1(input_url, strlen(input_url), hashed_160bits);
for(int i=0; i<sizeof(hashed_160bits); i++)
sprintf(hashed_hex + i*2, "%02x", hashed_160bits[i]);
strcpy(hashed_url,hashed_hex);
return hashed_url;
}
input url을 입력 받아 hash 값으로 저장된 160bit(20bytes)의 hashed_url 저장 및 반환 하는 함수
char *getHomeDir(){
struct passwd *usr_info = getpwuid(getuid());
return usr_info->pw_dir;
}
캐시 저장소를 위한 디렉터리를 생성하기 위해 상대경로가 아닌 home 디렉터리를 이용하기 위한 함수
int main(void){
umask(0000);
char input_url[41];
char hashed_url[41];
char homeDir[41];
char cacheDir[41];
strcpy(homeDir,getHomeDir());
strcpy(cacheDir,homeDir);
strcat(cacheDir,"/cache/");
if (!opendir(cacheDir)){
if (mkdir(cacheDir,0777) < 0){
printf("ERROR: can't make cacheDir\n");
}
}
while(1){
char dirPath[51] = {0,};
char filePath[101] = {0,};
char dirName[4] = {0,};
char fileName[41] = {0,};
memset(dirPath, 0, sizeof(dirPath));
memset(filePath, 0, sizeof(filePath));
memset(dirName, 0, sizeof(dirName));
memset(fileName, 0, sizeof(fileName));
printf("input URL > ");
scanf("%s", input_url);
if(!strcmp("bye",input_url))
break;
strcpy(hashed_url,sha1_hash(input_url,hashed_url));
strncpy(dirName,hashed_url,3);
strcat(dirName,"/");
strcpy(dirPath, cacheDir);
strcat(dirPath, dirName);
strcat(fileName,hashed_url + sizeof(char) * 3);
strcpy(filePath, dirPath);
strcat(filePath, fileName);
if(!opendir(dirPath)){
if(mkdir(dirPath,0777) < 0)
printf("ERROR: can't make dirName\n");
}
if(access(filePath, F_OK) < 0){
if(open(filePath, O_CREAT, 0777) < 0)
printf("ERROR: can't make fileName\n");
}
}
return 0;
}
1. home 디렉터리의 경로를 가져와 캐시 디렉터리가 없다면 생성
2. 입력 URL이 bye일 때까지 해시된 캐시 디렉터리 및 파일 생성 동작
3. 해시 함수를 이용하여 입력 URL 해시된 URL로 변경
3. strncpy, strcat 등 적정한 string 함수를 이용하여 해시된 URL을 디렉터리명, 파일 명으로 저장
4. 캐시 디렉터리 경로에 디렉터리명과 파일 명을 이용해 디렉터리와 파일에 접근
5. 디렉터리나 파일이 존재 하지 않다면 생성하고, 생성 실패시 에러 출력
세개의 URL 입력후 bye 입력
캐시 디렉터리에 세개의 해쉬된 URL 생성
tree 명령어 사용 안될 시
sudo apt-get install tree 를 통해 설치 후 사용
'CS > 시스템 프로그래밍' 카테고리의 다른 글
mkdir 명령어 구현 예제 (0) | 2022.07.19 |
---|---|
시스템 프로그래밍 개요 (0) | 2022.07.19 |
댓글