2012年10月29日 星期一

第七週計算機網路

作業:
1. cookie隱私權問題

Cookie(複數形態Cookies),中文名稱為小型文字檔案小甜餅,指某些網站為了辨別使用者身份而儲存在用戶端(Client Side)上的資料(通常經過加密)。

隱私,安全和廣告

Cookies在某種程度上說已經嚴重危及使用者的隱私安全。其中的一種方法是:一些公司的高層人員為了某種目的(譬如市場調查)而存取了從未去過的網站(透過搜尋引擎查到的),而這些網站包含了一種叫做網頁臭蟲的圖片,該圖片透明,且只有一個象素大小(以便隱藏),它們的作用是將所有存取過此頁面的電腦寫入cookie。而後,電子商務網站將讀取這些cookie訊息,並尋找寫入這些cookie的網站,隨即發送包含了針對這個網站的相關產品廣告的垃圾郵件給這些高階人員。

[编辑]竊取Cookies和指令碼攻擊

雖然cookies沒有中電腦病毒那麼危險,但它仍包含了一些敏感訊息:使用者名,電腦名,使用的瀏覽器和曾經存取的網站。使用者不希望這些內容泄漏出去,尤其是當其中還包含有私人訊息的時候。
這並非危言聳聽,一種名為Cross site scripting的工具可以達到此目的。在受到Cross site scripting攻擊時,cookie盜賊和cookie毒藥將竊取內容。一旦cookie落入攻擊者手中,它將會重現其價值。
  • Cookie盜賊:搜集使用者cookie並行給攻擊者的駭客。攻擊者將利用cookie訊息透過合法手段進入使用者帳戶。
  • Cookie投毒:一般認為,Cookie在儲存和傳回伺服器期間沒有被修改過,而攻擊者會在cookie送回伺服器之前對其進行修改,達到自己的目的。例如,在一個購物網站的cookie中包含了顧客應付的款項,攻擊者將該值改小,達到少付款的目的。這就是cookie 投毒。


2. 找CS,P2P數據,畫圖解釋                                                                                               

筆記:





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)來達到保密、傳送端認證、訊息準確性等私人訊息安全效果。若使用得法,這種技術可以用不安全的網路(例如:網際網路)來傳送可靠、安全的訊息。需要注意的是,加密訊息與否是可以控制的。沒有加密的虛擬私人網路訊息依然有被竊取的危險。

筆記: