——首先來看一下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和...