1. 程式人生 > 其它 >《Unix/Linux系統程式設計》第十三章學習筆記

《Unix/Linux系統程式設計》第十三章學習筆記

TCP/IP和網路程式設計

TCP/IP協議

網際網路的基礎。

TCP代表傳輸控制協議,IP代表網際網路協議。

TCP/IP的組織結構分為幾個層級,通常稱為TCP/IP堆疊。如圖所示為 TCP/IP 的各個層級以及每一層級的代表性元件及其功能。

程序與主機之間的傳輸層或其上方的資料傳輸只是邏輯傳輸。實際資料傳輸發生在網際網路(IP)和鏈路層,這些層將資料包分成資料幀,以便在物理網路之間傳輸。下圖所示為 TCP/IP 網路中的資料流路徑。

IP主機和地址

主機是支援TCP/IP協議的計算機裝置。每個主機由一個32位的IP地址來標識。

IP地址分為兩部分,即 NetworkID 欄位和HostID欄位。根據劃分,IP 地址分為A~E 類。例如,一個B類IP地址被劃分為一個16位NetworkID,其中前2位是10,然後是一個16位的 HostID欄位。發往IP地址的資料包首先被髮送到具有相同 networkID的路由器。路由器將通過 HostID 將資料包轉發到網路中的特定主機。每個主機都有一個本地主機名localhost,預設 IP地址為 127.0.0.1。本地主機的鏈路層是一個回送虛擬裝置,它將每個資料包路由回同一個localhost。這個特性可以讓我們在同一臺計算機上執行TCP/IP 應用程式,而不需要實際連線到網際網路。

IP協議

IP協議用於在 IP主機之間傳送/接收資料包。IP盡最大努力執行。IP 主機只向接收主機發送資料包,但它不能保證資料包會被髮送到它們的目的地,也不能保證按順序傳送。這意味著IP 並非可靠的協議。必要時,必須在IP 層的上面實現可靠性。下圖所示是IP頭格式:

UDP/TCP

  • UDP(使用者資料報協議)在IP上執行,用於傳送/接收資料報。與IP類似,UDP不能保證可靠性,但是快速高效。它可用於可靠性不重要的情況。

  • TCP(傳輸控制協議)是一種面向連線的協議,用於傳送/接收資料流。TCP也可在IP 上執行,但它保證了可靠的資料傳輸。通常,UDP類似於傳送郵件的USPS,而TCP類似於電話連線。

埠訊號

應用程式 =(主機 IP,協議,埠號)

其中,協議是TCP或 UDP,埠號是分配給應用程式的唯一無符號短整數。要想使用UDP或 TCP,應用程式(程序)必須先選擇或獲取一個埠號。根據計算機網路課程中講述的內容,埠可以分為公認埠(0-1023)、註冊埠(1024-49151)、私有埠(49152-65535)。

應用程式可以選擇一個可用埠號,也可以讓作業系統核心分配埠號。下圖給出了在傳輸層中使用TCP 的一些應用程式及其預設埠號。

TCP/Ip網路中的資料流

圖中,應用程式層的資料被傳遞到傳輸層,傳輸層給資料新增一個TCP或UDP 報頭來標識使用的傳輸協議。合併後的資料被傳遞到IP 網路層,新增一個包含 IP地址的IP 報頭來標識傳送和接收主機。然後,合併後的資料再被傳遞到網路鏈路層,網路鏈路層將資料分成多個幀,並添加發送和接收網路的地址,用於在物理網路之間傳輸。IP地址到網路地址的對映由地址解析協議(ARP)執行(ARP1982)。在接收端,資料編碼過程是相反的。每一層通過剝離資料頭來解包接收到的資料、重新組裝資料並將資料傳遞到上一層。傳送主機上的應用程式原始資料最終會被傳遞到接收主機上的相應應用程式。

程式碼實踐:

程式碼連結:

https://gitee.com/gao_ze_zheng/passage3/blob/master/第十三章學習筆記/13.1.c#

執行結果:

套接字程式設計

套接字地址

struct sockaddr_in {
sa_family_t sin_family; // AF_INET for TCP/IP
// port number
in_port_t sin_port;
struct in_addr sin_addr;// IP address );
// internet address struct in_addr {
// IP address in network byte order
s_addr;
uint32_t
);

在套接字地址結構中,
● TCP/IP 網路的 sin_family 始終設定為 AF_INET。

● sin_port包含按網路位元組順序排列的埠號。

●sin addr是按網路位元組順序排列的主機IP地址。

套接字API

