200 likes | 353 Views
웹 브라우저. URL(Uniform Resource Locator) 프로토콜 :// 사용자명 : 패스워드 @ 서버의 도메인명 : 포트번호 / 파일의 경로명 생략가능 생략가능 http://www.yahoo.co.kr:80/index.html ftp://anonymous:kkk@ftp.kaist.ac.kr:21/. 웹 브라우저 프로그램. < 운영체제 >. ①.
E N D
웹 브라우저 URL(Uniform Resource Locator) 프로토콜://사용자명:패스워드@서버의 도메인명:포트번호/파일의 경로명 생략가능 생략가능 http://www.yahoo.co.kr:80/index.html ftp://anonymous:kkk@ftp.kaist.ac.kr:21/
웹 브라우저 프로그램 <운영체제> ① • gethostbyname{ • DNS 서버에 보내는 메시지를 만든다. • 조회 메시지를 DNS 서버에 보낸다 • DNS 서버에서 돌아온 응답 메시지를 수신한다 • 응답 메시지에서 IP 주소를 추출하여 <메모리 영역>에 저장하고 브라우저로 돌아간다. • } • UDP 메시지 송신{ 헤더 작성 • } • UDP 메시지 수신{ 헤더 제거 • } ⑧ ② ⑦ ③ ⑥ LAN 카드 <웹브라우저> <메모리영역> = gethostbyname(www.yahoo.co.kr); 다음 명령행 ④ ⑤ DNS 서버
DNS 서버 내부 ① query (이름, 클래스, 타입) ② answer 클라이언트 DNS 서버
DNS 서버들의 조회 동작 (1) ③ ② root ④ jp ….. kr com co ac ….. ⑤ ns.yahoo.co.jp sky.knue.ac.kr ① ⑥ ⑦
DNS 서버들의 조회 동작 (2) root ② ③ jp ….. kr com co ac ….. ④ ⑤ sky.knue.ac.kr ⑥ ⑦ ① ns.yahoo.co.jp ⑩ ⑧ ⑨
웹 브라우저(클라이언트) 프로그램 <웹브라우저> <메모리영역> = gethostbyname(www.yahoo.co.kr); <디스크립터> = socket ( IPv4 사용, TCP 또는 UDP ); connect (<디스크립터>, <서버의 IP 주소와 포트번호>,,,); 119.161.11.206 80 송신 메시지 조립 ( GET /index.html ) write ( <디스크립터>, <송신메시지><송신메시지 길이>); <수신 메시지 길이> = read (<디스크립터>, <수신버퍼>,,); 화면에 수신 메시지를 보여주거나, 디스크에 저장함… DNS 서버 웹 서버 / 파일 서버
웹 서버 프로그램 <웹 서버> <디스크립터1> = socket ( IPv4 사용, TCP 또는 UDP ); bind (<디스크립터1>, <서버의 IP 주소와 포트번호>,,,); listen(<디스크립터1>,..); <디스크립터2> = accept (<디스크립터1>, <클라이언트의 IP 주소와 포트번호>,,,); 송신 메시지 조립 ( GET /index.html ) write ( <디스크립터2>, <송신메시지><송신메시지 길이>); <수신 메시지 길이> = read (<디스크립터2>, <수신버퍼>,,); 화면에 수신 메시지를 보여주거나, 디스크에 저장함… 119.161.11.206 80 웹 클라이언트 / 파일 클라이언트
소켓의 생성(클라이언트와 서버) ① <운영체제> socket{ ②파일(소켓) 기술자(디스크립터) 테이블을 만든다. ③소켓 정보 구조체를 만든다. ④ IPv4 사용(AF_INET )을 기록한다. ⑤ TCP 사용 (SOCK_STREAM)을 기록한다. ⑥ 소켓 디스크립터를 반환한다. } 프로세스 테이블 프로세스 부모 번호 번호 파일 기술자 소켓 정보 테이블 구조체 ③ ② 0 1 2 3 4 . . . 패밀리: ④ AF_INET 서비스: ⑤ SOCK_STREAM 로컬 IP: 로컬 PORT: 리모트 IP: 리모트 PORT: 100 90 <웹브라우저와 서버> ⑥ <디스크립터> = socket ( IPv4 사용, TCP 또는 UDP ); 3
클라이언트의 연결 설정 요청 ① <운영체제> • connect{ • 파일(소켓) 기술자(디스크립터) 를 가지고 파일 기술자 테이블에 접근하여 소켓 정보 구조체의 주소 발견 • 소켓 정보 구조체에 접근 • 로컬 IP와 로컬 PORT 기록 • (운영체제에 의해) • ⑤ 리모트 IP 서버 IP 주소 • 리모트 PORT 서버 PORT • ⑥기록이 성공하면 0 • 실패하면 –1 반환 } 통신 프로그램에서의 소켓 프로세스 테이블 파일 기술자 소켓 정보 테이블 구조체 프로세스 부모 번호 번호 ③ 0 1 2 3 4 . . . 패밀리: AF_INET 서비스: :SOCK_STREAM 로컬 IP: 210.93.100.187 로컬 PORT: 3500 리모트 IP: 119.161.11.206 리모트 PORT: 80 ② ④ ⑤ 100 90 ⑥ <웹 브라우저> connect (<디스크립터>, <서버의 IP 주소와 포트번호>,,,); 3 119.161.11.206 80
TCP의 3-way-handshake 클라이언트 TCP 서버 TCP syn = 1 syn = 1, ack = 1 ack = 1
서버의 동작(바인딩) ① <운영체제> • bind{ • 파일(소켓) 기술자(디스크립터) 를 가지고 파일 기술자 테이블에 접근하여 소켓 정보 구조체의 주소 발견 • 소켓 정보 구조체에 접근 • 로컬 IP와 로컬 PORT 기록 • (운영체제에 의해) • ⑤ 기록이 성공하면 0 • 실패하면 –1 반환 } 통신 프로그램에서의 소켓 프로세스 테이블 파일 기술자 소켓 정보 테이블 구조체 프로세스 부모 번호 번호 ③ 0 1 2 3 4 . . . 패밀리: AF_INET 서비스: :SOCK_STREAM 로컬 IP: 119.161.11.206 로컬 PORT: 80 리모트 IP: 리모트 PORT: ② ④ 100 90 ⑤ <웹 서버> bind (<디스크립터1>, <서버의 IP 주소와 포트번호>,,,); 119.161.11.206 80 3
서버의 동작 (클라이언트와의 연결) ① <운영체제> 파일 기술자 소켓 정보 테이블 구조체 • accept{ • 파일(소켓) 기술자(디스크립터) 를 가지고 파일 기술자 테이블에 접근하여 소켓 정보 구조체의 주소 발견 • 소켓 정보 구조체에 접근 • 소켓 정보 구조체를 복사 • 하고 파일 기술자 테이블의 4와 연결 • 운영체제(TCP/IP)로 부터 얻어진 클라이언트의 IP 주소를 리모트IP 주소에 기록 • 클라이언트의 PORT를 리모트 PORT에 기록 • ⑥<디스크립터 2>에 4를 반환 • <클라이언트 IP 주소와 포트> 반환 통신 프로그램에서의 소켓 프로세스 테이블 ③ 프로세스 부모 번호 번호 0 1 2 3 4 . . . 패밀리:AF_INET 서비스: :SOCK_STREAM 로컬 IP: 119.161.11.206 로컬 PORT: 80 리모트 IP: 리모트 PORT: ② ④ 패밀리:AF_INET 서비스: :SOCK_STREAM 로컬 IP: 119.161.11.206 로컬 PORT: 80 리모트 IP: 210.93.100.187 리모트 PORT: 3500 100 90 ⑤ <웹 서버> ⑥ <디스크립터2> = accept (<디스크립터1>, <클라이언트의 IP 주소와 포트번호>,,,); 3
15 송신동작(클라이언트) ① <운영체제> • write{ • 파일(소켓) 기술자(디스크립터) 를 가지고 파일 기술자 테이블에 접근하여 소켓 정보 구조체의 주소 발견 • 소켓 정보 구조체에 접근 • 소켓 정보 구조체에 있는 <로컬 IP, 로컬 PORT>와 <리모트 IP, 리모트 PORT>, 그리고 • <GET /index.html>을 이용하여 • TCP/IP 호출 • ⑤성공하면 메시지의 크기 반환 • 실패하면 –1 반환 통신 프로그램에서의 소켓 프로세스 테이블 파일 기술자 소켓 정보 테이블 구조체 프로세스 부모 번호 번호 ③ 0 1 2 3 4 . . . 패밀리: AF_INET 서비스: :SOCK_STREAM 로컬 IP: 210.93.100.187 로컬 PORT: 3500 리모트 IP: 119.161.11.206 리모트 PORT: 80 ② ④ 100 90 <웹 브라우저> ⑤ 송신 메시지 조립 ( GET /index.html ) write ( <디스크립터>, <송신메시지><송신메시지 길이>); 3
16 수신동작(클라이언트) ① <운영체제> • read{ • 파일(소켓) 기술자(디스크립터) 를 가지고 파일 기술자 테이블에 접근하여 소켓 정보 구조체의 주소 발견 • 소켓 정보 구조체에 접근 • TCP 수신 버퍼로부터 해당되는 • 세그먼트를 클리어언트로 이동 • 요청 • ⑤성공하면 메시지의 길이 반환 • 실패하면 –1 반환 통신 프로그램에서의 소켓 프로세스 테이블 파일 기술자 소켓 정보 테이블 구조체 프로세스 부모 번호 번호 ③ 0 1 2 3 4 . . . 패밀리: AF_INET 서비스: :SOCK_STREAM 로컬 IP: 210.93.100.187 로컬 PORT: 3500 리모트 IP: 119.161.11.206 리모트 PORT: 80 ② ④ 100 90 <웹브라우저> ⑤ <수신 메시지 길이> = read (<디스크립터>, <수신버퍼>,,); 3
송신 동작 (서버) ① <운영체제> 파일 기술자 소켓 정보 테이블 구조체 • write{ • 파일(소켓) 기술자(디스크립터) 를 가지고 파일 기술자 테이블에 접근하여 소켓 정보 구조체의 주소 발견 • 소켓 정보 구조체에 접근 • 소켓 정보 구조체에 있는 <로컬 IP, 로컬 PORT>와 <리모트 IP, 리모트 PORT>, 그리고 • <GET /index.html>을 이용하여 • TCP/IP 호출 • ⑤성공하면 메시지의 크기 반환 • 실패하면 –1 반환 통신 프로그램에서의 소켓 ② 프로세스 테이블 프로세스 부모 번호 번호 0 1 2 3 4 . . . 패밀리:AF_INET 서비스: :SOCK_STREAM 로컬 IP: 119.161.11.206 로컬 PORT: 80 리모트 IP: 리모트 PORT: ③ 패밀리:AF_INET 서비스: :SOCK_STREAM 로컬 IP: 119.161.11.206 로컬 PORT: 80 리모트 IP: 210.93.100.187 리모트 PORT: 3500 100 90 <웹 서버> ⑤ 송신 메시지 조립 write ( <디스크립터2>, <송신메시지><송신메시지 길이>); 4
18 수신 동작 (서버) <운영체제> ① 파일 기술자 소켓 정보 테이블 구조체 통신 프로그램에서의 소켓 프로세스 테이블 • read{ • 파일(소켓) 기술자(디스크립터) 를 가지고 파일 기술자 테이블에 접근하여 소켓 정보 구조체의 주소 발견 • 소켓 정보 구조체에 접근 • TCP 수신 버퍼로부터 해당되는 • 세그먼트를 클리어언트로 이동 • 요청 • ⑤성공하면 메시지의 길이 반환 • 실패하면 –1 반환 프로세스 부모 번호 번호 0 1 2 3 4 . . . 패밀리:AF_INET 서비스: :SOCK_STREAM 로컬 IP: 119.161.11.206 로컬 PORT: 80 리모트 IP: 리모트 PORT: ② 패밀리:AF_INET 서비스: :SOCK_STREAM 로컬 IP: 119.161.11.206 로컬 PORT: 80 리모트 IP: 210.93.100.187 리모트 PORT: 3500 ③ 100 90 ④ <웹 서버> ⑤ <수신 메시지 길이> = read (<디스크립터>, <수신버퍼>,,); 4
19 소켓의 분리(클라이언트) ① <운영체제> close{ ② 파일(소켓) 기술자(디스크립터)를 가지고 파일 기술자 테이블에 접근하여 소켓 정보 구조체의 주소 발견 ③ 구조체의 주소(포인터)를 지움 ④성공하면 0 실패하면 –1 반환 통신 프로그램에서의 소켓 프로세스 테이블 파일 기술자 소켓 정보 테이블 구조체 프로세스 부모 번호 번호 0 1 2 3 4 . . . 패밀리: AF_INET 서비스: :SOCK_STREAM 로컬 IP: 210.93.100.187 로컬 PORT: 3500 리모트 IP: 119.161.11.206 리모트 PORT: 80 ③ ② 100 90 <웹브라우저> ④ close (<디스크립터>); 3
20 소켓의 분리 (서버) <운영체제> ① 파일 기술자 소켓 정보 테이블 구조체 close{ ② 파일(소켓) 기술자(디스크립터)를 가지고 파일 기술자 테이블에 접근하여 소켓 정보 구조체의 주소 발견 ③ 구조체의 주소(포인터)를 지움 ④성공하면 0 실패하면 –1 반환 통신 프로그램에서의 소켓 프로세스 테이블 프로세스 부모 번호 번호 0 1 2 3 4 . . . 패밀리:AF_INET 서비스: :SOCK_STREAM 로컬 IP: 119.161.11.206 로컬 PORT: 80 리모트 IP: 리모트 PORT: ③ ② 패밀리:AF_INET 서비스: :SOCK_STREAM 로컬 IP: 119.161.11.206 로컬 PORT: 80 리모트 IP: 210.93.100.187 리모트 PORT: 3500 100 90 <웹 서버> close (<디스크립터>); 3 close (<디스크립터2>); 4 ④