2012年10月23日 星期二

第六週計算機網路

作業:
1.舉例:解釋說明執行FTP的過程/運作流程(commands, status code / phrase)

FTP 常用指令說明:

    ls     查看 Server 端的目錄或檔案

    pwd    查看 Server 端目前所在的目錄

    cd     變更 Server 端目前的目錄

    cdup   變更 Server 端目前的目錄到上一目錄

    lls    查看 Local 端的目錄或檔案

    lcd    變更 Local 端目前的目錄

    asc    設定傳輸模式為文字檔方式

    bin    設定傳輸模式為二進位檔方式
    get    將 Server 端的檔案拷貝至 Local 端現在目錄下

    mget   拷貝多個 Server 端的檔案至 Local 端現在目錄下

    put    將 Local 端的檔案拷貝至 Server 端現在目錄下

    mput   拷貝多個 Local 端的檔案至 Server 端現在目錄下

    delete 刪除 Server 端的檔案

    mkdir  在 Server 端建立目錄

    rmdir  刪除 Server 端的目錄

    !      shell 指令

    !ls    查看 Local 端的目錄或檔案

    prompt 變換交談模式 (on/off),

    ?,help 指令使用說明

    bye    結束 FTP


    下表是 FTP 的命令列表,可用 help 指令查詢用法:

    !               cr              macdef          proxy           send
    $               delete          mdelete         sendport        status
    account         debug           mdir            put             struct
    append          dir             mget            pwd             sunique
    ascii           disconnect      mkdir           quit            tenex
    bell            form            mls             quote           trace
    binary          get             mode            recv            type
    bye             glob            mput            remotehelp      user
    case            hash            nmap            rename          verbose
    cd              help            ntrans          reset           ?
    cdup            lcd             open            rmdir
    close           ls              prompt          runique


STATUS CODE:
1xx -肯定的初步答复這些狀態代碼指示一項操作已經成功開始,但客戶端希望在繼續操作新命令前得到另一個答复。 
110 重新啟動標記答复。 
120 服務已就緒,在nnn 分鐘後開始。 
125 數據連接已打開,正在開始傳輸。 
150 文件狀態正常,準備打開數據連接。 
2xx -肯定的完成答复 <br>一項操作已經成功完成。客戶端可以執行新命令。 ? 200 命令確定。 
202 未執行命令,站點上的命令過多。 
211 系統狀態,或系統幫助答复。 
212 目錄狀態。 
213 文件狀態。 
214 幫助消息。 
215 NAME 系統類型,其中,NAME 是Assigned Numbers 文檔中所列的正式系統名稱。 
220 服務就緒,可以執行新用戶的請求。 
221 服務關閉控制連接。如果適當,請註銷。 
225 數據連接打開,沒有進行中的傳輸。 
226 關閉數據連接。請求的文件操作已成功(例如,傳輸文件或放棄文件)。 
227 進入被動模式(h1,h2,h3,h4,p1,p2)。 
230 用戶已登錄,繼續進行。 
250 請求的文件操作正確,已完成。 
257 已創建“PATHNAME”。 
3xx -肯定的中間答复 <br>該命令已成功,但服務器需要更多來自客戶端的信息以完成對請求的處理。 331 用戶名正確,需要密碼。 
332 需要登錄帳戶。 
350 請求的文件操作正在等待進一步的信息。 
4xx -瞬態否定的完成答复 <br>該命令不成功,但錯誤是暫時的。如果客戶端重試命令,可能會執行成功。 
421 服務不可用,正在關閉控制連接。如果服務確定它必須關閉,將向任何命令發送這一應答。 
425 無法打開數據連接。 
426 Connection closed; transfer aborted. 
450 未執行請求的文件操作。文件不可用(例如,文件繁忙)。 
451 請求的操作異常終止:正在處理本地錯誤。 
452 未執行請求的操作。系統存儲空間不夠。 
5xx -永久性否定的完成答复 <br>該命令不成功,錯誤是永久性的。如果客戶端重試命令,將再次出現同樣的錯誤。 
500 語法錯誤,命令無法識別。這可能包括諸如命令行太長之類的錯誤。 
501 在參數中有語法錯誤。 
502 未執行命令。 
503 錯誤的命令序列。 
504 未執行該參數的命令。 
530 未登錄。 
532 存儲文件需要帳戶。 
550 未執行請求的操作。文件不可用(例如,未找到文件,沒有訪問權限)。 
551 請求的操作異常終止:未知的頁麵類型。 
552 請求的文件操作異常終止:超出存儲分配(對於當前目錄或數據集)。 
553 未執行請求的操作。不允許的文件名。 
常見的FTP狀態代碼及其原因 ? 
150 - FTP使用兩個端口:21用於發送命令,20用於發送數據。狀態代碼150 表示服務器準備在端口20 上打開新連接,發送一些數據。 
226 - 命令在端口20 上打開數據連接以執行操作,如傳輸文件。該操作成功完成,數據連接已關閉。 
230 - 客戶端發送正確的密碼後,顯示該狀態代碼。它表示用戶已成功登錄。 
331 - 客戶端發送用戶名後,顯示該狀態代碼。無論所提供的用戶名是否為系統中的有效帳戶,都將顯示該狀態代碼。 
426 - 命令打開數據連接以執行操作,但該操作已被取消,數據連接已關閉。 
530 - 該狀態代碼表示用戶無法登錄,因為用戶名和密碼組合無效。如果使用某個用戶帳戶登錄,可能鍵入錯誤的用戶名或密碼,也可能選擇只允許匿名訪問。如果使用匿名帳戶登錄,IIS 的配置可能拒絕匿名訪問。 
550 - 命令未被執行,因為指定的文件不可用。例如,要GET 的文件並不存在,或試圖將文件PUT 到您沒有寫入權限的目錄。