伺服器必須建立一個套接字,並將其與包含伺服器IP 地址和埠號的套接字地址繫結。它可以使用一個固定埠號,或者讓作業系統核心選擇一個埠號(如果 sin port為0)。為了與伺服器通訊,客戶機必須建立一個套接字。對於UPD套接字,可以將套接字繫結到伺服器地址。如果套接字沒有繫結到任何特定的伺服器,那麼它必須在後續的 sendto()/recvfrom()呼叫中提供一個包含伺服器IP 和埠號的套接字地址。

TCP/UDP套接字

UDP 套接字使用 sendto(/recvfrom(來發送/接收資料報。

ssize_t sendto(int soCkfd,const void *buf,size_t len,int flags,
const struct sockaddr *dest_addr,socklen_t addrlen);
ssize_t recvfrom(int sockfd,void *buf,size_t len,int flags,
struct sockaddr *src_addr,socklen_t *addrlen);

在建立套接字並將其繫結到伺服器地址之後,TCP伺服器使用listen()和 accept()來接收來自客戶機的連線
int listen(int sockfd, int backlog);
listen()將 sockfd引用的套接字標記為將用於接收連人連線的套接字。backlog 引數定義了等待連線的最大佇列長度。
int accept(int sockfd, struct sockaddr *addr, socklen t *addrlen);

Web和CGI程式設計

全球資訊網(WWW)或 Web 是網際網路上的資源和使用者組合,它使用超文字傳輸協議(HTTP)(RFC2616 1999)進行資訊交換。自 20世紀 90年代初問世以來,隨著網際網路能力的不斷擴充套件,Web 已經成為世界各地人們日常生活中不可或缺的一部分。因此,對於電腦科學的學生來說,瞭解這項技術非常重要。在本節中,我們將介紹 HTTP和Web程式設計的基礎知識。Web 程式設計通常包括Web開發中涉及的編寫、標記和編碼,其中包括Web 內容、Web 客戶機和伺服器指令碼以及網路安全。狹義上,Web程式設計指的是建立和維護 Web 頁面。Web程式設計中最常用的語言是HTML、XHTML、JavaScript、Perl5和 PHP。

Http程式設計模型

HTTP是一種基於伺服器-客戶機的協議,用於網際網路上的應用程式。它在TCP上執行,因為它需要可靠的檔案傳輸。圖13.10所示為HTTP程式設計模型。

在HTTP 中,客戶機可發出多個URL,將請求傳送到不同的HTTP伺服器。客戶機與特定伺服器保持永久連線不但沒有必要,也不可取。客戶機連線到伺服器只是為了傳送請求,傳送完畢後會關閉連線。同樣,伺服器連線到客戶機也只是為了傳送應答,傳送完畢後會再次關閉連線。每個請求或應答都需要一個單獨的連線。這意味著 HTTP是一種無狀態協議,因為在連續的請求或應答之間不需要維護任何資訊。自然,這將導致大量系統開銷和效率低下。為彌補這一缺乏狀態資訊的問題,HTTP 伺服器和客戶機可使用 cookie 來提供和維護它們之間的一些狀態資訊。

Web介面

Web 頁面是用HTML標記語言編寫的檔案。Web檔案通過一系列HTML元素指定Web 頁面的佈局,可在 Web 瀏覽器上解釋和顯示。常用的Web 瀏覽器有Internet Explorer、Firefox、Google Chrome 等。建立 Web 頁面相當於使用HTML 元素作為構建塊建立文字檔案。與其說它是程式設計,不如說是文書類工作。因此,我們不討論如何建立Web 頁面。相反,我們將只使用一個示例 HTML檔案來說明Web 頁面的本質。下面給出了一個簡單的HTML Web 檔案。

CGI程式設計

CGI代表通用閘道器介面(RFC 3875 2004)。它是一種協議,允許 Web伺服器執行程式,根據使用者輸入動態生成Web 頁面。使用CGI.Web 伺服器不必維護數百萬個靜態Web 頁面檔案來滿足客戶機請求。相反,它通過動態生成Web 頁面來滿足客戶機請求。圖13.14顯示了CGI程式設計模型。

在 CGI程式設計模型中,客戶機發送一個請求,該請求通常是一個HTML表單,包含供伺服器執行的 CGI程式的輸入和名稱。在接收到請求後,httpd伺服器會派生一個子程序來執行 CGI程式。CGI程式可以使用使用者輸入來查詢資料庫系統,如 MySQL,從而根據使用者輸入生成 HTML 檔案。當子程序結束時,httpd伺服器將生成的HTML 檔案傳送回客戶機。CGI 程式可用任何程式語言編寫,如 C語言、sh 指令碼和Perl。

通過GUI實現動態Web頁面

程式碼連結如下:

https://gitee.com/gao_ze_zheng/passage3/blob/master/

執行結果: