python網路-計算機網路基礎(23)
一、網路簡介
網路是由節點和連線構成,表示諸多物件及其相互聯絡。
一個人玩:
兩個人玩:
多個人玩:
說明
單機
使用網路的目的
- 就是為了聯通多方然後進行通訊用的,即把資料從一方傳遞給另外一方
- 前面的學習編寫的程式都是單機的,即不能和其他電腦上的程式進行通訊
- 為了讓在不同的電腦上執行的軟體,之間能夠互相傳遞資料,就需要藉助網路的功能
- 所謂的網路程式設計就是,讓在不同的電腦上的軟體能夠進行資料傳遞,即程序之間的通訊
二、tcp/ip簡介
1. 什麼是協議
有的說英語,有的說中文,有的說德語,說同一種語言的人可以交流,不同的語言之間就不行了
為了解決不同種族人之間的語言溝通障礙,現規定國際通用語言是英語,這就是一個規定,這就是協議
2. 計算機網路溝通用什麼
現在的生活中,不同的計算機只需要能夠聯網(有線無線都可以)那麼就可以相互進行傳遞資料,那麼不同種類之間的計算機到底是怎麼進行資料傳遞的呢?就像說不同語言的人溝通一樣,只要有一種大家都認可都遵守的協議即可,那麼這個計算機都遵守的網路通訊協議叫做 TCP/IP協議
3. TCP/IP協議(族)
早期的計算機網路,都是由各廠商自己規定一套協議,IBM、Apple和Microsoft都有各自的網路協議,互不相容
為了把全世界的所有不同型別的計算機都連線起來,就必須規定一套全球通用的協議,為了實現網際網路這個目標,網際網路協議簇(Internet Protocol Suite)就是通用協議標準。
因為網際網路協議包含了上百種協議標準,但是最重要的兩個協議是TCP和IP協議,所以,大家把網際網路的協議簡稱TCP/IP協議
常用的網路協議如下圖所示:
說明:
網際層也稱為:網路層 網路介面層也稱為:鏈路層
三、埠簡介
那麼TCP/IP協議中的埠指的是什麼呢?埠就好一個房子的門,是出入這間房子的必經之路。
如果一個程序需要收發網路資料,那麼就需要有這樣的埠
在linux系統中,埠可以有65536(2的16次方)個之多!
既然有這麼多,作業系統為了統一管理,所以進行了編號,這就是 埠號
2. 埠號
埠是通過埠號來標記的,埠號只有整數,範圍是從0到65535
3. 埠是怎樣分配的
- 埠號不是隨意使用的,而是按照一定的規定進行分配。
- 埠的分類標準有好幾種,我們這裡不做詳細講解,只介紹一下知名埠和動態埠
4.知名埠(Well Known Ports)
知名埠是眾所周知的埠號,範圍從0到1023
80埠分配給HTTP服務 21埠分配給FTP服務
可以理解為,一些常用的功能使用的號碼好比:電話號碼110、10086、10010一樣
一般情況下,如果一個程式需要使用知名埠的需要有root許可權
5.動態埠(Dynamic Ports)
- 動態埠的範圍是從1024到65535
- 之所以稱為動態埠,是因為它一般不固定分配某種服務,而是動態分配。
- 動態分配是指當一個系統程序或應用程式程序需要網路通訊時,它向主機申請一個埠,主機從可用的埠號中分配一個供它使用。
- 當這個程序關閉時,同時也就釋放了所佔用的埠號。
- 用“netstat -an”檢視埠狀態
6、埠總結
埠有什麼用呢 ? 我們知道,一臺擁有IP地址的主機可以提供許多服務,比如HTTP(全球資訊網服務)、FTP(檔案傳輸)、SMTP(電子郵件)等,這些服務完全可以通過1個IP地址來實現。那麼,主機是怎樣區分不同的網路服務呢?顯然不能只靠IP地址,因為IP地址與網路服務的關係是一對多的關係。實際上是通過“IP地址+埠號”來區分不同的服務的。 需要注意的是,埠並不是一一對應的。比如你的電腦作為客戶機訪問一臺WWW伺服器時,WWW伺服器使用“80”埠與你的電腦通訊,但你的電腦則可能使用“3457”這樣的埠。
四、IP地址簡介
IP地址就像是我們的家庭住址一樣,如果你要寫信給一個人,你就要知道他(她)的地址,這樣郵遞員才能把信送到。計算機發送資訊就好比是郵遞員,它必須知道唯一的“家庭地址”才能不至於把信送錯人家。只不過我們的地址使用文字來表示的,計算機的地址用二進位制數字表示。
IP地址是一個32位的二進位制數,通常被分割為4個“8位二進位制數”(也就是4個位元組)。IP地址通常用“點分十進位制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之間的十進位制整數。例:點分十進IP地址(100.4.5.6),實際上是32位二進位制數(01100100.00000100.00000101.00000110)。
ip地址的分類
A類IP地址
- 一個A類IP地址由1位元組的網路地址和3位元組主機地址組成,網路地址的最高位必須是“0”,
- 地址範圍1.0.0.1-126.255.255.254
- 二進位制表示為:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110
- 可用的A類網路有126個,每個網路能容納1677214個主機
B類IP地址
- 一個B類IP地址由2個位元組的網路地址和2個位元組的主機地址組成,網路地址的最高位必須是“10”,
- 地址範圍128.1.0.1-191.255.255.254
- 二進位制表示為:10000000 00000001 00000000 00000001 - 10111111 11111111 11111111 11111110
- 可用的B類網路有16384個,每個網路能容納65534主機
C類IP地址
- 一個C類IP地址由3位元組的網路地址和1位元組的主機地址組成,網路地址的最高位必須是“110”
- 範圍192.0.1.1-223.255.255.254
- 二進位制表示為: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111110 11111110
- C類網路可達2097152個,每個網路能容納254個主機
D類地址用於多點廣播
- D類IP地址第一個位元組以“1110”開始,它是一個專門保留的地址。
- 它並不指向特定的網路,目前這一類地址被用在多點廣播(Multicast)中
- 多點廣播地址用來一次定址一組計算機
- 地址範圍224.0.0.1-239.255.255.254
E類IP地址
- 以“1111”開始,為將來使用保留
- E類地址保留,僅作實驗和開發用
私有ip
10.0.0.0~10.255.255.255 172.16.0.0~172.31.255.255 192.168.0.0~192.168.255.255 http://127.0.0.1
五、子網掩碼簡介
要想理解什麼是子網掩碼,就不能不瞭解IP地址的構成。網際網路是由許多小型網路構成的,每個網路上都有許多主機,這樣便構成了一個有層次的結構。IP地址在設計時就考慮到地址分配的層次特點,將每個IP地址都分割成網路號和主機號兩部分,以便於IP地址的定址操作。
IP地址的網路號和主機號各是多少位呢?
如果不指定,就不知道哪些位是網路號、哪些是主機號,這就需要通過子網掩碼來實現。
子網掩碼不能單獨存在,它必須結合IP地址一起使用。
子網掩碼只有一個作用,就是將某個IP地址劃分成網路地址和主機地址兩部分子網掩碼的設定必須遵循一定的規則。
與IP地址相同,子網掩碼的長度也是32位,
- 左邊是網路位,用二進位制數字“1”表示;
- 右邊是主機位,用二進位制數字“0”表示。
假設IP地址為“192.168.1.1”子網掩碼為“255.255.255.0”,子網掩碼裝換二進位制位:11111111 11111111 11111111 00000000
其中,“1”有24個,代表與此相對應的IP地址左邊24位是網路號; “0”有8個,代表與此相對應的IP地址右邊8位是主機號。 這樣,子網掩碼就確定了一個IP地址的32位二進位制數字中哪些是網路號、哪些是主機號。 這對於採用TCP/IP協議的網路來說非常重要,只有通過子網掩碼,才能表明一臺主機所在的子網與其他子網的關係,使網路正常工作。
最常用的子網掩碼是“255.255.255.0”的網路:
但是實際可用的IP地址數量是256-2,即254個,因為主機號不能全是“0”或全是“1”。
六、socket簡介
1.本地的程序間通訊(IPC)有很多種方式,例如
- 佇列
- 同步(互斥鎖、條件變數等)
以上通訊方式都是在一臺機器上不同程序之間的通訊方式,那麼問題來了,網路中程序之間如何通訊?
2. 網路中程序之間如何通訊
ip地址,協議,埠
3. 什麼是socket
套接字
4. 建立socket
在 Python 中 使用socket 模組的函式 socket 就可以完成:
socket.socket(AddressFamily, Type)
說明:
函式 socket.socket 建立一個 socket,返回該 socket 的描述符,該函式帶有兩個引數:
- Address Family:可以選擇 AF_INET(用於 Internet 程序間通訊) 或者 AF_UNIX(用於同一臺機器程序間通訊),實際工作中常用AF_INET
- Type:套接字型別,可以是 SOCK_STREAM(流式套接字,主要用於 TCP 協議)或者 SOCK_DGRAM(資料報套接字,主要用於 UDP 協議)
建立一個tcp socket(tcp套接字)
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print 'Socket Created'
建立一個udp socket(udp套接字)
import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) print 'Socket Created'