FTP(File Transfer Protocol) 是目前 Internet 中最常使用來作為傳輸檔案的方法。它與 Web 伺服器一樣,都是使用 TCP 為傳輸時的通訊協定,因此能提供較可信賴的連接導向(Connection-Oriented)傳輸。

FTP 運作流程圖

FTP 伺服器和用戶端電腦資料交換的過程如下三圖所示
階段一 監聽階段二 連接階段三 傳遞
階段一 監聽階段二 連接階段三 傳遞

FTP 運作流程說明

  1. 戶端使用 Three-Way Handshake與 FTP 伺服器端建立 TCP 交談。
  2. FTP伺服器利用 TCP 21 連接埠來傳送和接收 TCP 控制資訊,以便於傾聽用戶端的連線要求,在連線建立後,此連接埠會全程開啟。
  3. FTP伺服器使用 TCP 20 連接埠來傳送與接收 FTP 檔案,傳送完成後即關閉。
  4. 用戶端在向 FTP 伺服器提出連線要求後,會在 1024 ~ 65535 的連接埠中動態指定一個連接埠。並以此動態連接埠與 FTP 伺服器上的 TCP 21 連接埠來建立交談。
  5. 用戶端會開啟另一連接埠連到 FTP 伺服器上的 TCP 20 連接埠,以便傳輸資料。而且每一次有檔案要傳輸時,用戶端會開啟一個新的連接埠與FTP伺服器連線。
(補)2.說明Recursive和iterative的差異性
iterative:「疊代法」是把求得的數值,不斷重覆代入,再求得新數值的方法。
recursive:「遞迴法」是重複用相同手段來縮減問題範圍的方法。

比較 Iterative Method 與 Recursive Method
疊代法以確定的部分作為起始點,循序漸進推演,最後求得答案。
遞迴法找出一套縮小問題範疇的規律,以此規律不斷縮小問題,直到能釐清細節,找到確定的部份。
疊代法與遞迴法恰好顛倒:疊代法是針對已知,逐步累積,直至周全;遞迴法是針對未知,反覆拆解,直至精細。

筆記:
















2012年10月18日 星期四

第五週計算機網路

