程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Network Foundation of Python Network Programming

編輯:Python

Python網絡編程之網絡基礎

  • 一、前言
  • 二、Why use a communication protocol
  • 三、TCP/IP簡介
    • 1.IP協議
    • 2.TCP協議
  • 四、UDP簡介
  • 五、Socket 簡介


一、前言

計算機網絡就是把各個計算機連接到一起,Allows computers in a network to communicate with each other.網絡編程就是如何在程序中實現兩台計算機的通信.This article will explain the basics of networking,包括比較常見的TCP協議和UDP協議,以及如何使用TCP編程和UDP編程.

Today's era is an era of the Internet,網絡無處不在.And the programs we learned to program in front of us are all stand-alone,即不能和其他電腦上的程序進行通信.In order to realize the communication between different computers,You need to use network programming.Let's take a look at the basics of networking.


二、Why use a communication protocol

計算機為了聯網,就必須規定通信協議,早期的計算機網絡,都是由各廠商自己規定一套協議,IBM、Apple和Microsoft都有各自的網絡協議,互不兼容,It's like a group of people speaking English,有的說中文,有的說德語,說同一種語言的人可以交流,不同的語言之間就不行了,如圖所示:


為了把全世界的所有不同類型的計算機都連接起來,就必須規定一套全球通用的協議,為了實現互聯網這個目標,互聯網協議簇(Internet Protocol Suite)That is, the common protocol standard appeared.Internet是由inter和net兩個單詞組合起來的,Willing is connecting“網絡”的網絡,有了Internet,任何私有網絡,只要支持這個協議,to access the Internet.


三、TCP/IP簡介

因為互聯網協議包含了上百種協議標准,但是最重要的兩個協議是TCP和IP協議,所以,Everyone calls it Internet Protocol for shortTCP/IP協議.


1.IP協議

在通信時,Both parties to the communication must know the identity of the other party,For example, sending a courier must know the address of the other party.互聯網上每個計算機的唯一標識就是IP地址.IP地址實際上是一個32位整數(稱為IPv4),它是以字符串表示的IP地址,如172.16.254.1,實際上是把32位整數按8位分組後的數字表示,目的是便於閱讀,如圖所示:

IP協議負責把數據從一台計算機通過網絡發送到另一台計算機.數據被分割成一小塊一小塊,類似於將一個大包裹拆分成幾個小包裹,然後通過IP包發送出去.由於互聯網鏈路復雜,兩台計算機之間經常有多條線路,因此,路由器就負責決定如何把一個IP包轉發出去.IP包的特點是按塊發送,途徑多個路由.But not guaranteed to arrive,Sequential arrival is also not guaranteed.


2.TCP協議

TCP協議則是建立在IP協議之上的.TCP協議負責在兩台計算機之間建立可靠連接,保證數據包按順序到達.TCPThe protocol establishes a reliable connection through a three-way handshake,如圖所示:


Then need to eachIP包進行編號,確保對方按順序收到,如果包丟了,就自動重發.如圖所示:


許多常用的更高級的協議都是建立在TCP協議基礎上的,比如用於浏覽器的HTTP協議、發送郵件的SMTP協議等.一個TCP報文除了包含要傳輸的數據外,還包含源IP地址和目標IP地址、源端口和目標端口.

端口有什麼作用?在兩台計算機通信時,只要發送IP地址是不夠的,Because there are multiple network programs running on the same computer.一個TCP報文來了之後,到底是交給浏覽器還是QQ,就需要端口號來區分.每個網絡程序都向操作系統申請唯一的端口號,這樣,兩個進程在兩台計算機之間建立網絡連接就需要各自的IP地址和各自的端口號.

一個進程也可能同時與多個計算機建立連接,因此它會申請很多端口,端口號不是隨意使用的,Rather, it is distributed according to certain rules.例如,80端口分配給HTTP服務,21端口分配給FTP服務.


四、UDP簡介

相對TCP協議,UDPThe protocol is a connectionless oriented protocol.使用UDP協議時,不需要建立連接,只需要知道對方的IP地址和端口號,就可以直接發數據包.但是,Data cannot be guaranteed to arrive.雖然用UDP傳輸數據不可靠,But it has the advantage over TCP協議的速度快.對於不要求可靠到達的數據而言,就可以使用UDP協議.TCP協議和UDPThe difference between the protocols is shown in the figure:


