網絡通信
1 網絡
1.1 網絡定義
- 網絡就是一種輔助雙方或者多方能夠連接在一起的工具
- 如果沒有網絡可想單機的世界是多么的孤單
1.2 使用網絡的目的
- 就是為了聯通多方然后進行通信用的,即把數據從一方傳遞給另外一方
- 如果沒有網絡,編寫的程序都是單機的,即不能和其他電腦上的程序進行通信
- 為了讓在不同的電腦上運行的軟件,之間能夠互相傳遞數據,就需要借助網絡的功能
1.3 總結
- 使用網絡能夠把多方鏈接在一起,然后可以進行數據傳遞
- 所謂的網絡編程就是,讓在不同的電腦上的軟件能夠進行數據傳遞,即進程之間的通信
2 IP地址
2.1 ip地址的作用
ip地址:用來在網絡中標記一台電腦,比如192.168.1.1;在本地局域網上是唯一的。
2.2 ip地址的分類
每一個IP地址包括兩部分:網絡地址和主機地址
2.2.1 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個主機
2.2.2 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主機
2.2.3 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個主機
2.2.4 D類地址用於多點廣播
D類IP地址第一個字節以“1110”開始,它是一個專門保留的地址。
它並不指向特定的網絡,目前這一類地址被用在多點廣播(Multicast)中
多點廣播地址用來一次尋址一組計算機 s 地址范圍
224.0.0.1-239.255.255.254
2.2.5 E類IP地址
以“1111”開始,為將來使用保留
E類地址保留,僅作實驗和開發用
2.2.6 私有ip
在這么多網絡IP中,國際規定有一部分IP地址是用於我們的局域網使用,也就
是屬於私網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
注意:
IP地址127.0.0.1~127.255.255.255用於回路測試,
如:127.0.0.1可以代表本機IP地址,用http://127.0.0.1就可以測試本機中配置的Web服務器。
3 端口
3.1 什么是端口
- 端口就好一個房子的門,是出入這間房子的必經之路。
- 如果一個程序需要收發網絡數據,那么就需要有這樣的端口
- 在linux系統中,端口可以有65536(2的16次方)個之多!
- 對端口進行統一編號,這就是所說的端口號
3.2 端口號
端口是通過端口號(一個整數)來標記的,范圍是從0到65535
注意:
端口數不一樣的*nix系統不一樣,還可以手動修改
3.3 端口的分配
端口號不是隨意使用的,而是按照一定的規定進行分配。端口的分類標准有好幾種,筆者在這里不做詳細講解,只介紹一下知名端口和動態端口
3.3.1 知名端口(Well Known Ports)
知名端口是 眾所周知的端口號,范圍從0到1023
- 80端口分配給HTTP服務
- 21端口分配給FTP服務
在這里為了方便理解,我們可以將端口號想象成手機號,一些常用的功能使用的號碼是大家都知道的,好比電話號碼110、10086、10010一樣,他們在電話中的地位和知名端口在端口的地位是類似的
一般情況下,如果一個程序需要使用知名端口的需要有root權限
3.3.2 動態端口(Dynamic Ports)
動態端口的范圍是從1024到65535
之所以稱為動態端口,是因為它一般不固定分配某種服務,而是動態分配。
動態分配是指當一個系統程序或應用程序程序需要網絡通信時,它向主機申請一個端口,主機從可用的端口號中分配一個供它使用。
當這個程序關閉時,同時也就釋放了所占用的端口號
3.3 怎樣查看端口
- 用“netstat -an”查看端口狀態
- lsof -i [tcp/udp]:2425
4 socket(進程間通信的一種方式)
4.1 不同電腦上的進程間通信的實現
- 首要要唯一標識一個進程
- 在1台電腦上可以通過進程號(PID)來唯一標識一個進程,但是在網絡中這行不通。
- 這就需要TCP/IP協議族,網絡層的“ip地址” 可以 唯一標識網絡中的主機,而傳輸層的“協議+端口” 可以 唯一標識主機中的應用進程(進程)。
- 這樣利用ip地址,協議,端口就可以標識網絡的進程了,網絡中的進程就可以利用該方式與其它進程進行交互
注意:
進程:運行的程序以及運行時用到的資源這個整體稱之為進程
進程間通信指:運行的程序之間的數據共享
4.2 socket簡介
- socket()函數:用於根據指定的地址族、數據類型和協議來分配一個套接口(通訊的基石是套接口,一個套接口是通訊的一端)的描述字及其所用的資源
- socket(簡稱 套接字) 是進程間通信的一種方式,它與其他進程間通信的一個主要不同是:
它能實現不同主機間的進程間通信,我們網絡上各種各樣的服務大多都是基於 Socket 來完成通信的,例如瀏覽網頁、QQ 聊天、收發 email 等等
4.3 創建socket(以python為例)
Python 中 使用socket 模塊的函數 socket 就可以完成:
import socket
socket.socket(AddressFamily, Type)
說明:
函數 socket.socket 創建一個 socket,該函數帶有兩個參數:
- Address Family:可以選擇 AF_INET(用於 Internet 進程間通信) 或者 AF_UNIX(用於同一台機器進程間通信),實際工作中常用AF_INET
- Type:套接字類型,可以是 SOCK_STREAM(流式套接字,主要用於 TCP 協議)或者 SOCK_DGRAM(數據報套接字,主要用於 UDP 協議)
(1)創建一個tcp socket(tcp套接字)
import socket
# 創建tcp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# ...這里是使用套接字的功能...
# 不用的時候,關閉套接字
s.close()
(2)創建一個udp socket(udp套接字)
import socket
# 創建udp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# ...這里是使用套接字的功能(省略)...
# 不用的時候,關閉套接字
s.close()
注意:
套接字使用流程 與 文件的使用流程很類似
- 創建套接字
- 使用套接字收/發數據
- 關閉套接字
5 網絡通信總結
- 網絡通信可以說是在網絡中,知道互相之間的“IP地址(在網絡層)”以確定相互是誰,再通過知道要進行通信的“協議+端口號(在傳輸層)”,以確定通信雙方進行通信的工具即進程,而在這過程中必然涉及到套接口的描述字及其所用的資源的分配(軟件及硬件),當下實現這一功能的多采用socket()函數。
- 詳細的來說,一台擁有IP地址的主機可以提供許多服務,比如HTTP(萬維網服務)、FTP(文件傳輸)、SMTP(電子郵件)等,這些服務完全可以通過1個IP地址來實現。那么,主機是怎樣區分不同的網絡服務呢?顯然不能只靠IP地址,因為IP地址與網絡服務的關系是一對多的關系。
- 實際上是通過“IP地址+端口號”來區分不同的服務的。需要注意的是,端口並不是一一對應的。比如你的電腦作為客戶機訪問一台WWW服務器時,WWW服務器使用“80”端口與你的電腦通信,但你的電腦則可能使用“3457”這樣的端口。