(補)作業:
搜尋html主程式呼叫另一html副程式的程式,並解釋說明之

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="http://connect.facebook.net/zh_TW/all.js"></script>
    <title>My Facebook Login Page</title>
    <script type="text/javascript">
        // 初始化 & 登入
        function oplogin() {
            FB.init({ appId: '你的app id', status: true, cookie: true, xfbml: true, channelUrl: 'http://www.你的Domain.com.tw/channel.html' }); //appid請去FB申請應用程式
            fblogin();
        }
        function fblogin() {
            FB.login(function (response) {
                if (response.authResponse) {
                    //登入成功
                    FB.api('/me', function (response) {
                        var html = '<table>';
                        for (var key in response) {
                            html += ('<tr>' + '<th>' + key + '</th>' + '<td>' + response[key] + '</td>' + '</tr>');
                        }
                        document.getElementById('me').innerHTML = html + '</table>';
                    });
                }
                else {
                    //登入失敗
                    alert("登入失敗。");
                }
            });
        }
        //登出
        function fblogout() {
            FB.getLoginStatus(function (response) {
                if (response.status === 'connected') {
                    FB.logout(function (response) {
                        // user is now logged out
                        document.getElementById('loginform').submit();
                    });
                } else if (response.status === 'not_authorized') {
                    // the user is logged in to Facebook,
                    // but has not authenticated your app
                    FB.logout(function (response) {
                        // user is now logged out
                        alert("請重新登入!");
                    });
                } else {
                    // the user isn't logged in to Facebook.
                    alert("請重新登入!");
                }
            });
        }
    </script>
</head>
<body>
    <input type="button" id="btn2" onclick="javascript:oplogin();return false;" value="取得Facebook登入者資訊(PartII)" />
    <div id="me">
    </div>
</body>
</html>



試描述web cache/proxy server所遇到的update problem

什麼是 Proxy ?
Proxy 在字面上的意思是代理人(所以亦可稱作代理伺服器)
Proxy伺服器可以接受使用者的要求至 Internet 上抓取網頁,當抓到網頁資料時,它會將網頁資料複製一份存放在自己的硬碟裡,再將網頁資料傳送給提出要求的使用者。
當有另一位使用者要求讀取同一份網頁資料時,Proxy 伺服器即可將存放於硬碟上的網頁資料傳送給另一位使用者。這樣一來,便可以省下可貴的頻寬給真正有需要的人使用



Proxy 的運作
(1) 使用者 User (Client) 提出要求
(2) Proxy Server本身是否有所需資料,若有則跳至(6)
(3) 向真正的 Web Server 提出索取資料需求
(4) 真正的 Web Server 回應資料
(5) Proxy Server 儲存 WebServer 回應的資料
(6) Proxy 回應使用者 (Client) 需求
使用 Proxy Server 的好處
1.減少不必要的傳輸, 降低網路的負載
2.加快擷取網頁的速度, 減少等待的時間
3.提供使用防火牆的區域網路連上 Internet 的方法

update problem:
可能會取得舊的錯誤資料:這個最容易發生了!由於曾經瀏覽過的網頁會被放置到快取, 並提供後續用戶的直接取得。萬一網際網路上面的那個網頁資料更新過呢?那時你會發現,怎麼用戶端無法看到更新後的資料? 就是因為快取的問題啊!取得舊資料的頻率可能會很高啊!
筆記:




2012年10月10日 星期三

第四週計算機網路

作業:
1. 撰寫程式
開啟主程式輸入10筆資料交由副程式排序,排序後在交由主程式印出
Source code:
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include <iostream>
using namespace std;
void bubble(int data[]);
int _tmain(int argc, _TCHAR* argv[])
{
int data[10];
for(int i=0;i<10;i++)
scanf_s("%d",&data[i]);
bubble(data);
for(int j=0;j<10;j++)
printf("%d ",data[j]);
system("pause");
return 0;
}
void bubble(int data[])
{
int i,j,temp;
for( i=1;i<10;i++)
for( j=0;j<(10-i);j++)
if(data[j]>data[j+1])
{
temp=data[j];
data[j]=data[j+1];
data[j+1]=temp;
}
}
執行結果:



2. 程式說明
搜尋任一socket program,並解釋說明之