五、Socket 簡介

為了讓兩個程序通過網絡進行通信,二者均必須使用 Socket 套接字.Socket 的英文原義是“孔”或“插座”,通常也稱為“套接字”,用於描述IP和端口,它是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信,如圖所示,在InternetThere are generally multiple service software running on the host on the server,同時提供幾種服務,Open one for each serviceSocket,並綁定到一個端口上,不同的端口對應不同的服務.


Socket 正如其英文原義那樣,like a multi-hole socket.一台主機猶如布滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電,有的提供110伏交流電,有的則提供有線電視節目.客戶軟件將插頭插到不同編號的插座,就可以得到不同的服務.

在Python中使用socket模塊的socket()函數就可以完成,語法格式如下:

s = socket.socket(AddressFamily, Type)

函數socket.socket創建一個socket,返回該socket的描述符,該函數帶有兩個參數:

  • AddressFamily:可以選擇AF_INET(用於Internet進程間通信)或者AF_UNIX(用於同一台機器進程間通信),實際工作中常用AF_INET.
  • Type:套接字類型,可以是SOCK_STREAM(流式套接字,主要用於TCP協議)或者SOCK_DGRAM(數據報套接字,主要用於UDP協議).

例如,為了創建TCP/IP套接字,可以用下面的方式調用socket.socket():

tcpSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

同樣,為了創建UDP/IP套接字,需要執行以下語句:

udpSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

創建完成後,生成一個socket對象,socket對象的主要方法如下表所示:

socket 對象的內置函數 函數功能服務器端套接字函數bind()Used to bind addresses(host, port)到套接字,在 AF_INET 下,以元組(host, port)的形式表示地址listen()用於開始 TCP 監聽.backlog 指定在拒絕連接之前,操作系統可以掛起的最大連接數量.該值至少為 1,大部分應用程序設為 5 即可accept()被動接受TCP客戶端連接,(阻塞式)等待連接的到來客戶端套接字函數connect()主動初始化 TCP 服務器連接,一般 address 是形式為(hostname, port)的二元組,如果連接出錯,則返回socket.error錯誤connect_ex()connect() 函數的擴展版本,Returns an error code on error,而不是拋出異常公共用途的套接字函數recv()接收 TCP 數據,數:It is returned as a string,bufsize 指定要接收的最大數據量,flags 提供有關消息的其他信息,通常可以忽略send()發送 TCP 數據,Send the data in the string to the connected socket.返回值是要發送的字節數量,The number may be less than the length of the stringsendall()完整發送 TCP 數據.Send the data in the string to the connected socket,但在返回之前會嘗試發送所有數據.若成功,則返回 None;若失敗,則拋出異常recvform()接收 UDP 數據,與 recv() 的功能類似,但返回值是 (data, address).其中 data 是包含接收數據的字符串,address 是發送數據的套接字地址公共用途的套接字函數sendto()發送 UDP 數據,將數據發送到套接字,address 是形式為 (ipaddr, port) 的元組,Used to specify a remote address.返回值是發送的字節數close()關閉套接字getpeername()返回連接套接字的遠程地址.返回值通常是元組(ipaddr, port)

getsockname()

返回套接字自己的地址.返回值通常是元組(ipaddr, port)setsockopt(level, optname, value)設置給定套接字選項的值getsockopt(level, optname[,buflen])返回套接字選項的值settimeout(timeout)設置套接字操作的超時時間,timeout 是一個浮點數,單位是秒.值為 None 表示沒有超時時間.一般,The timeout should be set when the socket is just created,因為它們可能用於連接的操作(如connect())gettimeout()返回當前超時時間的值,單位是秒,如果沒有設置超時時間,則返回 Nonefileno()返回套接字的文件描述符setblocking(flag)如果 flag 為 0,則將套接字設為非阻塞模式;否則,Put the socket into blocking mode(默認值).在非阻塞模式下,如果調用 recv() 沒有發現任何數據,或 send() 調用無法立即發送數據,那麼將引起 socket.error 異常makefile()Create a file associated with the socket

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved