Web Server 王宏瑾.

Slides:



Advertisements
Similar presentations
6.1 区域委派与域名转发 6.2 虚拟主机技术 6.3 架设FTP服务器 6.4 动态主机分配协议 6.5 架设Mail服务器
Advertisements

6.6 简单网络管理协议 SNMP 网络管理的基本概念
动态网站开发 【HTTP与网络基础】 李博杰
網路程式設計 (Network Programming)
Chapter 5: Service-Oriented Architectures for Distributed Computing 面向服务的分布式体系结构 1.
第五章 網際網路 5-1 網際網路的歷史沿革 5-2 網際網路基本運作原理 5-3 連線媒介與連線上網 5-4 網際網路上的熱門應用
第 8 章 IP 基礎與定址.
计算机网络(第 6 版) 第 6 章 应用层 青岛理工大学通信与电子工程学院.
第 12 章 UDP 與 TCP.
Chapter 12 UDP 與 TCP.
第2章 计算机网络的协议与体系结构 2.1 计算机网络体系结构的形成 2.2 协议与划分层次 2.3 计算机网络的原理体系结构
第1章 概述.
Foundations of Computer Science Chapter 6 電腦網路
伺服器網路檢測與管理 資訊中心網路管理組 王裕仁 2006/06/29.
Windows系統 入侵偵測與防制工具 成大計網中心 楊峻榮 2003/10/23.
全球資訊網(WWW)簡介.
计算机系统安全 第10章 常用攻击手段.
Socket.
網路基本概念與設定方法 林文宗 資管系助理教授
基于WinSock的邮件系统 1 设计目标: 1.1 SMTP发送邮件服务器(c语言) 1.2 POP3接受邮件服务器(c语言)
Lab312.
SIP 体系架构.
传输层是整个协议层次的核心,其任务是在源机器和目标机器之间提供可靠的、性价比合理的数据传输功能,并与当前所使用的物理网络完全独立
第 12 章 UDP 與 TCP.
利用 ISA Server 2004 建置應用層防護機制
計中「多媒體與網路應用」短期訓練課程 FTP server 架設 (in Windows)
第 13 章 DNS 著作權所有 © 旗標出版股份有限公司.
Java语言程序设计 清华大学出版社 第9章 网络通信.
(C) Active Network CO., Ltd
例外處理(Exception Handling)
Socket Programming in C
第五章 網際網路 5-1 網際網路的歷史沿革 5-2 網際網路基本運作原理 5-3 連線媒介與連線上網 5-4 網際網路上的熱門應用
Socket 基本觀念.
SIP消息之 逐项讲解.
TCP/IP Protocol Suite TCP/IP協定 第二組 投影片製作by簡嘉宏 綦凱宏 林睿敏 滕孟哲.
C#程序设计 c# programming 网络编程 C#程序设计课程组.
實驗 一 : RTP 實驗目的 實作部分 了解如何利用RTP在網路上傳送語音封包 加深對RTP、RTCP封包的基本格式的認識
第 2 章 TCP / IP 簡介.
【VA虚拟应用管理平台】专题培训 资源管理及个性化 陕西益和信息技术开发有限责任公司 2011年2月.
TCP/IP基本原理 第九章 文件传输.
在一定程度上 人类的思维产生于 简单个体之间的相互作用 ——Marvin Minsky.
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
第十讲 TCP协议 协议概述 报文段格式 差错控制 流控和拥塞控制 TCP连接管理 TCP性能问题 TCP软件设计 2018/12/7
預官考試輔導 計算機概論提要 91年12月4日.
考试题型 填空题(30) 选择题(20) 名词解释(10) 问答题(24) 计算题(16) 附加题(30) 成绩核算:
第4章 OSI傳輸層.
第一讲 J2EE基础 博和利初级培训 —开发技能.
NS2 – TCP/IP Simulation How-Wei Wu.
作業二 : SIP User Mobility 實驗目的 實作部分
第 12 章 UDP 與 TCP 著作權所有 © 旗標出版股份有限公司.
第二章 防火墙基础技术.
第十三章 TCP/IP 與 Internet 網路連結技術
P2P聊天工具.
第2讲 网络安全协议基础 此为封面页,需列出课程编码、课程名称和课程开发室名称。
Web前端开发 第23章:网站发布 阮晓龙 / 河南中医药大学管理科学与工程学科
第7章 传输层协议——TCP与UDP 任课教师 卢豫开.
Westmont College 网络互连 Part 4 (传输协议, UDP and TCP, 协议端口)
Westmont College 网络应用软件 第一讲 (客户-服务器 概念, 协议端口的使用, 套接字API)
第4章 TCP/IP应用层常用协议 4.1 Telnet 协 议 4.2 文件传输协议FTP 4.3 电子邮件的工作原理及其协议
Network Application Programming(3rd Edition)
Advister: Quincy Wu Speaker: Chenglin Tsai Date:3/26
【VA虚拟应用管理平台】专题培训 资源管理及个性化 陕西益和信息技术开发有限责任公司 2011年2月.
NAT技术讲座 主讲:周旭 大唐电信科技股份有限公司光通信分公司 数据通信部.
講員:游文志 排程系統教育訓練 後台管理系統 講員:游文志
網路概論 第3章 協定與模型.
2019/5/3 JAVA Socket(UDP).
助教:廖啟盛 JAVA Socket(UDP) 助教:廖啟盛
第1章 WWW和LAMP基本觀念.
第十二章 Java网络编程 1.URL编程 2.Socket网络编程 3.Datagram网络编程.
第7章 传输层协议——TCP与UDP 任课教师 卢豫开.
Presentation transcript:

Web Server 王宏瑾

Induction (1) Server Client Web Browser TCP/IP HTTP/1.0

Induction (2) Create a socket ( port : 80 ) Bind Listen Accept 網 路 部 分 接收 HTTP需求資料 包含需求標頭和需求主體 送出 HTTP回覆資料 包含回覆標頭和回覆主體 Web Server 工作

Socket (1) Socket ID Protocol IP Address Port number Association Local IP Address Local Port number Remote IP Address Remote Port number Socket descriptor 通訊協定 本地IP位址 本地PORT 遠端IP位址 遠端PORT

Socket (2) Socket Type Stream socket Datagram socket byte-stream of two-way, reliable, sequenced, full-duplex and out-of-band connection-oriented ( TCP/IP ) Datagram socket datagram-stream of two-way, unreliable connectionless ( UDP )

Socket (3) socket() bind() (可有可無) connect() Winsock應用程式介面 Socket descriptor 通訊協定 本地IP位址 本地PORT 遠端IP位址 遠端PORT 網路系統 TCP Client 程式

Socket (4) socket() bind() listen() accept() Winsock應用程式介面 Socket descriptor 通訊協定 本地IP位址 本地PORT 遠端IP位址 遠端PORT 網路系統 TCP Server 程式

Web Server 類別層級架構分為七部分 System Environment (使工作平台與程式內部分離) Client Information (記錄工作環境與socket) Service Provider (接收Client端的資料) Service Response (處理各種的回應) Service Request (擷取 HTTP需求資料) Access of Resource (使用HKEY與HANDLE) Exception (異常狀況之處理)

Web Server - Object Class (1) System Environment IBasicEnv Cwin32TCPEnv Cwin32TCPEnv_2 CHttpAgent Service Provider CBasicClient Client Information CClientStub

Web Server - Object Class (2) Service Response IHttpResponse CDocumeResponse CDirectoryResponse CCgiResponse Service Request CHttpRequest Access of Resource Cwin32InScopeRegistryKey Cwin32InScopeHandle

Web Server - Object Class (3) Exception ENSocket ( in IBasicEnv ) EbadSocket ( in IBasicEnv ) EPortNotOpen ( in IBasicEnv ) EsvncTimeout ( in IBasicEnv ) ETooManyService ( in IBasicEnv ) EInternalError ( in IhttpResponse ) ECgiErrorError ( in IhttpResponse ) EHttpConfig ( in Cwin32TCPEnv_2 ) EContentAccess ( in Cwin32TCPEnv_2 )

