1. 程式人生 > >2018-2019-1 20165206 《資訊安全系統設計基礎》第八週學習總結

2018-2019-1 20165206 《資訊安全系統設計基礎》第八週學習總結

- 2018-2019-1 20165206 《資訊安全系統設計基礎》第八週學習總結

- 教材學習內容總結

- 客戶端-伺服器編碼模型

  • 每個網路應用都是基於客戶端-伺服器模型的。採用這個模型,一個應用是由一個伺服器程序和一個或多個客戶端程序組成。

  • 一個客戶端-伺服器由以下四步組成:

1、當一個客戶端需要服務時,它向伺服器傳送一個請求,發出一個事務;

2、伺服器收到請求後,解釋它,並以適當的方式操作它的資源;

3、伺服器給客戶端傳送一個響應,並等待下一個請求;

4、客戶端收到響應並處理它。

- c語言實現socket程式設計的相關函式

1.socket()函式
該函式用於根據指定的地址族、資料型別和協議來分配一個套接字的描述字及其所用的資源。Socket函式原型為:
int socket( int domain , int type , int protocol ) ;
a、 引數domain指定地址描述,一般為AP_INET;
b、 引數type指定socket型別:SOCK_STREAM和SOCK_DGRAM;
c、引數protocol通常為0;
d、 函式返回值為一個整型socket描述符,在bind函式中呼叫。

2.bind()函式
該函式用於將一個本地地址與一個套接字繫結在一起。
int bind( int sockfd , struct sockadd* my_addr , int addrlen) ;
a、sockfd:socket描述符,使用socket函式返回值,將該socket與本機上的一個埠相關聯。
在設計伺服器端程式是需要呼叫bind函式,以在該埠上監聽服務請求;而客戶端一般不需要呼叫bind函式,因為只需知道伺服器IP地址,並不關心客戶通過哪個埠與伺服器建立連線,核心會自動選擇一個未被佔用的埠供客戶端來使用。
b、my_addr:指向包含本機IP地址及埠號等資訊的sockaddr型別的指標。
c、addrlen:sizeof( struct sockaddr)的值。
d、bind函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼。

3.connect()函式
與遠端伺服器建立一個TCP連線。
int connect(int sockfd, struct sockaddr* serv_addr, int addrlen);
a、sockfd:目的伺服器的socket描述符。
b、serv_addr:指向包含目的伺服器的IP地址及埠號的指標。
c、addrlen:sizeof( struct sockaddr)的值。
d、connect函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼,進行伺服器端程式設計時不需呼叫connect函式。

4.listen()函式
在伺服器端程式中,當socket與某一埠繫結後,需要監聽該埠,及時處理到達該埠上的服務請求。
int listen(int sockfd, int backlog);
a、sockfd:Socket系統呼叫返回的socket描述符。
b、backlog:指定在請求佇列中允許的最大請求數,進入的連線請求將在佇列中等待接收backlog限制了佇列中等待服務的請求數目,系統預設值為20。
c、listen函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼。

5.accept()函式
當某個客戶端試圖與伺服器監聽的埠連線時,該連線請求將排隊等待伺服器用accept接收它併為其建立一個連線。
int accept(int sockfd, struct sockaddr* addr, int* addrlen);
a、sockfd:被監聽的socket描述符。
b、addr:sockaddr型別的指標變數,用來存放提出連線請求服務的主機資訊。
c、accept函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼,如果沒有錯誤,accept()函式返回一個新想socket描述符,供這個新連線來實用,而伺服器可以繼續在以前的socket上監聽,同時可以在新的socket描述符上進行資料傳送和資料接收(sent()和recv()操作)。