socket:
Linux作業系統使用socket觀念來設計網路程式,
socket 是一種可做雙向資料傳輸的通道,Linux程序可經由此裝置與本地端或是遠端的程序做溝通。
Linux socket分成unix-domain socket和internet-domain socket二種。unix-domain socket又稱為local socket,主要用來與本地端的程序溝通。internet-domain socket用來與遠地端的程序溝通。
socket programming:
1.有server&client兩端
2.server只有一個,而client可能有多個
3.server可設定監聽(listen)port number
socket program範例:

  • Server.java
package onlyfun.caterpillar;

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) { 
        try { 
            int port = Integer.parseInt(args[0]);
            System.out.println("簡易檔案接收..."); 
            System.out.printf("將接收檔案於連接埠: %d%n", port); 

            ServerSocket serverSkt = new ServerSocket(port); 
            
            while(true) { 
                System.out.println("傾聽中...."); 
                
                Socket clientSkt = serverSkt.accept();
                
                System.out.printf("與 %s 建立連線%n", 
                        clientSkt.getInetAddress().toString());  
                
                // 取得檔案名稱
                String fileName = new BufferedReader(
                                    new InputStreamReader(
                                      clientSkt.getInputStream())).readLine();
                
                System.out.printf("接收檔案 %s ...", fileName); 

                BufferedInputStream inputStream = 
                    new BufferedInputStream(clientSkt.getInputStream()); 
                BufferedOutputStream outputStream = 
                    new BufferedOutputStream(new FileOutputStream(fileName)); 
                
                int readin; 
                while((readin = inputStream.read()) != -1) { 
                    outputStream.write(readin);
                    Thread.yield();
                } 

                outputStream.flush();
                outputStream.close();                
                inputStream.close(); 
                
                clientSkt.close(); 
                
                System.out.println("\n檔案接收完畢!"); 
            } 
        } 
        catch(Exception e) { 
            e.printStackTrace(); 
        } 
    }     
}

再來是客戶端程式: 

  • Client.java
package onlyfun.caterpillar;

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {        
        try { 
            System.out.println("簡易檔案傳送..."); 

            String remoteHost = args[0];
            int port = Integer.parseInt(args[1]);
            File file = new File(args[2]); 
            
            System.out.printf("遠端主機: %s%n", remoteHost); 
            System.out.printf("遠端主機連接埠: %d%n", port);
            System.out.printf("傳送檔案: %s%n", file.getName());

            Socket skt = new Socket(remoteHost, port); 

            System.out.println("連線成功!嘗試傳送檔案....");

            PrintStream printStream = 
                new PrintStream(skt.getOutputStream()); 
            printStream.println(file.getName()); 

            System.out.print("OK! 傳送檔案...."); 
            
            BufferedInputStream inputStream = 
                new BufferedInputStream( 
                        new FileInputStream(file)); 

            int readin; 
            while((readin = inputStream.read()) != -1) { 
                 printStream.write(readin); 
                 Thread.yield();
            } 

            printStream.flush();
            printStream.close();
            inputStream.close(); 
            
            skt.close();
            
            System.out.println("\n檔案傳送完畢!"); 
        } 
        catch(Exception e) { 
            e.printStackTrace(); 
        } 
    } 
}



筆記:















2012年10月2日 星期二

第三週計算機網路

作業:
描述Transparent和Virtual在電腦上的應用
Transparent:
實際上存在,但user使用時看不到
應用:
什麼是Squid ?
Squid 扮演著一種中介的角色,可用來節省使用者在連結網頁時所使用的頻寬,
加快內部網路訪問的速度,並且也能提供監控記錄方便查詢。
Squid代理伺服器是網路上常見的服務之一優點如下:
1. 可以儲存暫存,減少伺服器的負載,同時也可提升Client訪問網頁的速度。
2. 可以解決現階段IPv4不足的問題,減少外網IP使用量。
3. 可對Web訪問時對內容進行過濾,設定一些網頁訪問的規則。也正因為介於伺服器和Client之間,在
某些程度上可提高伺服器的安全性。
在 Squid 代理上可分為 正向代理、反向代理、通透式代理(透明代理)。
以下就來介紹正向代理 (Forward Proxy)
通透式代理 (Transparent Proxy) :
Transparent Proxy在客戶端不需要做任何設定。主要是在Proxy Server啟用NAT服務和在防火牆
設定上將NAT的80 port 轉向到3128 port、並且在squid上啟用transparent 功能。
Virtual:
實際上不存在,但user使用時看的到
應用:
虛擬私人網路,亦稱為虛擬專用網路英文Virtual Private Network,簡稱VPN),是一種常用於連接中、大型企業或團體與團體間的私人網路的通訊方法。虛擬私人網路的訊息透過公用的網路架構(例如:網際網路)來傳送內聯網的網路訊息。
虛擬私人網路利用已加密的通道協議(Tunneling Protocol)來達到保密、傳送端認證、訊息準確性等私人訊息安全效果。若使用得法,這種技術可以用不安全的網路(例如:網際網路)來傳送可靠、安全的訊息。需要注意的是,加密訊息與否是可以控制的。沒有加密的虛擬私人網路訊息依然有被竊取的危險。

