Python UDP編程

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找到進程。

  1. 端口號
    在linux系統中,端口可以有65536(2的16次方)個之多!
    既然有這么多,操作系統為了統一管理,所以進行了編號,這就是端口號
    端口是通過端口號來標記的,端口號只有整數,范圍是從0到65535
  2. 知名端口(Well Known Ports)
    知名端口是眾所周知的端口號,范圍從0到1023
80端口分配給HTTP服務
21端口分配給FTP服務

可以理解為,一些常用的功能使用的號碼是估計的,好比 電話號碼110、10086、10010一樣
一般情況下,如果一個程序需要使用知名端口的需要有root權限

  1. 動態端口(Dynamic Ports)
    動態端口的范圍是從1024到65535
    之所以稱為動態端口,是因為它一般不固定分配某種服務,而是動態分配。
    動態分配是指當一個系統進程或應用程序進程需要網絡通信時,它向主機申請一個端口,主機從可用的端口號中分配一個供它使用。
    當這個進程關閉時,同時也就釋放了所占用的端口號。
  2. 怎樣查看端口 ?
    用“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地址

  1. ip地址:用來在網絡中標記一臺電腦的一串數字,比如192.168.1.1;在本地局域網上是惟一的。
  2. ip地址的分類
    每一個IP地址包括兩部分:網絡地址和主機地址
  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. 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主機
  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個主機
  4. D類地址用于多點廣播
    D類IP地址第一個字節以“1110”開始,它是一個專門保留的地址。
    它并不指向特定的網絡,目前這一類地址被用在多點廣播(Multicast)中
    多點廣播地址用來一次尋址一組計算機
    地址范圍224.0.0.1-239.255.255.254
  5. E類IP地址
    以“1111”開始,為將來使用保留
    E類地址保留,僅作實驗和開發用
  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
  1. 注意
    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網絡通信過程

Paste_Image.png

7. 總結

  1. udp是TCP/IP協議族中的一種協議能夠完成不同機器上的程序間的數據通信
  2. udp服務器、客戶端
    udp的服務器和客戶端的區分:往往是通過請求服務和提供服務來進行區分
    1.請求服務的一方稱為:客戶端
    2.提供服務的一方稱為:服務器
  3. udp綁定問題
    一般情況下,服務器端,需要綁定端口,目的是為了讓其他的客戶端能夠正確發送到此進程
    客戶端,一般不需要綁定,而是讓操作系統隨機分配,這樣就不會因為需要綁定的端口被占用而導致程序無法運行的情況
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 名詞延伸 通俗的說,域名就相當于一個家庭的門牌號碼,別人通過這個號碼可以很容易的找到你。如果把IP地址比作一間房子...
    楊大蝦閱讀 20,634評論 2 56
  • 個人認為,Goodboy1881先生的TCP /IP 協議詳解學習博客系列博客是一部非常精彩的學習筆記,這雖然只是...
    貳零壹柒_fc10閱讀 5,091評論 0 8
  • 1.這篇文章不是本人原創的,只是個人為了對這部分知識做一個整理和系統的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,133評論 6 174
  • 簡介 用簡單的話來定義tcpdump,就是:dump the traffic on a network,根據使用者...
    保川閱讀 5,987評論 1 13
  • 1 UDP 1什么是網絡 ·網絡就是一種輔助雙方或者多方能夠連接在一起的工具 ·如果沒有網絡可想單機的世界是多么的...
    五行缺覺閱讀 420評論 0 1