Program catch( IBasicEnv::ENoSocket & ) int main( void ) {// Abstraction for the underlying system char msg[ 256 ] ; try{ } catch ( ) { } return 0; } CWin32TCPEnv_2 Env ; 做一些初始化的動作 主程式部分 哪種異常狀況 對應處理方式 catch( IBasicEnv::ENoSocket & ) {Env.ShowError( "ERR> TCP/IP stack error." ) ;} catch( IBasicEnv::EBadSocket & ) {Env.ShowError( "ERR> Server socket is bad." ) ;} catch( IBasicEnv::EPortNotOpen & ) {Env.ShowError( "ERR> Server port not open." ) ;} catch( IBasicEnv::ETooManyServices & ) {Env.ShowError( "ERR> Too many services are running." ) ;} 異 常 處 理

for( int id = 1; TRUE; id++ ) { Env.ReadyPort( 80 ) ; for( int id = 1; TRUE; id++ ) { sprintf( msg, "SERVER> Ready to serve browser #%d...", id ) ; Env.ShowStatus( msg ) ; // Block here until client arrives Env.SpawnService( Env.BlockForClient( 80 ), ::HttpdThread, 80 ) ; } // Wait here when both service threads have started Env.ShowStatus( "SERVER> Waiting for service threads to end..." ) ; 主 程 式 Env.ReadyPort( 80 ); create a socket 指定port為80 bind listen

Web Server Env.SpawnService( Env.BlockForClient( 80 ), ::HttpdThread, 80 ) ; Env.BlockForClient( 80 ) 等待Client端建立連線,並傳回socket ::HttpdThread 處理Client端送來的資料 ( 判斷是否合法讀取 ) 送出HTTP回覆資料 Env.SpawnService Create Thread去負責Client端送來的另外資料

HTTP Request GET /home.html HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword* Referer: http://140.112.29.172:80/ Accept-Language: zh-tw Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT) Host: 140.112.29.172:80 Connection: Keep-Alive

Web Server Http需求資料 Http回覆資料 需求標頭 : 需求指令 ( 需求方法 資源名稱 適用的HTTP規格版本 ) 與其他資訊 需求主體 : 其他資訊 Http回覆資料 回覆標頭 : 狀態指令 ( 回覆資料的格式版本 所求資源的狀況 ) 與其他資訊 回覆主體 : 其他資訊 詳細內容請參考 rfc1945

Web Server DWORD __stdcall HttpdThread( LPVOID lpArg ) { // Client will be automatically disconnected once out of this thread CHttpAgent BernersLee( (CClientStub *)lpArg ) ; BernersLee.Engage() ; return 0 ; } CHttpAgent::CHttpAgent( CClientStub *pStub ) :CBasicClient( pStub ) {}

Web Server Engage() : CHttpRequest theRequest( this ) ; CWin32TCPEnv_2 *pEnv = (CWin32TCPEnv_2 *)m_pEnv ; try { IHttpResponse *pResponse ; // Attempt to resolve client request pResponse = theRequest.Resolve() ; (處理Client端送來的資料) pResponse->Deliver() ; (送出HTTP回覆資料) } catch (…) { 異常處理 }

pResponse = theRequest.Resolve() ; IHttpResponse *CHttpRequest::Resolve( void ) { // 每個request只由一個Request Object來服務 if( m_pResponse != NULL ) return m_pResponse ; // 接受Client端的Request Header m_pAgent->ReceiveUntilStr( m_szHeader, sizeof( m_szHeader ), 0, CRLF CRLF, 4 ) ; // Determine if the service is proxy or local if( ::strlen( GetScheme() ) > 0 ) throw ENoRemoteSupport() ; if( !GetEnv()->IsResourcePublic( GetUri() ) ) //讀取的Path是否合法 throw EInvalidRequest() ; if( GetEnv()->IsResourceDirectory( GetUri() ) ) //是否為Directory return new CDirectoryResponse( this ) ; if( ::strlen( GetCgiExecutable() ) > 0 ) //是否為可執行檔 return new CCgiResponse( this ) ; return new CDocumentResponse( this ) ; }

pResponse->Deliver() ; Web Server pResponse->Deliver() ; 若pResponse是指CDirectoryResponse( ) 則顯示出目錄內容 若pResponse是指CCgiResponse( ) 則執行 CGI 服務 若pResponse是指CDocumentResponse( ) 則顯示出顯示出檔案內容

Web Server 將input存成一個檔案 以此作為欲執行的CGI程式之input 將CGI程式執行完後的結果輸出到檔案 最後再將此檔傳回Client端

Web Server 由於整個程式是採用Exception Handling的機制,所以有可能exception發生後,使得一些在程式尾端的資源釋放動作不被執行到,所以採用更安全的資源控制方式。 Cin32InScopeRegistryKey 與 Cwin32InScopeHandle 分別對應到Win32環境下的 HKEY 及 HANDLE 兩種資源種類,這兩種資源要被 ::RegCloseKey 和 ::CloseHandle 來釋放,當一個變數的生命期結束時,此變數的Destructor會被呼叫,而達到釋放資源的效果。

ReceiveUntilStr( szInBuffer, sizeof( szInBuffer ), 0, " ", 1 ) ; 處理Client端送來的資料 // HTTP Request header: GET uri ... CRLF CRLF ReceiveUntilStr( szInBuffer, sizeof( szInBuffer ), 0, " ", 1 ) ; ShowStatus( "HTTPAGENT> Request method:" ) ; ShowStatus( szInBuffer ) ; ReceiveUntilStr( szUri, sizeof( szUri ), 0, " ", 1 ) ; ShowStatus( "HTTPAGENT> Request URI:" ) ; ShowStatus( szUri ) ; // Must receive all header until it ends in CRLF+CRLF ReceiveUntilStr( szInBuffer, sizeof( szInBuffer ), 0, CRLF CRLF, 4 ) ; // Attempt to resolve client request char szResponse[ 1024 ] ; CWin32TCPEnv_2 *pEnv = (CWin32TCPEnv_2 *)m_pEnv ; int cbResource = pEnv->GetResourceLength( szUri ) ; ::wsprintf( szResponse,"HTTP/1.0 200 OK" CRLF "CONTENT-LENGTH: %d" CRLF CRLF, cbResource ) ; SendUntilDone( szResponse, strlen( szResponse ), 0 ) ; pEnv->SendResource( m_Socket, szUri ) ; 送出HTTP回覆資料