筆記 網路基礎知識和網路程式設計

2021-08-14 06:18:57 字數 4920 閱讀 7255

網路程式設計知識基礎

上 api

中 網絡卡驅動

下 網絡卡

學linux的網路程式設計三個層次:

1 低階:直接基於socket程式設計,比較難,要設定的東西是很多的

2 高階:基於網路通訊應用框架,封裝使得程式設計更簡單

3 更高階:基於http和網路控制項的傻瓜式程式設計。

我們在這裡學的是第一種,較為困難的程式設計,因為這種程式設計是無限可能的

8.2

網路發展史

單機階段 1960』

主機是乙個大裝置,外接打字機和鍵盤就可以構成乙個終端。

因為當時計算機很少,根本沒有通訊的需求,所以多個終端就是當時的終極目標

打字機+鍵盤構成的終端,當時稱作「telleytype」,簡稱tty,這個簡寫沿用至今

移動網際網路階段

1997』 - 現在

2023年開始進入成熟階段,相關工作要求變高,職位變少

物聯網階段

即將到來的萬物相連階段

三大網路:電信網,電視網路,網際網路

趨勢:網際網路將慢慢取代其他網路

8.3 網路裝置

1 網絡卡

這個乙個可以整合,也可以擴充套件的模組,作用就是上網=v=

1 連線外部網路

2 串轉並

3 封包與拆包

4 網路資料快取 和 速率適配

2 集線器hub

1 訊號的中繼放大,避免訊號衰減

2 區域網組網,以廣播方式工作

但注意:不可以連線外網

3 交換機

高階集線器,廣播方式發生改變,不再像集線器一樣挨個發,而是根據ip位址進行判斷

4 路由器

區域網和外網連線的介面,連線多個不同網段的裝置,類似閘道器

他的核心功能就是提供外網

路由器由於是內部區域網、外部廣域網的介面,所以他配備了2個網絡卡,乙個用做閘道器,乙個用做節點

對內:連線外網

對外:劃分子網,dhcp服務

8.5 dhcp 和 nat

dhcp動態主機配置協議

ip位址可以靜態設定,也可以動態分配

動態分配是區域網內dhcp伺服器提供的,路由器就有這個功能

我記得理工大學的andbusiness就有乙個dhcp由於手機裝置太多導致連不上網的問題,這個問題的解決方法就是使用靜態ip,這樣一來就不使用自動分配的ip位址。

nat網路位址轉換協議

ip位址分為公網位址和私網位址

區域網內主機向外網傳送資料報時,路由器將區域網主機的內網ip替換為外網ip,這個過程就叫nat

他是一種給ipv4打補丁的方法,最終解決ip不夠的話還是要看ipv6。

8.6 ip

ip在人機互動時候是點分十進位制的,實際上是int型的

0xc0a80166 32位二進位制方式

192.168.2.1 點分十進位制

轉換過程中有一些api,專門用來做顯示轉換。

一台主機包含在乙個網路中的,找到這個主機要先找到他所在的網路

ip位址 = 網路位址 + 主機位址

譬如可以

8位表示網路,24位表示主機位址

16位表示網路,16位表示主機位址

表示網路部分、主機部分各自佔多少位,要看子網掩碼。子網掩碼為1的位代表網路位址

子網掩碼255 255 255 0時,代表前24位是網路位址,後8位是主機位址

區別就是網路位址和主機位址所佔長度不同

如何判斷兩個ip位址是否在同乙個子網內?

網路標識 = ip位址 & 子網掩碼

若網路標識相同。那麼證明兩個ip位址在同一子網

9.1 linux網路程式設計框架

注意:這個層次是比較複雜的,而且分層的感覺比較明顯。

tcp協議、socket介面

後面我們會學自己寫乙個伺服器,能夠讓兩端連線上。當然完整的伺服器需要什麼,會點到為止。

深入學習網路程式設計,就差不多要看書了

做什麼,我們再去深入研究什麼。

網路是分層的

osi 7層網路模型

目的:解決整體的複雜性

具體表現:不一定分7層,如tcp只有4層

tcp/ip協議引入:

tcp/ip是使用最多的網路協議實現

研究網路通訊的時候,一定是在同一層次上研究。是講應用都講應用。乙個主機的應用和另乙個主機的驅動是沒有任何話可以說的,因為這毫無意義。

bs和cs

bs架構 瀏覽器伺服器架構 browser 多客戶端集於瀏覽器 後

cs架構 客戶端伺服器架構 client-server 迅雷、網盤、qq 先

9.2 tcp

1 位於傳輸層,對上服務socket,對下服務ip

2 面向連線,需要先建立連線

3 可靠傳輸

tcp保證可靠的方法:

1 握手

2 ack和丟包重傳

3 資料附帶校驗防止傳輸損壞

4 滑動窗**術,根據頻寬適配速率

5 報文編號順序校驗

tcp的握手

握手的次數設計,取決於成本和可靠程度。握手越多成本越高,也越可靠。

[建立連線]

建立連線3次握手

伺服器listen時,客戶端connect

[關閉連線]

關閉連線4次握手

雙方任意一方都可以主動關閉

應用層寫**的時候,是不用管握手過程的,這些協議已經被傳輸層封裝好了。

建立連線的過程

伺服器端:

socket 建立套接字

bind 本地繫結

listen 進行監聽

客戶端:

socket 建立套接字

connect 發起連線

伺服器端:同意連線

8.6 socket程式設計介面介紹

1、建立連線

socket(int 網路域 , int type , int協議) //非常類似open

網路域: 巨集定義的ipv4或ipv6

type: 三類巨集定義

sock_stream //tcp網路

sock_dgram //udp網路

sock_seqpacket

協議: 預設0

bind(int socket , const struct sockaddr * address , len) //類似fcntl,繫結本地ip

listen(int socket , int backlog)

backlog: 監聽幾個

connect(int socket, 目的ip, len)

2、傳送和接收函式

send(int socket, buf,len,int flag)

flag: 平時設定為0,即實現write()的功能,特殊協議時會使用到其他

recv(int socket, buf,len,int flag)

flag: 平時設定為0,即實現write()的功能,特殊協議時會使用到其他

3、輔助型函式

不支援ipv6的三個函式

inet_aton

inet_addr 點分十進位制 → int格式

inet_ntoa

滋瓷ipv6的兩個函式

inet_ntop 32位 → 點分十進位制 n代表net

inet_pton 32位 → 點分十進位制 p當作person理解,其實是指標,字元格式的意思

13:27 2016/12/7

4、相關結構體

在/usr/include 下,netinet/in.c中,有對結構體的宣告

typedef  u32_t  in_addr_t;

struct in_addr

struct sockaddr_in //封裝ipv4的

struct sockaddr這個「ip位址標準結構體」實際上只是形參,是不存在的,他在實際應用過程中,會被替換為

struct sockaddr_in

或者 struct sockaddr_in6

5、補充一點:網路位元組序

就是大端模式,網路傳輸中,不同大小端的 裝置,都要遵從大端模式。

實戰1 cs機制

網路之間用bind的原因

bind繫結的是 套接字 與 ip位址+埠號

網路程序與網路程序之間是不好直接通訊的。因為根據ip位址僅僅能找到哪個裝置,而不是哪個程序。

網路傳輸過程中是找不到目標程序的,這個時候就需要埠號port來為我們指引,是哪乙個程序。、

伺服器

socket 返回值fd =3(監聽fd,專門用來監聽,但是不能讀寫)

bind

listen

accept 返回值ret =4(連線fd,用來和連線另一端的程式進行讀寫操作)

客戶端

socket

connect

htonl

host to net long 4位元組

htons

host to net short 2位元組

雙向通訊:

客戶端傳送 & 伺服器接收

伺服器傳送 & 客戶端接收

伺服器:

while1

ret = recv(clifd , recvbuf , sizeof(recvbuf) , 0);

printf recvbuf

memset

客戶端

while1

ret = send(sockfd , sendbuf , sizeof(sendbuf) , 0);

printf recvbuf

memset

雙方自由收發:非同步通訊,需要乙個通訊約定完成同步。需要依靠應用層協議解決。

網路程式設計筆記 網路模型與協議基礎知識

部分內容引用自osi七層模型與tcp ip五層模型 sevenformer cnblogs.com 三次握手,四次揮手 你真的懂嗎?stefno cnblogs.com 在特定協議下實現計算機之間交流的過程,成為網路程式設計。埠 埠號是用兩個位元組表示的整數。ip 協議抽象了 ip 位址的概念,可以...

python基礎知識學習筆記(網路程式設計)

網路程式設計一般使用socket套接字 使用tcp建立長連線 client 客戶端 import socket sk socket.socket sk.connect 127.0.0.1 9000 while true msg sk.recv 1024 print msg.decode utf 8 ...

網路程式設計之網路的基礎知識

第一 網路協議簡單介紹 1.目標 編寫乙個c s架構的軟體 c s client 客戶端 基於網路 server b s browser 瀏覽器 基於網路 server 2.服務端需要遵循的原則 2.1.服務端與客戶端都需要有唯一的位址,但是服務端的位址必須固定 繫結 2.2 對外一直提供服務,穩定...