㈠ c語言編寫賬號,密碼登錄怎麼寫
同意其他樓的說法,別以為這工作很簡單,或者按鍵精靈簡單。
建議你用循序漸進的思路
先實現在windows記事本里輸入任意文字---這就是你說的類似按鍵精靈的操作,涉及到尋找窗口句柄、發送消息等windows api。
再實現在最基本的網站上的文本框里輸入內容---也是類似找句柄,不過網頁的結構層次很復雜,難以定位
最後再說登陸126這種,因為它可能有各種驗證碼等阻止自動化登陸的方法,別說c語言了,就是其他像python這種,也不是輕而易舉就能繞過的
不排除126這種大型網站已經公開了郵箱api,不通過界面也可以訪問你的郵件,這需要看官方文檔
㈡ 關於mosquitto怎麼用c語言實現消息的訂閱和發送(mqtt)
1.目標:測試Mosquitto使用MQTT協議發消息的相關性能指標,包含發送速度,並發負載能力,資源佔用,消息到達率。
2.MQTT協議簡介:
1).建立長連接。客戶端發起請求和服務端建立長連接,建立成功後,服務端會返回ACK(CONNACK)
2).客戶端訂閱:客戶端發起訂閱,訂閱成功後,服務端會返回ACK(SUBACK)
3).發消息:發布者會給服務端發消息,服務端在把消息給合適的客戶端。
Qos=0(服務質量):客戶端消息收到後,不會發出ACK給服務端(PUBACK)。
Qos =1:服務端會發ACK給發布者,客戶端收到消息後會發ACK給服務端。
4).取消訂閱:客戶端發起取消訂閱,服務端返回ACK(UNSUBACK)
5)Pingreq&Pingresp:客戶端和服務端會保持心跳。
3.存在問題:
1. 如何模擬出40W的用戶
2. 如何長連接,訂閱,發消息,取消訂閱,Pingreq行為如何實現。
4. python開源庫 Mosquitto.py,解決所有問題
1. 模擬40W用戶
a)可以使用虛擬機和Mosquitto.py實現,具體為:一般一台虛擬機最多是6W+的模擬數據(需要修改句柄數,我使用5W),方法是Client_id可以簡單的做出5W個來,然後調用Mosquitto裡面的connect方法,建立長連接。准備8台虛擬機就可以實現40W客戶端的模擬
2.行為的模擬
a)訂閱:Mosquitto.subscribe / 發消息:Mosquitto.publish / 取消訂閱:Mosquitto.unsubscribe。 簡單一句話 Mosquitto庫實現所有的行為.
5. 指標:發送速度,到達率,並發負載,資源佔用。
a. 發送速度:服務端日誌記錄,分析解決
b. 到達率: 1.客戶端記錄下收到消息,分析計算。2.計算服務端收到的PUBACK(客戶端收到消息返回的ACK),進行計算
c. 並發負載:5W 用戶不斷增加,注意觀察服務端的負載情況。
e.資源佔用:其實主要是cpu/mem/帶寬:cpu多核的話需要觀察top命令下的_id欄位, mem可以觀察free -h命令的剩餘mem, 帶寬可以使用mpstat進行觀察
6. 可以遇見問題:
a. 模擬客戶端的虛擬機需要修改句柄數才能支持5W的客戶端模擬數量
b. 要先吃透MQTT協議的流程,吃透了進行測試會非常的方便
c. Clear session,設置為true則不為客戶端保留休息,設置為false保留消息。其實就是客戶端離線後在連接上可以收到之前推出的消息。
㈢ C語言的switch(Msg)
WNDCLASSEX是一個包含窗體各種參數的結構體,例如窗口風格(是模態、非模態、有無系統菜單、有無邊框等等),窗體實例句柄,窗體消息處理函數等等.
WNDCLASSEX在winuser.h中被定義
typedef WNDCLASSEXW WNDCLASSEX,*LPWNDCLASSEX,*PWNDCLASSEX;
而WNDCLASSEXW也在winuser.h中被定義為:
typedef struct _WNDCLASSEXW {
UINT cbSize;//WNDCLASSEX 的大小
UINT style;//窗口風格
WNDPROC lpfnWndProc;//窗體消息處理函數的指針
int cbClsExtra;//緊跟在窗口類結構後的附加位元組數
int cbWndExtra;//跟在窗口實例後的附加位元組數
HINSTANCE hInstance;//窗體實例句柄
HICON hIcon;//窗體圖標句柄
HCURSOR hCursor;//游標句柄
HBRUSH hbrBackground;//背景畫刷背景
LPCWSTR lpszMenuName;//菜單名的const wchar_t類型的指針
LPCWSTR lpszClassName;//類名的const wchar_t類型的指針
HICON hIconSm;//和窗口類關聯的小圖標
} WNDCLASSEXW, *LPWNDCLASSEXW, *PWNDCLASSEXW;
HWND是窗體的句柄類型
在windef.h中被定義
DECLARE_HANDLE(HWND);
而在winnt中有#define DECLARE_HANDLE(n) typedef HANDLE n
和#define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n
MSG是Windows消息的結構體,當產生消息時被推送到消息隊列,等待處理,例如右擊時會生成右擊消息的MSG,消息會記錄接收消息的窗體的句柄,和消息類型:WM_RBUTTONDOWN,消息產生時的滑鼠的坐標,把消息投遞到消息隊列,Windows會把消息一條條地取出,根據接收者投遞給它們的消息處理函數
LRESULT CALLBACK WindowProcere (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
witch (message)
{
...
}
}
MSG在winuser.h中被定義為
typedef struct tagMSG {
HWND hwnd;//接收消息的窗體的句柄
UINT message;//消息ID, 例如WM_CLOSE、WM_MOUSEMOVE
WPARAM wParam;//消息參數, 含義隨message的不同而不同
LPARAM lParam;//消息參數, 含義隨message的不同而不同
DWORD time;//消息投遞到消息隊列的時間
POINT pt;//產生消息時滑鼠的坐標
} MSG,*LPMSG,*PMSG;
㈣ 怎麼用C語言向指定窗口發送消息
如果是簡單情況, 需要輸入的數據就在一個文件里放著。 比如 test.dat , 而要接收數據的程序文件叫 run.exe
可以這樣 運行這個程序: run.exe < test.dat
這樣文件內容就作為run.exe運行時的輸入了。
如果是復雜點的情況,需要輸入的數據是隨時算的, 可以寫個「輸出所需數據」的程序, 就是做數據然後 printf出來就可以(別忘了回車) 。 這個程序比如叫 data.exe
可以這樣運行兩個程序: data.exe | run.exe
這樣 data.exe輸出的內容就作為run.exe運行時的輸入了
㈤ 如何用C語言實現向某個IP發送數據包(例如4個浮點數)
使用socket編程即可。
1、網路的Socket數據傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket也具有一個類似於打開文件的函數調用Socket(),該函數返回一個整型的Socket描述符,隨後的連接建立、數據傳輸等操作都是通過該Socket實現的。
2、下面用Socket實現一個windows下的c語言socket通信例子,這里客戶端傳遞一個字元串,伺服器端進行接收。
【伺服器端】
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#include <winsock2.h>
#define SERVER_PORT 5208 //偵聽埠
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int ret, nLeft, length;
SOCKET sListen, sServer; //偵聽套接字,連接套接字
struct sockaddr_in saServer, saClient; //地址信息
char *ptr;//用於遍歷信息的指針
//WinSock初始化
wVersionRequested=MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本
ret=WSAStartup(wVersionRequested, &wsaData);
if(ret!=0)
{
printf("WSAStartup() failed!\n");
return;
}
//創建Socket,使用TCP協議
sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sListen == INVALID_SOCKET)
{
WSACleanup();
printf("socket() faild!\n");
return;
}
//構建本地地址信息
saServer.sin_family = AF_INET; //地址家族
saServer.sin_port = htons(SERVER_PORT); //注意轉化為網路位元組序
saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址
//綁定
ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer));
if (ret == SOCKET_ERROR)
{
printf("bind() faild! code:%d\n", WSAGetLastError());
closesocket(sListen); //關閉套接字
WSACleanup();
return;
}
//偵聽連接請求
ret = listen(sListen, 5);
if (ret == SOCKET_ERROR)
{
printf("listen() faild! code:%d\n", WSAGetLastError());
closesocket(sListen); //關閉套接字
return;
}
printf("Waiting for client connecting!\n");
printf("Tips: Ctrl+c to quit!\n");
//阻塞等待接受客戶端連接
while(1)//循環監聽客戶端,永遠不停止,所以,在本項目中,我們沒有心跳包。
{
length = sizeof(saClient);
sServer = accept(sListen, (struct sockaddr *)&saClient, &length);
if (sServer == INVALID_SOCKET)
{
printf("accept() faild! code:%d\n", WSAGetLastError());
closesocket(sListen); //關閉套接字
WSACleanup();
return;
}
char receiveMessage[5000];
nLeft = sizeof(receiveMessage);
ptr = (char *)&receiveMessage;
while(nLeft>0)
{
//接收數據
ret = recv(sServer, ptr, 5000, 0);
if (ret == SOCKET_ERROR)
{
printf("recv() failed!\n");
return;
}
if (ret == 0) //客戶端已經關閉連接
{
printf("Client has closed the connection\n");
break;
}
nLeft -= ret;
ptr += ret;
}
printf("receive message:%s\n", receiveMessage);//列印我們接收到的消息。
}
// closesocket(sListen);
// closesocket(sServer);
// WSACleanup();
}
【客戶端】
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#define SERVER_PORT 5208 //偵聽埠
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int ret;
SOCKET sClient; //連接套接字
struct sockaddr_in saServer; //地址信息
char *ptr;
BOOL fSuccess = TRUE;
//WinSock初始化
wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本
ret = WSAStartup(wVersionRequested, &wsaData);
if(ret!=0)
{
printf("WSAStartup() failed!\n");
return;
}
//確認WinSock DLL支持版本2.2
if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
{
WSACleanup();
printf("Invalid WinSock version!\n");
return;
}
//創建Socket,使用TCP協議
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient == INVALID_SOCKET)
{
WSACleanup();
printf("socket() failed!\n");
return;
}
//構建伺服器地址信息
saServer.sin_family = AF_INET; //地址家族
saServer.sin_port = htons(SERVER_PORT); //注意轉化為網路節序
saServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.127");
//連接伺服器
ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer));
if (ret == SOCKET_ERROR)
{
printf("connect() failed!\n");
closesocket(sClient); //關閉套接字
WSACleanup();
return;
}
char sendMessage[]="hello this is client message!";
ret = send (sClient, (char *)&sendMessage, sizeof(sendMessage), 0);
if (ret == SOCKET_ERROR)
{
printf("send() failed!\n");
}
else
printf("client info has been sent!");
closesocket(sClient); //關閉套接字
WSACleanup();
}
㈥ 用objective-c語言實現一個消息中心(NSnotificationcenter)功能
對象之間進行通信最基本的方式就是消息傳遞,在Cocoa中提供Notification
Center機制來完成這一任務。其主要作用就是負責在任意兩個對象之間進行通信。使用方法很簡單,如下幾個步驟即可:
假設A與B之間進行通信,B來觸發事件,A接受該事件,並作出響應。
1)
A編寫自定義的消息響應函數update
2)
A向消息中心注冊,[NSNotificationCenter
defaultCenter]
addObserver:
self
selector:@selector(update)
name:@"update"
object:nil]
3)
B觸發事件[[NSNotificationCenter
defaultCenter]
postNotificationName:@"update"
object:nil]
每一個進程都有一個默認的NSNotificationCenter,可以通過類方法defaultCenter獲取該消息中心的實例。消息中心可以處理同一進程中不同對象之間的消息。如果要在同一台機器上進行進程間的通信,需要使用。
消息中心以同步的方式將消息分發到所有的觀察者中,換言之,直到所有的觀察者都收到消息並處理完畢以後,控制權才會回到調用者的手裡。如果需要非同步的處理消息,需要使用通知隊列NSNotificationQueue。
在多線程程序中,通知會被分發到每一個發起消息的線程中,這可能與觀察者注冊時所在的線程已經不是同一線程。
實例:
@implementation
TestClass
-
(void)
dealloc
{
//
If
you
don't
remove
yourself
as
an
observer,
the
Notification
Center
//
will
continue
to
try
and
send
notification
objects
to
the
deallocated
//
object.
[[NSNotificationCenter
defaultCenter]
removeObserver:self];
[super
dealloc];
}
-
(id)
init
{
self
=
[super
init];
if
(!self)
return
nil;
//
Add
this
instance
of
TestClass
as
an
observer
of
the
TestNotification.
//
We
tell
the
notification
center
to
inform
us
of
"TestNotification"
//
notifications
using
the
receiveTestNotification:
selector.
By
//
specifying
object:nil,
we
tell
the
notification
center
that
we
are
not
//
interested
in
who
posted
the
notification.
If
you
provided
an
actual
//
object
rather
than
nil,
the
notification
center
will
only
notify
you
//
when
the
notification
was
posted
by
that
particular
object.
[[NSNotificationCenter
defaultCenter]
addObserver:self
selector:@selector(receiveTestNotification:)
name:@"TestNotification"
object:nil];
return
self;
}
-
(void)
receiveTestNotification:(NSNotification
*)
notification
{
//
[notification
name]
should
always
be
@"TestNotification"
//
unless
you
use
this
method
for
observation
of
other
notifications
//
as
well.
if
([[notification
name]
isEqualToString:@"TestNotification"])
NSLog
(@"Successfully
received
the
test
notification!");
}
@end
㈦ 求09年3月計算機二級C語言筆試答案
博客首頁 排行榜 點播單(0) 《你我的南京》徵文 注冊 幫助
博文綜合 博文 博主 圖片 音樂 視頻 播主 論壇 新浪吧 圈子
慲慲哋杺里,炷孒1個沵~~
http://blog.sina.com.cn/rourou881225[訂閱]肉肉兒博客 相冊 音樂 播客 個人中心 首頁博文收藏博客圈字體大小:大中小 正文 09年3月全國計算機考試三級網路技術筆試答案(2009-03-29 22:27:32)標簽:雜談
09年3月全國計算機考試三級網路技術筆試試題答案
一、選擇題(每小題1分,共60分)
(1)1959年10月我國研製成功的一台通用大型電子管計算機是(B)
A)103計算機
B)104計算機
C)120計算機
D)130計算機
(2)關於計算機應用的描述中,錯誤的是(C)
A)模擬操作是一種特殊的研究方法
B)大氣預報採用了巨型計算機處理數據
C)經濟運行模型還不能用計算機模擬
D)過程式控制制可採用抵擋的處理晶元
(3)關於伺服器的描述中,正確的是(D)
A)按體系結構分為入門級、部門級、企業級伺服器
B)按用途分為台式、機架式、機櫃式伺服器
C)按處理器類型分為文件、資料庫伺服器
D)刀片式伺服器的每個刀片是一塊系統主板
(4)關於計算機配置的描述中,錯誤的是(A)
A)伺服器機箱的個數用1U/2U/3U/....../8U表示
B)現在流行的串介面硬碟是SATA硬碟
C)獨立磁碟冗餘陣列簡稱磁碟陣列
D)串列SCSI硬碟簡稱SAS硬碟
(5)關於軟體開發的描述中,正確的是(B)
A)軟體生命周期包括計劃、開發兩個階段
B)開發初期進行需求分析、總體設計、詳細設計
C)開發後期進行編碼、測試、維護
D)軟體運行和使用中形成文檔資料
(6)關於多媒體的描述中,錯誤的是(D)
A)多媒體的數據量很大,必須進行壓縮才能實用
B)多媒體數據有許多冗餘,這是進行的基礎
C)信息編碼法提供了無損壓縮
D)常用的預測編碼是變換編碼
(7)關於數據報交換方式的描述中,錯誤的是(A)
A)在報文傳輸前建立源結點與目標的結點之間的虛電路
B)同一報文的不同分組可以經過不同路徑進行傳輸
C)同一報文的每個分組中都要有源地址和目標地址
D)同一報文的不同分組可能不按順序到達目的結點
(8)IEEE802.11無線區域網的介質訪問控制方法中,幀間間隔大小取決於(D)
A)接入點
B)交換機
C)幀大小
D)幀類型
(9)以下網路應用中不屬於Web應用的是(B)
A)電子商務
B)域名解析
C)電子政務
D)博客
(10)關於千兆乙太網的描述中,錯誤的是(C)
A)與傳統乙太網採用相同的幀結構
B)標准中定義了千兆介質專用介面
C)只使用光纖作為傳輸介質
D)用GMII分割MAC子層與物理層
(11)虛擬區域網的技術基礎是(C)
A)路由技術
B)寬頻分配
C)交換技術
D)沖突檢測
(12)關於OSI參考模型的描述中,正確的是(C)
A)高層為低層提供所需的服務
B)高層需要知道低層的實現方法
C)不同結點的同等層有相同的功能 D)不同結點需要相同的操作系統
(13)如果網路結點傳輸10bit數據需要1×10-8,則該網路的數據傳輸速度是(B)
A)10Mbps
B)1Gbps
C)100Mbps
D)10Gbps
(14)關於傳統Ethernet的描述中,錯誤的是(D)
A)是一種典型的匯流排型區域網
B)結點通過廣播方式發送數據
C)需要解決介質訪問控制問題
D)介質訪問控制方法是CSMACA
(15)網橋實現網路互聯的層次是(A)
A)數據鏈路層
B)傳輸層
C)網路層
D)應用層
(16)在TC/IP參考模型中,負責提供面向連接服務的協議是(C)
A)FTP
B)DNS
C)TCP
D)TDP
(17)以下哪一個不是無線區域網IEEE80211規定的物理層傳輸方式?(C)
A)直接序列擴頻
B)跳頻擴頻
C)藍牙
D)紅外
(18)關於網路層的描述中,正確的是(B)
A)基本數據傳輸單位是幀
B)主要功能是提供路由選擇
C)完成應用層信息格式的轉換
D)提供端到端的傳輸服務
(19)1000BASE-T標准支持的傳輸介質是(C)
A)單模光纖
B)多模光纖
C)非屏蔽雙絞線
D)屏蔽雙絞線
(20)電子郵件傳輸協議是(D)
A)DHCP
B)FTP
C)CMIP
D)SMTP
(21)關於IEEE802模型的描述中,正確的是(B)
A)對應於OSI模型的網路層
B)數據鏈路層分為LLC與MAC層
C)只包括一種區域網協議
D)針對廣域網環境
(22)關於Ad Hoc網路的描述中,錯誤的是(B)
A)是一種對等的無線移動網路
B)在WALN的基礎上發展起來
C)採用無基站的通信模式
D)在軍事領域應用廣泛
(23)以下P2P應用軟體中不屬於文件共享類應用的是(A)
A)Skype
B)Gnutella
C)Napster
D)BitTorrent
(24)關於伺服器操作系統的描述中,錯誤的是(D)
A)是多用戶、多任務的系統
B)通常採用多線程的處理方式
C)線程比進程需要的系統開銷小
D)線程管理比進程管理復雜
(25)關於Windows Server基本特徵的描述中,正確的是(B)
A) Windows 2000開始與IE集成,並擺脫了DOS
B) Windows 2003依據.NET架構對NT技術做了實質的改進
C) Windows 2003 R2可靠性提高,安全性尚顯不足
D) Windows 2008重點加強安全性,其他特徵與前面版本類似
(26)關於活動目標的描述中,錯誤的是(D)
A)活動目標包括目錄和目錄服務
B)域是基本管理單位,通常不再細分
C)活動目標採用樹狀邏輯結構
D)通過域構成樹,樹再組成森林
(27)關於Unix操作系統的描述中,正確的是(A)
A) Unix由內核和外殼兩部分組成
B)內核由文件子系統和目錄子系統組成
C)外殼由進程子系統和線程子系統組成
D)內核部分的操作原語對用戶程序起作用
(28)關於Linux操作系統的描述中,錯誤的是(C)
A)內核代碼與Unix不同
B)適合作為Internet服務平台
C)文件系統是網狀結構
D)用戶界面主要有KDE和GNOME
(29)關於TCP/IP協議集的描述中,錯誤的是(A)
A)由TCP和IP兩個協議組成
B)規定了Internet中主機的定址方式
C)規定了Internet中信息的傳輸規則
D)規定了Internet中主機的命名機制
(30)關於IP互聯網的描述中,錯誤的是(C)
A)隱藏了低層物理網路細節
B)數據可以在IP互聯網中跨網傳輸
C)要求物理網路之間全互連
D)所有計算機使用統一的地址描述方法
(31)以下哪個地址為回送地址?(B)
A) 128.0.0.1
B) 127.0.0.1
C) 126.0.0.1
D) 125.0.0.1
(32)如果一台主機的IP地址為20.22.25. 6,子網掩碼為255.255.255.0,那麼該主機的主機號為(A)
A) 6
B) 25
C) 22
D) 20
(33)一個連接兩個乙太網的路由器接收到一個IP數據報,如果需要將該數據報轉發到IP地址為202.123.1.1的主機,那麼該路由器可以使用哪種協議尋找目標主機的MAC地址?(B)
A) IP
B) ARP
C) DNS
D) TCP
(34)在沒有選項和填充的情況下,IPv4數據報報頭長度域的值應該為(C)
A) 3
B) 4
C) 5
D) 6
(35)對IP數據報進行分片的主要目的是(D)
A)提高互聯網的性能
B)提高互聯網的安全性
C)適應各個物理網路不同地址的長度
D)適應各個物理網路不同的MTU長度
(36)以下關於ICMP差錯報文特點的描述中,錯誤的是(A)
A)享受特別優先權和可靠性
B)數據包含故障IP數據報數據區的前64比特
C)伴隨拋棄出錯IP數據報產生
D)目的地址通常為拋棄數據報的源地址
(37)一個路由器的路由表如下所示。如果該路由器接收到一個目的IP地址為10.1.2.5的報文,那麼它應該將其投遞到(B)
要到達的網路
下一路由地址
10.2.0.0
直接投遞
10.3.0.0
直接投遞
10.1.0.0
10.2.0.5
10.4.0.0
10.3.0.7
A)10.1.0.0
B)10.2.0.5
C)10.4.0.0
D)10.3.0.7
(38)關於RIP與OSPF協議的描述中,正確的是(C)
A)RIP和OSPF都採用向量-距離演算法
B) RIP和OSPF都採用鏈路-狀態演算法
C) RIP採用向量-距離演算法,OSPF採用鏈路-狀態演算法
D) RIP採用鏈路-狀態演算法,OSPF採用向量-距離演算法
(39)為確保連接的可靠建立,TCP採用的技術是(D)
A)4次重發
B)3次重發
C)4次握手
D)3次握手
(40)關於客戶機/伺服器模式的描述中,正確的是(A)
A)客戶機主動請求,伺服器被動等待
B)客戶機和伺服器都主動請求
C)客戶機被動等待,伺服器主動請求
D)客戶機和伺服器都被動等待
(41)關於Internet域名系統的描述中,錯誤的是(C)
A)域名解析需要一組既獨立又協作的域名伺服器
B)域名伺服器邏輯上構成一定的層次結構
C)域名解析總是從根域名伺服器開始
D)遞歸解析是域名解析的一種方式
(42)pwd是一個FTP用戶介面命令,它的意義是(A)
A)請求用戶輸入密碼
B)顯示遠程主機的當前工作目錄
C)在遠程主機中建立目錄
D)進入主動傳輸方式
(43)為了使電子郵件能夠傳輸二進制信息,對RFC822進行擴充後的標准為(C)
A)RFC823
B)SNMP
C)MIME
D)CERT
(44)關於WWW服務系統的描述中,錯誤的是(B)
A)WWW採用客戶/機伺服器模式
B)WWW的傳輸協議採用HTML
C)頁面到頁面的鏈接信息由URL維持
D)客戶端應用程序稱為瀏覽器
(45)下面哪個不是Internet網路管理協議?(D)
A)SNMPv1
B) SNMPv2
C) SNMPv3
D) SNMPv4
(46)根據計算機信息系統安全保護等級劃分准則,安全要求最高的防護等級是(D)
A)指導保護級
B)強制保護級
C)監督保護級
D)專控保護級
(47)下面那種攻擊屬於被動攻擊?(A)
A)流量分析
B)數據偽裝
C)消息重放
D)消息篡改
(48)AES加密演算法處理的分組長度是(B)
A)56位
B)64位
C)128位
D) 256位
(49)RCS加密演算法沒有採用的基本操作是(C)
A)異或
B)循環
C)置換
D)加
(50)關於消息認證的描述中,錯誤的是(C)
A)消息認證稱為完整性校驗
B)用於識別信息源的真偽
C)消息認證都是實時的
D)消息認證可通過認證碼實現
(51)關於RSA密碼體制的描述中,正確的是(D)
A)安全性基於橢圓曲線問題
B)是一種對稱的密碼體制
C)加密速度很快
D)常用於數字簽名
(52)關於Kerberors認證系統的描述中,錯誤的是(D)
A)有一個包含所有用戶密鑰的資料庫
B)用戶密鑰是一個加密口令
C)加密演算法必須使用DES
D)Kerberos提供會話密鑰
(53) RSA演算法加密時,已知公鑰是(e=7,n=20),私鑰是(d=3,n=20),用公鑰對消息M=3加密,得到的密文是:(D)
A)19
B)13
C)12
D)7
(54)下面哪個地址不是組播地址? (D)
A)224.0.1.1
B)232.0.0.1
C)233.255.255.1
D)240.255.255.1
(55)下面哪種P2P網路拓撲不是分布式非結構化的?(B)
A)Gnutella
B)Maze
C)LimeWire
D)BearShare
(56)關於即時通信的描述中,正確的是(C)
A)只工作在客戶機/伺服器方式
B)QQ是最早推出的即時通信軟體
C)QQ的聊天通信是加密的
D)即時通信系統均採用SIP協議
(57)下面哪種服務不屬於IPTV通信類服務?(C)
A)IP語音服務
B)即時通信服務
C)遠程教育服務
D)電視簡訊服務
(58)從技術發展角度看,最早出現的IP電話工作方式是(A)
A)PC-to-PC
B)PC-to-Phone
C)Phone-to-PC
D) Phone-to- Phone
(59)數字版權管理主要採用數據加密、版權保護、數字簽名和(B)
A)認證技術
B)數字水印技術
C)訪問控制技術
D)防篡改技術
(60)網路全文搜索引擎一般包括搜索器、檢索器、用戶介面和(A)
A)索引器
B)機器人
C)爬蟲
二、填空題(每題2分,共40分)
(1)精簡指令集計算機的英文縮寫是【RISC】。
(2)流媒體數據流具有連續性、實時性和【時序性】三個特點。
(3)00-60-38-00-08-A6是一個【MAC】地址。
(4)Ethernet V2.0規定幀的數據欄位的最大長度是【1500B】。
(5)RIP協議用於在網路設備之間交換【路由】信息。
(6)網路協議的三個要素是【語法】、語義與時序。
(7)TCP/IP參考模型的主機—網路層對應於OSI參考模型的物理層與【數據鏈路層】。
(8)一台Ethernet交換機提供24個100Mbps的全雙工埠與1個1Gbps的全雙工埠,在交換機滿配置情況下的總帶寬可以達到【6.8Gps】。
(9)Web/OS是運行在【瀏覽器】中的虛擬操作系統。
(10)Novell公司收購了SUSE,以便通過SUSE【Linux】Professional產品進一步發展網路操作系統業務。
(11)IP服務的三個特點是:不可靠、面向非連接和【盡最大努力投遞】。
(12)如果一個IP地址為10.1.2.20,子網掩碼為255.255.255.0的主機需要發送一個有限廣播數據報,該有限廣播數據報的目的地址為【255.255.255.255】。
(13)IPv6的地址長度為【128】位。
(14)瀏覽器結構由一個【控制單元】和一系列的客戶單元、解釋單元組成。
(15)為了解決系統的差異性,Telnet協議引入了【網路虛擬終端(或NVT)】,用於屏蔽不同計算機系統對鍵盤輸入解釋的差異。
(16)SNMP從被管理設備收集數據有兩種方法:基於【輪詢】方法和基於中斷方法。
(17)數字簽名是筆跡簽名的模擬,用於確認發送者身份,是一個【加密】的消息摘要。
(18)包過濾防火牆依據規則對收到的IP包進行處理,決定是【轉發】還是丟棄。
(19)組播允許一個發送方發送數據包到多個接收方。不論接收組成員的數量是多少,數據源只發送【一次】數據包。
(20)P2P網路存在四種主要結構類型,Napster是【集中】目錄式結構的代表
㈧ SSL/TLS協議原理解讀
HTTPS是什麼相信大家都知道,如果你不知道。。。請關閉此文!!!
HTTP的數據是明文傳輸的,沒有安全性可言。HTTPS是秘文傳輸,那麼HTTPS是怎麼實現數據的安全(加密)傳輸的?那是因為HTTPS比HTTP多了個'S'。 即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。
SSL/TLS協議是網路安全通信的重要基石,本文將簡單介紹SSL/TLS協議,主要關注SSL/TLS協議的安全性,特別是SSL規范的正確實現。 本系列的文章大體分為幾個部分:
1、SSL/TLS簡介
2、SSL/TLS協議的基本流程
3、從SSL到TLS
4、SSL/TLS的流行實現庫
SSL全稱是Secure Sockets Layer,安全套接字層,它是由網景公司(Netscape)設計的主要用於Web的安全傳輸協議,目的是為網路通信提供機密性、認證性及數據完整性保障。如今,SSL已經成為互聯網保密通信的工業標准。
SSL最初的幾個版本(SSL 1.0、SSL2.0、SSL 3.0)由網景公司設計和維護,從3.1版本開始,SSL協議由網際網路工程任務小組(IETF)正式接管,並更名為TLS(Transport Layer Security),發展至今已有TLS 1.0、TLS1.1、TLS1.2這幾個版本。
如TLS名字所說,SSL/TLS協議僅保障傳輸層安全。同時,由於協議自身特性(數字證書機制),SSL/TLS不能被用於保護多跳(multi-hop)端到端通信,而只能保護點到點通信。
SSL/TLS協議能夠提供的安全目標主要包括如下幾個:
認證性——藉助數字證書認證伺服器端和客戶端身份,防止身份偽造
機密性——藉助加密防止第三方竊聽
完整性——藉助消息認證碼(MAC)保障數據完整性,防止消息篡改
重放保護——通過使用隱式序列號防止重放攻擊
為了實現這些安全目標,SSL/TLS協議被設計為一個兩階段協議,分為握手階段和應用階段:
握手階段也稱協商階段,在這一階段,客戶端和伺服器端會認證對方身份(依賴於PKI體系,利用數字證書進行身份認證),並協商通信中使用的安全參數、密碼套件以及MasterSecret。後續通信使用的所有密鑰都是通過MasterSecret生成。
在握手階段完成後,進入應用階段。在應用階段通信雙方使用握手階段協商好的密鑰進行安全通信。
Handshake協議:包括協商安全參數和密碼套件、伺服器身份認證(客戶端身份認證可選)、密鑰交換;
ChangeCipherSpec 協議:一條消息表明握手協議已經完成;
Alert 協議:對握手協議中一些異常的錯誤提醒,分為fatal和warning兩個級別,fatal類型的錯誤會直接中斷SSL鏈接,而warning級別的錯誤SSL鏈接仍可繼續,只是會給出錯誤警告;
Record 協議:包括對消息的分段、壓縮、消息認證和完整性保護、加密等。
圖2、圖3都是表示的協議流程,大同小異。可以對比著看加深理解。
每一個SSL/TLS鏈接都是從握手開始的,握手過程包含一個消息序列,用以協商安全參數、密碼套件,進行身份認證以及密鑰交換。握手過程中的消息必須嚴格按照預先定義的順序發生,否則就會帶來潛在的安全威脅。今年頂級安全會議CCS 有文章提出了建立綜合狀態機來檢查SSL鏈接中消息序列……
2.1 握手過程中的消息序列
ClientHello:ClientHello通常是握手過程中的第一條消息,用於告知伺服器客戶端所支持的密碼套件種類、最高SSL/TLS協議版本以及壓縮演算法。
ClientHello中還包含一個隨機數,這個隨機數由4個位元組的當前GMT UNIX時間以及28個隨機選擇的位元組組成,共32位元組。該隨機數會在密鑰生成過程中被使用。
另外,ClientHello中還可能包含客戶端支持的TLS擴展。(TLS擴展可以被用來豐富TLS協議的功能或者增強協議的安全性)
ServerHello:伺服器接受到ClientHello後,會返回ServerHello。伺服器從客戶端在ClientHello中提供的密碼套件、SSL/TLS版本、壓縮演算法列表裡選擇它所支持的項,並把它的選擇包含在ServerHello中告知客戶端。接下來SSL協議的建立就基於伺服器選擇的密碼套件類型、SSL/TLS協議版本以及壓縮演算法。
ServerHello中同樣會包含一個隨機數,同樣4+28 位元組類型,由伺服器生成。
Certificate:客戶端和伺服器都可以發送證書消息來證明自己的身份,但是通常客戶端證書不被使用。 伺服器一般在ServerHello後會接一條Certificate消息,Certificate消息中會包含一條證書鏈,從伺服器證書開始,到Certificate authority(CA)或者最新的自簽名證書結束。下圖形象地描述了證書鏈:
SSL中使用的證書通常是X.509類型證書,X.509證書的內容如下表所示:
在用的X.509證書包含Version 1和Version 3兩種版本,其中v1版本的證書存在安全隱患,同時不支持TLS擴展,被逐漸棄用。現在大多數在用的SSL證書都是V3版本。
同時證書會附帶與協商好的密鑰交換演算法對應的密鑰。密鑰交換演算法以及它們所要求的密鑰類型如下表所示。
ServerKeyExchange:該消息僅當以下密鑰交換演算法被使用時由伺服器發出:
RSA_EXPORT(僅當伺服器的公鑰大於512bit時)、DHE_DSS、DHE_DSS_EXPORT、DHE_RSA、DHE_RSA_EXPORT、DH_anon 使用其它密鑰交換演算法時,伺服器不能發送此消息。
ServerkeyExchange消息會攜帶這些密鑰交換演算法所需要的額外參數,以在後續步驟中協商PreMasterSecret。這些參數需要被簽過名。
CertificateRequest:這個消息通常在要求認證客戶端身份時才會有。消息中包含了證書類型以及可接受的CA列表。
ServerHelloDone:伺服器發送這條消息表明伺服器部分的密鑰交換信息已經發送完了,等待客戶端的消息以繼續接下來的步驟。這條消息只用作提醒,不包含數據域。
ClientKeyExchange:這條消息包含的數據與所選用的密鑰交換演算法有關。
如果選擇的密鑰交換演算法是RSA,那麼消息包含的參數為用伺服器RSA公鑰(包含在之前證書中的或者是ServerKeyExchange中的)加密過的PreMasterSecret,它有48個位元組,前2個位元組表示客戶端支持的最高協議版本,後46個位元組是隨機選擇的。
如果選擇的密鑰交換演算法是DH或者DHE,則可能有兩種情況:
隱式DH公開值:包含在Certificate消息里;
顯示DH公開值:公開值是本消息的一部分。
CertificateVerify:這條消息用來證明客戶端擁有之前提交的客戶端證書的私鑰。
Finished:表明握手階段結束。這是第一條用協商的演算法和密鑰保護的消息。
因為是用協商好的密鑰加密的消息,它可以用來確認已經協商好的密鑰。
同時Finished消息包含一個verify_data域,可以用來校驗之前發送和接收的信息。
Verify_data域是一個PRF函數的輸出(pseudo-random function)。這個偽隨機函數的輸入為:(1)兩個hash值:一個SHA-1,一個MD5,對之前握手過程中交換的所有消息做哈希;(2)the MasterSecret,由預備主密鑰生成;(3)finished_label,如果客戶端發送的則是」client finished」,伺服器發送的則是」server finished」。關於這個PRF的細節在3.3節中會具體描述。 此外,Finished 消息不能夠在ChangeCipherSpec前發送。
2.2 不同密鑰交換演算法對應的握手過程
不同的密鑰交換演算法對應的握手過程中的消息序列是不同的,相應的實現方式也不同,本節介紹幾個常見密鑰交換演算法對應的握手過程。
TLS-RSA:在這個場景下,PreMasterSecret是由客戶端指定的,並用RSA公鑰加密發送給伺服器。伺服器不影響PReMasterSecret的生成。
TLS-DH:基於DH的密鑰交換也被稱為靜態Diffie-Hellman。在這種場景下,可能是雙方各自提交一個證書包含DH公開值,或者伺服器端提交證書包含DH公開值,客戶端在每次會話中選擇一個值。協商好的DH值被用作PreMasterSecret。顯然證書中的參數是固定的,那麼每次鏈接的PreMasterSecret也是相同的。
TLS-DH不能提供前向安全性。
TLS-DHE:基於DHE的TLS握手中會有ServerKeyExchange消息。握手過程中交換參數的認證通過數字簽名來實現,支持的簽名演算法包括RSA和DSS。DH參數會有它的數字簽名一起被包含在ServerKeyExchange中被發送出去。客戶端在ClientKeyExchange中返回它的公開DH參數,但沒有簽名保護。同樣協商出來的DH密鑰被用作PreMasterSecret。
2.3 密鑰生成
Pseudo-random Function(PRF):偽隨機函數是SSL協議中的一個重要組成部分,它被用來秘密擴展以及生成密鑰。在3.1節講解Finished消息時已經簡單提及PRF,在這里我們詳細討論PRF的工作原理。SSL/TLS協議中的PRF如下圖所示:
這個PRF基於兩個hash函數:MD5和SHA-1,它有3個輸入,一個Secret(比如PreMasterSecret),一個標志符(比如」client finished」, 「server finished」),還有一個種子值(比如客戶端隨機數+伺服器端隨機數)。
Secret在使用時被分為長度相同的兩半:S1和S2,分別作為P_MD5和P_SHA-1的輸入。
PRF的輸出按如下方式處理得到:
P_MD5和P_SHA-1都是擴展函數,用來擴展秘密值以用於密鑰生成,它們的計算方式如下:
其中A(0) = seed, A(i) = HMAC hash( secret, A( i −1) )
這個秘密擴展會一直進行直到得到足夠多的擴展數據。 Key Derivation:主密鑰(MasterSecret)是利用上述PRF從預備主密鑰(PreMasterSecret)生成的。每個MasterSecret為48位元組,生成方式如下:
得到MasterSecret後,它會被進一步處理最後生成4個不同的密鑰和2個初始向量(IV)。處理過程如下:
處理過程一直持續到足夠多的輸出被生成,然後把輸出分為4個key和2個IV:
下圖完整闡述了SSL/TLS協議中的密鑰生成過程。
本節介紹SSL/TLS協議的版本變遷,不同版本的區別以及安全特性等。
SSL 1.0由於從來沒有被公開過,並且存在嚴重安全漏洞,我們就不討論了。
SSL 2.0:SSL 2.0於1995年4月被發布。SSL 2.0中主要存在的問題如下:
MAC不能覆蓋填充長度域,攻擊者可能利用這點破壞消息完整性;
缺乏握手認證,攻擊者可以篡改密碼套件列表,誘騙通信雙方使用較弱的密碼套件;
使用較弱的或有問題的密碼演算法(如MD5,RC4等),或者使用不安全的分組模式(如CBC模式);
對於不同的密碼學基元使用相同的密鑰,違背基本安全常識。
由於以上安全問題,RFC 6176已經明確提出避免使用SSL 2.0,但是現實生活中還有少量客戶端和伺服器支持SSL 2.0.
SSL 3.0:SSL 3.0引入了一些新的特性和機制解決了很多之前版本存在的漏洞。此外,SSL 3.0中引入了ChangeCipherSpec子協議。SSL 3.0向後兼容SSL 2.0,相對於SSL 2.0,它的主要改變包括以下幾點:
支持更多的密碼套件(支持更多的密碼演算法如DSS,SHA-1)
在握手階段支持密鑰協商(DH和FORTEZZA)
支持密碼學參數的重協商
增加了消息壓縮選項
MAC能夠覆蓋填充長度域了,同時MAC可以使用MD5或者SHA-1
不同的密碼學基元使用不同的key
Alert子協議能對任何錯誤給出兩種提示:Warning和Fatal
中止鏈接的時候會用一個close_notify警告通知通信雙方
支持證書鏈,而非單個證書
通過Finished消息認證所有發送和接收的消息
加密了的PreMasterSecret包含當前使用的協議版本,防止協議回滾
TLS 1.0:TLS 1.0和SSL 3.0差別非常小。實際上,TLS 1.0是SSL 3.1,在IETF接手後改名為TLS。TLS 1.0版本是目前使用最廣泛的SSL/TLS協議版本。
TLS 1.0不再支持使用FORTEZZA的密碼套件。
TLS 1.0中MAC被替換成HMAC。
之前提到ChangeCipherSpec消息必須在Finished消息前發送,在TLS 1.0中,如果消息序列不符合這個要求,會產生FATAL警告並終止鏈接。
TLS 1.1:這個版本相比之前改動也很小。最重要的改動是預防了針對CBC分組模式的一些攻擊。現在的填充錯誤變的和非法MAC錯誤不可區分了,防止攻擊者利用可區分錯誤響應建立解密預言機對密文進行攻擊。
在每次加密過程中,使用CBC分組模式時,都需要顯示給出IV,而不用再密鑰生成時使用PRF生成IV。
此外,TLS 1.1禁止為適應之前出口限制而使用弱化的密碼套件。
TLS 1.2:這是最新的版本,部署的還比較少。這個版本禁用了PRF中的MD5和SHA-1,而用一個可配置的hash函數取代了它們,這樣的修改簡化了計算過程。修改後的PRF風格如下:
此外,TLS 1.2的一個重要變化是支持認證加密模式(支持GCM等)。但是由於一些AEAD(Authenticated Encryption with Associated Data)密碼演算法要求IV為隱式的,所以IV又恢復到由MasterSecret生成,即TLS 1.0以前的風格。
TLS 1.2支持使用GCM、CCM的新密碼套件。
同時SSL 2.0被宣布放棄,不再向後兼容SSL 2.0.
本節簡單介紹一下流行的SSL/TLS實現庫,SSL協議非常復雜,由開發者自己實現常常會出錯,開發者在具體實現SSL協議時通常會依賴於這些密碼學庫。
4.1 常見的SSL/TLS 實現
OpenSSL:這是非常流行的開源SSL/TLS實現。
OpenSSLim完全用C語言實現,支持SSL 2.0/3.0,TLS 1.0/1.1/1.2以及DTLS 1.0。
OpenSSL 近年來出現了很多的安全漏洞,比如2014年曝出的著名的Heartbleed漏洞等。
JSSE:這是使用Java實現的,支持SSL 3.0,TLS 1.0/1.1/1.2.
Bouncy Castle:它不僅僅支持SSL/TLS,它是一個完整的密碼學庫,支持各種密碼學演算法和協議。不過它僅僅支持TLS 1.0版本。
Android平台主要使用這個密碼學庫。
GnuTLS:這是另一個用C語言實現的庫,支持SSL 3.0,TLS 1.0/1.1/1.2以及DTLS 1.0。主要在Unix世界被使用。同時以各種安全漏洞多而聞名。
NSS:這是最初由網景公司(Netscape)開發的庫,支持SSL 2.0/3.0,TLS 1.0/1.1,現在主要被瀏覽器和客戶端軟體使用,比如Firefox使用的就是NSS庫,Chrome使用的是一個NSS庫的修正版。
下表是一些常見軟體以及它們所使用的SSL/TLS實現庫的情況:
其它還有一些常用的SSL實現庫,如cryptlib、CyaSSL、MatrixSSL、PolarSSL等,由於市場佔有率不高,我們這里就不多做介紹了。
4.2 流行SSL/TLS實現庫的安全研究
最近幾年曝出的高風險SSL安全漏洞大多跟SSL實現庫有關,比如2014年4月曝出的「心臟滴血」漏洞,存在於OpenSSL 1.0.1-1.0.1f版本中,影響全球近17%的Web伺服器;同樣是2014年曝出的蘋果公司iOS 7.0.6版本系統中存在的「gotofail」漏洞,因為程序員的疏忽導致SSL證書校驗中的簽名校驗失效;包括今年曝出的SSL Freak攻擊也是由於SSL實現庫的安全漏洞導致的攻擊,我們研究小組的同學對這個攻擊有詳細的分析,參見《SSL Freak來襲:如何實施一個具體的SSL Freak攻擊》。同時我們還開發了一個基於python的中間人代理攻擊框架「風聲」對某國內知名電商的伺服器進行具體的攻擊,並上報了漏洞。
考慮到大量SSL/TLS實現庫中存在安全問題,同時這些主流的SSL/TLS實現庫對開發者而言使用難度較高,比如有些SSL/TLS實現庫要求開發者自己進行隨機數生成或密鑰管理,讓缺乏系統信息安全知識培訓的開發者去使用這樣高度復雜的密碼學庫容易產生很多安全問題。我們在這里推薦一些高級密碼學庫:Google keycazer、NaCl、Cryptlib、GPGME。這些密碼學庫存在的安全問題較少,同時封裝了一些底層的密碼學操作,降低了開發者的使用難度。
以上就是本次要介紹的SSL /TLS協議基本知識,後續的文章我們會對一些典型SSL/TLS攻擊進行具體介紹。
參考:
1、 http://netsecurity.51cto.com/art/201505/476337.htm
2、 http://www.cnblogs.com/NathanYang/p/9183300.html
3、 https://www.cnblogs.com/bhlsheji/p/4586597.html