1. UDP
UDP,用戶數據報傳輸協議,它位于TCP/IP協議的傳輸層,是一種無連接的協議,它發送的報文不能確定是否完整地到達了另外一端
- TCP是建立可靠連接,并且通信雙方都可以以流的形式發送數據。相對TCP,UDP則是面向無連接的協議。
- 使用UDP協議時,不需要建立連接,只需要知道對方的IP地址和端口號,就可以直接發數據包。但是,能不能到達就不知道了。
- 雖然用UDP傳輸數據不可靠,但它的優點是和TCP比,速度快,對于不要求可靠到達的數據,就可以使用UDP協議。
- 我們來看看如何通過UDP協議傳輸數據。和TCP類似,使用UDP的通信雙方也分為客戶端和服務器。服務器首先需要綁定端口
2. TCP/IP協議(族)
早期的計算機網絡,都是由各廠商自己規定一套協議,IBM、Apple和Microsoft都有各自的網絡協議,互不兼容
為了把全世界的所有不同類型的計算機都連接起來,就必須規定一套全球通用的協議,為了實現互聯網這個目標,互聯網協議簇(Internet Protocol Suite)就是通用協議標準。
因為互聯網協議包含了上百種協議標準,但是最重要的兩個協議是TCP和IP協議,所以,大家把互聯網的協議簡稱TCP/IP協議
3. 端口
根據IP找到這臺電腦,根據端口port找到進程。
-
端口號
在linux系統中,端口可以有65536(2的16次方)個之多!
既然有這么多,操作系統為了統一管理,所以進行了編號,這就是端口號
端口是通過端口號來標記的,端口號只有整數,范圍是從0到65535 - 知名端口(Well Known Ports)
知名端口是眾所周知的端口號,范圍從0到1023
80端口分配給HTTP服務
21端口分配給FTP服務
可以理解為,一些常用的功能使用的號碼是估計的,好比 電話號碼110、10086、10010一樣
一般情況下,如果一個程序需要使用知名端口的需要有root權限
- 動態端口(Dynamic Ports)
動態端口的范圍是從1024到65535
之所以稱為動態端口,是因為它一般不固定分配某種服務,而是動態分配。
動態分配是指當一個系統進程或應用程序進程需要網絡通信時,它向主機申請一個端口,主機從可用的端口號中分配一個供它使用。
當這個進程關閉時,同時也就釋放了所占用的端口號。 - 怎樣查看端口 ?
用“netstat -an”查看端口狀態 本地地址后面的就是端口號
C:\Users\Administrator>netstat -an
活動連接
協議 本地地址 外部地址 狀態
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING
TCP 0.0.0.0:443 0.0.0.0:0 LISTENING
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
TCP 0.0.0.0:902 0.0.0.0:0 LISTENING
TCP 0.0.0.0:912 0.0.0.0:0 LISTENING
TCP 0.0.0.0:1688 0.0.0.0:0 LISTENING
..............
..............
用“netstat -ano”查看端口狀態,還有pid
C:\Users\Administrator>netstat -ano
活動連接
協議 本地地址 外部地址 狀態 PID
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 904
TCP 0.0.0.0:443 0.0.0.0:0 LISTENING 2268
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:902 0.0.0.0:0 LISTENING 2056
TCP 0.0.0.0:912 0.0.0.0:0 LISTENING 2056
TCP 0.0.0.0:1688 0.0.0.0:0 LISTENING 3648
TCP 0.0.0.0:2425 0.0.0.0:0 LISTENING 3016
4. ip地址
- ip地址:用來在網絡中標記一臺電腦的一串數字,比如192.168.1.1;在本地局域網上是惟一的。
- ip地址的分類
每一個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
在這么多網絡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服務器。
4. socket簡介
socket(簡稱 套接字) 是進程間通信的一種方式,它與其他進程間通信的一個主要不同是:
它能實現不同主機間的進程間通信,我們網絡上各種各樣的服務大多都是基于 Socket 來完成通信的
創建socket
socket.socket(AddressFamily, Type)
說明:
函數 socket.socket 創建一個 socket,返回該 socket 的描述符,該函數帶有兩個參數:
1 Address Family:可以選擇 AF_INET(用于 Internet 進程間通信) 或者 AF_UNIX(用于同一臺機器進程間通信),實際工作中常用AF_INET
2 Type:套接字類型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 協議)或者 SOCK_DGRAM(數據報套接字,主要用于 UDP 協議)
import socket
mdpSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
創建Socket時,SOCK_DGRAM指定了這個Socket的類型是UDP
5. udp網絡程序-發送數據
socket函數
mySocket = socket(family, type)
函數socket()的參數family用于設置網絡通信的域,函數socket()根據這個參數選擇通信協議的族。通信協議族在文件sys/socket.h中定義。
函數socket()的參數type用于設置套接字通信的類型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(數據包套接字)等。
并不是所有的協議族都實現了這些協議類型,例如,AF_INET協議族就沒有實現SOCK_SEQPACKET協議類型。
做一個簡單的服務端,綁定一個端口
import socket
udpSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
bindAdress =('',10086)
udpSocket.bind(bindAdress)#綁定一個端口
while True:
recvDate,recvAddr = udpSocket.recvfrom(1024)#如果沒有收到發往這個綁定端口的消息,會一直阻塞在這里
recvMsg = '【Receive from %s : %s】:%s'%(recvAddr[0],recvAddr[1],recvDate.decode('gbk'))
print(recvMsg)
發消息的客戶端
import socket
mySocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sendAddr=('192.168.11.67',10086)
msg = input('>>')
msg = msg.encode('gbk')
mySocket.sendto(msg,sendAddr)
mySocket.close()
發送123到10086端口
G:\tools\python3.5\python.exe E:/workspace/day26/01_socket.py
>>123
服務端收到消息
G:\tools\python3.5\python.exe E:/workspace/day26/08_服務端綁定端口.py
【Receive from 192.168.11.67 : 54658】:123
6. udp網絡通信過程
7. 總結
- udp是TCP/IP協議族中的一種協議能夠完成不同機器上的程序間的數據通信
- udp服務器、客戶端
udp的服務器和客戶端的區分:往往是通過請求服務和提供服務來進行區分
1.請求服務的一方稱為:客戶端
2.提供服務的一方稱為:服務器 - udp綁定問題
一般情況下,服務器端,需要綁定端口,目的是為了讓其他的客戶端能夠正確發送到此進程
客戶端,一般不需要綁定,而是讓操作系統隨機分配,這樣就不會因為需要綁定的端口被占用而導致程序無法運行的情況