
2025.05.05
오늘한 내용 : CS - 네트워크 프로그래밍 - 11.5 ~ 11.7
WEEK08: BSD소켓, IP, TCP, HTTP, file descriptor, DNS
<b>bold</b> → 굵은 글씨<a href="http://cmu.edu">link</a> → 링크 클릭 시 다른 서버에 요청 전송Content-Type: text/html // HTML 문서
Content-Type: text/plain // 일반 텍스트
Content-Type: image/png // PNG 이미지
Content-Type: application/json // JSON 데이터
/, ?)/ → 경로(path)? → 쿼리 문자열(query string)? 뒤에 있는 문자열을 프로그램에게 전달함 (환경변수 또는 stdin으로)참고:
adder는 실행 파일?num1=3&num2=5는 파라미터QUERY_STRING 환경변수로 이 값을 전달받음| URL 예시 | 의미 | 처리 방식 |
|---|---|---|
/home.html | 정적 파일 | 파일 시스템에서 읽기 |
/cgi-bin/adder?x=1&y=2 | 동적 실행 + 파라미터 전달 | CGI 실행 후 stdout 결과 전송 |
/images/icon.png | 정적 이미지 | MIME image/png로 응답 |
/api/user?id=42 | 보통 동적 (DB 조회 등) | JSON 반환 + Content-Type: application/json |
\r\n (Carriage Return + Line Feed)로 끝나야 함telnet 프로그램으로 직접 요청을 만들어 테스트할 수 있음 → 책에서는 AOL 웹서버와의 실제 거래 예제 사용// 정적 콘텐츠 수행 예제
→ 서버에 요청 보냄
$ telnet www.aol.com 80
Trying 205.188.146.23...
Connected to aol.com.
GET / HTTP/1.1
Host: www.aol.com
<CRLF>
→ 서버가 응답 보냄:
HTTP/1.0 200 OK
Content-Type: text/html
...
<html> ... </html>
| 필드 | 설명 |
|---|---|
| 요청 라인 | GET / HTTP/1.1 – 메서드, URI, 프로토콜 버전 |
| 헤더 | Host는 HTTP/1.1에서 필수 |
| 빈 줄 | 헤더 종료 의미 |
| 필드 | 설명 |
|---|---|
| 응답 라인 | HTTP 버전, 상태 코드, 상태 메시지 |
| 헤더 | MIME 타입, 콘텐츠 길이 등 포함 |
| 본문 | HTML 파일 내용 등 |
| 코드 | 의미 | 설명 |
|---|---|---|
200 OK | 성공 | 요청된 콘텐츠 반환됨 |
404 Not Found | 실패 | 요청한 파일 없음 |
500 Internal Server Error | 서버 오류 | CGI 실행 실패 등 |
301 Moved Permanently | 리다이렉트 | 주소 영구 변경됨 |
fork()로 자식 프로세스를 만들고execve()로 CGI 프로그램 실행dup2(fd, STDOUT_FILENO);
기존의 1번 파일 디스크립터(STDOUT)를 지금 열려 있는 fd가 가리키는 곳(예: 클라이언트 소켓)으로 바꾼다
? 뒤가 인자 문자열/cgi-bin/adder?15000&213QUERY_STRING 환경 변수에 이 값을 저장printf("Content-type: text/html\r\n\r\n");
printf("<html> ... </html>");
| 계층 | 역할 | 대표 프로토콜 |
|---|---|---|
| 응용 계층 | 내용의 규약 정의 (메시지 의미) | HTTP, FTP, SSH |
| 전송 계층 | 데이터를 안정적으로 전송 | TCP, UDP |
| 인터넷 계층 | 호스트 주소 지정, 경로 결정 | IP |
| 링크 계층 | 물리적 홉 간 전송 | Ethernet, Wi-Fi |
read() / write()는 바이트 단위 추상화| 프로토콜 | 의미 | 형식 | 역할 |
|---|---|---|---|
| HTTP | 웹 요청/응답 | 텍스트 기반 | 브라우저-서버 |
| FTP | 파일 전송 | 명령어 + 데이터 연결 | 파일 업/다운 |
| SMTP | 이메일 전송 | 텍스트 + 헤더 | 메일 중계 |
| DNS | 이름 해석 | 바이너리 | 이름 → IP 변환 |
| SSH | 원격 접속 | 암호화된 명령 | 터미널 접속 |
타이니 서버에서 배운 핵심 요소들:
| 요소 | 역할 |
|---|---|
socket / bind / listen / accept | TCP 서버 소켓 설정 |
read / write | 바이트 단위 통신 |
fork + execve | CGI 등 동적 콘텐츠 처리 |
dup2 | stdout 리디렉션 (CGI → 클라이언트로 직접 출력) |
mmap | 정적 파일을 효율적으로 클라이언트로 전송 |
GET | HTTP 요청 처리 (Tiny는 GET만 지원) |
| 구분 | 처리 방식 |
|---|---|
| 정적 콘텐츠 | 파일을 읽어와서 HTTP 형식으로 응답 |
| 동적 콘텐츠 | 자식 프로세스를 포크해서 CGI 실행, stdout을 응답으로 전송 |
QUERY_STRING)Tiny 서버는 최소한의 코드로 HTTP 서버의 구조, 시스템 호출, 소켓 통신, CGI를 전부 구현한 “축소판 리눅스 웹서버”다.