網路程式設計LinuxC 基礎知識 基本思路

2021-09-25 19:23:14 字數 3284 閱讀 9356

——首先來看一下tcp/ip網路分層模型

網絡卡介面的網路驅動程式,處理資料在物理媒介上的傳輸;不同的物理網路具有不同的電氣特性,網路驅動程式隱藏實現細節,為上層協議提供一致的介面。

如果型別碼為0800,那麼在資料鏈路層解包完畢後,將資料交付給網路層的ip協議來處理報文。

如果型別碼為0806,那麼在向上層交付的時候就交付給arp協議,將ip位址轉換為mac位址。

如果型別碼為0835,就交付給rarp協議(reverse arp),將mac位址轉換成ip位址。

在乙太網幀格式的最後還有乙個crc校驗碼,來校驗資料是否異常。

!!!arp & rarp 是處於網路層與資料鏈路層之間的一種協議

為兩台主機的應用程式提供端到端的通訊。

應用程式邏輯的實現。

主要有ping、telnet、dns、http、ftp、dhcp等協議

網路位址是用來識別唯一的每台計算機,但每台計算機上通常都會同時執行更多個應用程式,它們可能要同時訪問網路。所以對於同一臺計算機上的多個應用程式,tcp和udp協議採用16位的埠號來識別它們。一台主機上的不同程序可以繫結到不同的埠上,這些程序就可以同時訪問網路而互不干擾。

簡單來說,埠號port用來表示一台主機上乙個唯一的程序。

埠號是乙個16位無符號整數(0-2^16),(0~65535), 又分為保留埠(知名埠):有權威機構規定用途,其餘的為自由埠,使用者可以自由申請和使用。

c/s 模型

客戶機/伺服器 模型,既可以使用tcp協議也可以使用udp協議,在c/s模型中,通常情況下,伺服器的埠號和ip位址是固定的,客戶端程式連線到伺服器ip和埠,所以一般情況下客戶端的程式設計相對要簡單一些,伺服器要考慮多個客戶端同時請求服務的問題。

b/s 模型

瀏覽器/伺服器模型,使用者通過www瀏覽器實現,三層架構:

① 客戶端表示層:web瀏覽器組成,不存放任何應用程式。

② 應用伺服器層(事物邏輯層):由一台或者多台伺服器組成,具有良好的可擴充套件性。

③ 資料中心(資料處理層):由資料庫系統組成,用於存放業務資料。

總的來說,b/s 是一種特殊的具體化的 c/s模型,b/s模型的客戶端軟體特指瀏覽器,伺服器一般是web伺服器,使用http協議通訊。其工作過程是c/s模型的具體化、例項化。

套接字函式:

#include #include int socket(int domain,int type,int protocol);
名空間:制定套接字的位址格式

-pf_local本地名空間:套接字位址為普通檔名

-pf_inetinternet名空間:套接字位址由internet位址和埠號(用於區分一台主機上的多個套接字)確定

通訊型別:控制套接字如何傳輸和處理資料報

-sock_stream連線(connection)型別:確保所有包依序傳輸,如果丟包,則請求重傳

-spck_dgram資料報(datagram)型別:不保證包的到達順序,包可能丟失

協議:確定資料如何傳輸

- 機器會自動選擇最佳的協議來進行傳輸,因此不需要我們自行修改定義,通常傳遞0,讓系統自動選擇

返回值:

- 乙個新的套接字檔案描述符

int close (int fd);
=> 客戶端發起該系統呼叫,試圖與伺服器建立套接字連線

int connect( int sockfd,const struct sockaddr* addr,socklen_t addrlen);
引數:

- 套接字檔案描述符

- 指向套接字位址結構體的指標(伺服器位址)

- 伺服器位址字串的長度

返回值:

- 0 表示連線成功、-1 表示連線失敗

=> 用來將乙個套接字與某個埠以及ip位址繫結

int bind(int sockfd, struct sockaddr *my_addr,socklen_t addrlen);
引數:

- 可以將my_addr 的 sin_addr 設定為 inaddr_any 而不是某個確定的ip位址就可以繫結到任何網路介面。

- 對於只有乙個ip位址的計算機,inaddr_any 對應的就是它的ip位址;

- 對於多宿主主機(擁有多塊網絡卡),inaddr_any 表示本伺服器程式將處理來自所有網路介面上相應埠的連線請求

返回值:

- 函式執行成功返回0,有錯誤發生時返回-1,錯誤**存入errno

-> 指定同時可以對伺服器發起連線請求的最大客戶端數量 ,通常預設最大為128(即同時處於三次握手狀態的客戶端最大數量)

int listen(int s ,int backlog);
= 如果超過最大數量,之後的連線請求將被伺服器拒絕

返回值:

- 執行成功返回0,出錯返回-1,錯誤**去errno

=> 接受乙個連線請求

int accept(int s, struct sockaddr *addr,socklen_t *addrlen);
引數:

- s :由socket建立,經函式bind繫結到某一埠上,再由listen轉化來的監聽套接字

- addr :傳出 引數,從來儲存客戶端的主機位址&埠

- addrlen :傳入傳出引數 ,第二個引數所指向的結構體的大小

返回值:

- 返回乙個新的套接字檔案識別符號,程序可以利用這個新的套接字描述符與客戶端交換資料

- 引數 s 所指定的套接字繼續等待客戶端的鏈結請求

網路程式設計基礎知識 一

1 iso osi參考模型 iso osi international standard orgnization open system interconnection 模型,簡稱osi模型,該模型定義了網路互聯的七層框架,即iso開發系統互聯模型。當資料通過osi模型的不同層是,傳遞的資料格式有不...

Windows網路程式設計基礎知識

1.winsock的初始化 include include include pragma comment lib,ws2 32.lib 使用winsock2.h時,須載入此項 using namespace std winsock2函式帶有wsa字首,除了wsastartup wsacleanup ...

Java基礎知識 網路程式設計

day26授課目錄 b 網路程式設計 tcp 面向連線 三次握手 資料安全,速度略低。分為客戶端和服務端。通訊的兩端都有socket。網路通訊其實就是socket間的通訊。資料在兩個socket間通過io流傳輸。socket在應用程式中建立,通過一種繫結機制與驅動程式建立關係,告訴自己所對應的ip和...