6.sent()和recv()函式
用於在面向連線(TCP)的socket上進行資料傳輸。
send()函式原型:
int send(int sockfd, const void* msg, int len, int flags) ;
a、sockfd:用於傳輸資料的socket描述符。
b、msg:是一個指向要傳送資料的指標。
c、len:以位元組為單位的資料的長度。
d、flags:一般情況下置為0。
e、函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼,否則返回所傳送資料的總數,該數字可能小於len中所規定的大小。
recv()函式原型:
int recv(int sockfd, void* buf, int len, unsigned int flags);
a、sockfd:是接收資料的socket描述符。
b、buf:是存放接收資料的緩衝區。
c、len:以位元組為單位的緩衝區的長度。
d、flags:一般情況下置為0。
e、函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼,無錯則返回讀入的位元組數,如果連線被中止,返回0。

7.endto()和recvfrom()函式
這兩個函式是利用資料報方式(UDP)進行資料傳輸。在無連線的資料報socket方式下,由於本地socket並沒有與遠端機器建立連線,所以在傳送資料時應指明目的地址。
sendto()原型:
int sendto(int sockfd, const void* msg, int len, unsigned int flags, const struct sockaddr* to, int tolen);
a、sockfd:用於傳輸資料的socket描述符。
b、msg:是一個指向要傳送資料的指標。
c、len:以位元組為單位的資料的長度。
d、flags:一般情況下置為0。
e、函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼,否則返回所傳送資料的總數,該數字可能小於len中所規定的大小。
f、表示目的機器的IP地址和埠號。
g、tolen:被賦值為sizeof(struct sockaddr)。
recvfrom函式原型:
int recv(int sockfd, void* buf, int len, unsigned int flags, struct sockaddr* from, int fromlen);
a、sockfd:是接收資料的socket描述符。
b、buf:是存放接收資料的緩衝區。
c、len:以位元組為單位的緩衝區的長度。
d、flags:一般情況下置為0。
e、函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼,無錯則返回讀入的位元組數,如果連線被中止,返回0。
f、from:儲存源機器的IP地址和埠號。
g、fromlen:常被賦值為sizeof(struct sockaddr)。
當對於資料報socket呼叫了connect()函式時,也可以用send()和recv()進行資料傳輸,但該socket仍然是資料報socket,並利用傳輸層的UDP服務。但是在傳送或接收資料報時,核心會自動為它加上目的地址和源地址資訊。

8.close()和shutdown()函式
當所有的資料操作結束後,可以呼叫close函式來釋放該socket資源,從而停止在該socket上的任何資料操作。
也可以呼叫shutdown函式,允許只停止在某個方向上的資料傳輸,而另一個方向上的資料傳輸繼續進行。例如可以關閉某一個socket上的寫操作uo允許繼續在該socket上接收資料,直到讀入所有資料。
但是,shutdown函式並不關閉套接字所佔用的所有資源,除非呼叫close函式來釋放。
看看兩個函式原型:
close(int sockfd);
shutdown(int sockfd, int how);
how引數的值和含義:
0:不允許繼續接收資料;
1:不允許繼續傳送資料;
2:不允許繼續傳送和接收資料。
shutdown在操作成功時返回0,錯誤時返回-1,並置errno值。

9.位元組順序轉換函式
htons():Host to Network Short的縮寫,該函式將主機的無符合短整型數字節順序轉換成網路位元組順序。
htonl():Host to Network Long的縮寫,該函式將主機的無符合長整型數字節順序轉換成網路位元組順序。
ntohs():Network to Host Short的縮寫,該函式將無符號短整型數從網路位元組順序轉換為主機位元組順序。
ntohl():Network to Host long的縮寫,該函式將無符號長整型數從網路位元組順序轉換為主機位元組順序。

- 網路

  • 物理上而言,網路是一個按照地理遠近組成的層次系統,最底層是LAN。

  • 每個乙太網介面卡都有一個全球唯一的48位地址,它儲存在這個介面卡的非易失性儲存器上。

  • 路由器可以用來由各種區域網和廣域網構建網際網路絡。

  • 因特網客戶端和伺服器通過在連線上傳送和接收位元組流來通訊。從連線一對程序的意義上而言,連線是點對點的。從資料可以同時雙向流動的角度而言,它是全雙工的。