筆記:


2012年9月25日 星期二

第二週計算機網路

作業: 
(1)試解釋 ASCII及其功能
ASCII是以8個位元來表示一個字元,
可用來表示英文大小寫字母、阿拉伯數字以及各種符號,最多可表示256個字元。在 ASCII 編碼表上的每一個編碼都對應一個字元,稱為 ASCII 字元 

ASCII 字元可分為兩類:
可見字元:凡是大小寫英文字母、阿拉伯數字(0~9)、符號(!、@、#、&、空格‥)等可以在螢幕或印表機列印出來的字元稱為可見字元; ASCII 編碼由32~126皆屬之,例如 ASCII 編碼65(大寫英文字母A)即為可見字元。

不可見字元:凡是無法在螢幕上顯示字形的字元,皆為不可見字元;他的主要用途是用來控制電腦設備的運作,所以又稱為控制字元(control character); ASCII 編碼由0~31皆屬之,例如ASCII編碼7便是用來控制電腦喇叭使其發聲的不可見字元

(2)試解釋何謂EBCDIC及其功能
EBCDIC (Extended Binary Code Decimal Interchange Code) 的縮寫,也是由8個位元組成的內碼,常使用於IBM的中大型電腦系統

筆記:







2012年9月18日 星期二

第一週計算機網路

Question 1 :電腦是什麼?
A:具CPU.Memory Unit.以及Input/Output,運用邏輯運算能力幫人類解決問題
Question 2 :電腦與計算器的差別?
A:電腦的記憶體相對於計算器來說大了許多
Question3:什麼是overhead?
A:完成一件事,額外消耗的成本,但不算在實際的執行過程當中
EX:執行洗衣服這件事實際只要35分,但還要加上(把衣服拿出來+曬的時間)<-不包含在洗衣機中洗衣的過程中所花費的時間,稱作為overhead

HW01: 雞兔同籠問題,分別以數學和算數的方式解決問題
假設小明看到在同一籠子裡的雞和兔共有5隻,兩隻動物的腳總計有12隻,請問雞和兔各有幾隻?
(1)算數:假設雞有5隻,總共為10隻,比12隻腳少了2隻,可以推論裡面至少有一隻兔子
(2)數學:令雞有x隻,兔有y隻
2*x+4*y=12
x+y=5
解聯立得到x=4,y=1

HW02:二元搜尋法的定理
A:是將資料分割成兩等份,再比較鍵值與中間值的大小,如果鍵值小於中間值,可確定要找的資料在前半段的元素,否則在後半部。如此分割數次直到找到或確定不存在為止。
(1)
M:已排序資料:1,2,3,4,5,6,7
A:二元搜尋法:
假設欲搜尋鍵值為5
第一次排序:將資料剖半,取中間值4,4<5代表目標鍵值在右半段,1,2,3,4|5,6,7
第二次排序:再將資料剖半一次->中間鍵值為6->目標鍵值小於6在資料左半段->找到5->排序結束5|6,7;共計搜尋2次
(2)
M:二元樹










二元搜尋樹中的每一節點資料都不小於它的左子樹,也不大於它的右子樹
A:直接搜尋
假設欲搜尋鍵值為4,樹根為3代表左子樹的值必小於3->往右走->得到5->往左走->得到4->搜索完畢


筆記: