2017 12 10 Linux網路程式設計

2021-08-13 08:35:48 字數 3683 閱讀 4717

1.tcp/ip理論基礎

2.linux網路程式設計

協議棧:linux的優點之一就是在於它豐富而穩定的網路協議棧,其範圍是從協議無關層(如通用的socket層介面和裝置層)到各種網路協議的實現;

協議介紹:對於網路理論介紹一般採用osi模型,但是linux中網路棧的介紹一般分為四層的internet模型。

linux tcp/ip四層概念模型:應用層,傳輸層,網際層,網路介面。

tcp/ip協議族:tcp/ip 實際上乙個協同工作的通訊家族,為網路資料通訊提供通路。為討論方便可tcp/ip 協議組大體上分為三部分:

1、internet 協議(ip)

2、傳輸控制協議(tcp)和使用者資料報協議(udp)

3、處於 tcp 和 udp 之上的一組應用協議。它們包括:telnet,檔案傳送協議(ftp),網域名稱服務(dns)和簡單的郵件傳送程式(smtp)等

網路層:第一部分稱為網路層。主要包括internet 協議(ip)、網際控制報文協議(icmp)和位址解析協議(arp)

internet 協議(ip)

該協議被設計成互聯分組交換通訊網,以形成乙個網際通訊環境。它負責在源主機和目的地主機之間傳輸來自其較高層軟體的稱為資料報文的資料塊,它在源和目的地之間提供非連線型傳遞服務

網際控制報文協議(icmp)

它實際上不是ip層部分,但直接同ip層一起工作,報告網路上的某些出錯情況。允許網際路由器傳輸差錯資訊或測試報文。

位址解析協議(arp)

arp 實際上不是網路層部分,它處於ip和資料鏈路層之間,它是在32位ip位址和48位實體地址之間執行翻譯的協議。

ip協議:ip主要有以下四個主要功能:

資料傳送

定址路由選擇

資料報文的分段

ip的主要目的是為資料輸入/輸出網路提供基本演算法,為高層協議提供無連線的傳送服務.這意味著在ip將資料遞交給接收站點以前不在傳輸站點和接收站點之間建立對話。它只是封裝和傳遞資料,但不向傳送者或接收者報告包的狀態,不處理所遇到的故障

ip包由ip協議頭與協議資料兩部分構成

tcp協議:tcp是重要的傳輸層協議,目的是允許資料同網路上的其他節點進行可靠的交換。它能提供埠編號的解碼,以識別主機的應用程式,而且完成資料的可靠傳輸tcp 協議具有嚴格的內裝差錯檢驗演算法確保資料的完整性tcp 是面向位元組的順序協議,這意味著包內的每個位元組被分配乙個順序編號,並分配給每包乙個順序編號。

udp也是傳輸層協議,它是無連線的,不可靠的傳輸服務.當接收資料時它不向傳送方提供確認資訊,它不提供輸入包的順序,如果出現丟失包或重份包的情況,也不會向傳送方發出差錯報文.由於它執行功能時具有較低的開銷,因而執行速度比tcp快。

網路位元組順序是tcp/ip中規定好的一種資料表示格式,它與具體的cpu型別、作業系統等無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋。

網路位元組順序採用big endian排序方式。

位址轉換:ip位址通常由數字加點(192.168.0.1)的形式表示,而在struct in_addr中使用的是ip位址是由32位的整數表示的,為了轉換我們可以使用下面兩個函式:

int inet_aton(const char *cp,struct in_addr *inp)

char *inet_ntoa(struct in_addr in)

函式裡面 a 代表 ascii n 代表network.第乙個函式表示將a.b.c.d形式的ip轉換為32位的ip,儲存在 inp指標裡面。第二個是將32位ip轉換為a.b.c.d的格式

函式:進行socket程式設計的常用函式有:

socket

建立乙個socket

bind

用於繫結ip位址和埠號到socket

connect

該函式用於繫結之後的client端與伺服器建立連線

listen

設定能處理的最大連線要求,listen()並未開始接收連線,只是設定socket為listen模式。

accept

用來接受socket連線。

send

傳送資料

recv

接收資料

sockaddr-in初始化:bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = af_inet; servaddr.sin_addr.s_addr = htonl(inaddr_any); servaddr.sin_port = htons(serv_port);

首先將整個結構體清零,然後設定位址型別為af_inet,網路位址為inaddr_any,這個巨集表示本地的任意ip位址,因為伺服器可能有多個網絡卡,每個網絡卡也可能繫結多個ip位址,這樣設定可以在所有的ip位址上監聽,直到不某個客戶端建立了連線時才確定下來到底用哪個ip位址,埠號為serv_port,我們定義為8000。

coonect連線:int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); 

客戶端需要呼叫connect()連線伺服器,connect和bind的引數形式一致,區別在於bind的引數是自己的位址,而connect的引數是對方的位址.

connect()成功返回0,出錯返回-1。

基於tcp伺服器:

1. 建立乙個socket,用函式socket()

2. 繫結ip位址、埠等資訊到socket上,用函式bind()

3.設定允許的最大連線數,用函式listen()

4.接收客戶端上來的連線,用函式accept()

5.收發資料,用函式send()和recv(),或者read()和write()

6.關閉網路連線

基於tcp客戶端:

1.建立乙個socket,用函式socket()

2.設定要連線的對方的ip位址和埠等屬性

3.連線伺服器,用函式connect()

4.收發資料,用函式send()和recv(),或者

read()和write()

5.關閉網路連線

基於udp伺服器;

1.建立乙個socket,用函式socket()

2.繫結ip位址、埠等資訊到socket上,用函式bind()

3.迴圈接收資料,用函式recvfrom()

4.關閉網路連線

基於udp客戶端:

1.建立乙個socket,用函式socket()

2.繫結ip位址、埠等資訊到socket上,用函式bind()

3.設定對方的ip位址和埠等屬性

4.傳送資料,用函式sendto()

5.關閉網路連線

伺服器模型:在網路程式裡面,一般來說都是許多客戶對應乙個伺服器,為了處理客戶的請求, 對服務端的程式就提出了特殊的要求。目前最常用的伺服器模型有:

迴圈伺服器:伺服器在同乙個時刻只可以響應乙個客戶端的請求

併發伺服器:伺服器在同乙個時刻可以響應多個客戶端的請求

tcp迴圈伺服器:tcp迴圈伺服器一次只能處理乙個客戶端的請求。只有在這個客戶的所有請求都滿足後, 伺服器才可以繼續後面的請求。這樣如果有乙個客戶端佔住伺服器不放時,其它的客戶機都不能工作了,因此,tcp伺服器一般很少用迴圈伺服器模型的。

tcp併發伺服器:併發伺服器的思想是每乙個客戶機的請求並不由伺服器直接處理,而是由伺服器建立乙個 子程序來處理。

tcp併發伺服器可以解決tcp迴圈伺服器客戶機獨佔伺服器的情況。但同時也帶來了問題:為了響應客戶的請求,伺服器要建立子程序來處理,而建立子程序是一種非常消耗資源的操作

linux網路管理 Linux網路配置

1.1 linux配置ip位址 1 ifconfig命令臨時配置ip位址 能不能自動獲取ip位址和dns位址,要看有沒有dhcp伺服器 win10上,輸入ipconfig all 會看到是否有dhcp伺服器 ifconfig命令 對此命令更加詳細的解說 傳送門 2 setup工具永久配置ip位址 r...

網路 linux網路配置

zlm ubuntu sudo ifconfig eth0 192.168.1.109 netmask 255.255.255.0 broadcast 192.168.1.255 zlm ubuntu sudo route add del default gw 192.168.1.1 新增刪除閘道器...

Linux 網路 網路模式

特點 1 如果主機可以上網,虛擬機器可以上網 2 虛擬機器之間不能ping通 3 虛擬機器可以ping通主機 此時ping虛擬機器的閘道器,即是ping主機 4 主機不能ping通虛擬機器應用場景 虛擬機器只要求可以上網,無其它特殊要求,滿足最一般需求配置方法 連線方式 選擇 網路位址轉換 nat ...