python socket编程步骤_python-socket编程(入门,网络基础)
一、網絡基礎
網絡建立的目的是為了數據交互(通信)
如何實現通信:
1.建立好底層的物理連接介質
2.有一套統一的通信標準,稱之為互聯網協議
1.osi七層協議
互聯網協議按照功能的不同分為osi七層或tcp/ip五層或tcp/ip四層
每層運行的常見物理設備
2.tcp/ip五層協議模型講解
2.1物理層:主要是基于電器特性發(fā)送高低電壓(電信號),高電壓對應數字1,低電壓對應數字0
2.2數據鏈路層:定義了電信號的分組方式,由于單純的0和1并沒有任何意義,必須規(guī)定電信號多少位一組,每組什么意思
以太網協議:
早期每個公司都有自己的分組方式,后來形成統一的標準,即以太網協議Ethernet
Ethernet規(guī)定
1.一組電信號構成一個數據包,叫做‘幀’,每一數據幀分成:報頭head和數據data兩部分
2.報頭(head):固定字節(jié)數,里面包含發(fā)送者,接收者,數據類型。數據(data):數據包的具體內容
mac地址
head中包含的源和目標地址的由來:以太網規(guī)定接入internet的設備都必須具備網卡,發(fā)送地址和接收地址都是通過網卡來的
每塊網卡出廠時都被燒制上一個唯一的mac地址,前6位是廠商編號,后6位是流水線號
廣播:
有了mac地址,同一網絡內的兩臺計算機就可以通信了
2.3網絡層:不同網絡內想要通信,光靠Ethernet、mac地址和廣播并不可行,所以引入一套新的地址用來區(qū)分不同的網絡,這套地址就叫網絡地址
ip協議:
規(guī)定網絡地址的協議叫ip協議,它定義的地址稱為ip地址,廣泛采用v4版本即ipv4,它規(guī)定網絡地址由32位2進制表示
范圍為0.0.0.0 ---255.255.255.255
ip地址分為兩部分
網絡部分:標識子網
主機部分:標識主機
子網掩碼:
形式上等同于ip地址,也是32位二進制,網絡部分全部為1,主機部分全為0。
知道子網掩碼我們就能判斷,任意兩個ip地址是否處在同一個子網絡。方法是將兩個ip地址分別進行AND運算(兩個都為1運算結果為1,否則為0),比較結果是否相同,如果相同的話就表明他們是在一個子網絡中,否則就不是
總結ip協議的作用:1.為每臺計算機分配ip地址,2確定這些地址是不是在同一個子網絡中。
ARP協議
廣播的方式發(fā)送數據包,獲取目標主機的mac地址
2.4傳輸層:網絡層的ip幫我們區(qū)分子網,以太網層的mac幫我們找到主機,傳輸層建立端口到端口的通信,端口就是應用程序與網關關聯的編號? ?端口范圍0-65535,? 0-1023位系統占用端口
tcp協議:可靠傳輸,tcp數據包沒有長度限制,必須等到有回應才會繼續(xù)發(fā)送
udp協議:不可靠傳輸,不管有沒有收到響應只管發(fā)送
tcp的三次握手
注:TCP的TIME_WAIT需要等待2MSL,當TCP的一端發(fā)起主動關閉,三次揮手完成后發(fā)送第四次揮手的ACK包后就進入這個狀態(tài),等待2MSL時間主要目的是:防止最后一個ACK包對方沒有收到,那么對方在超時后將重發(fā)第三次握手的FIN包,主動關閉端接到重發(fā)的FIN包后可以再發(fā)一個ACK應答包。在TIME_WAIT狀態(tài)時兩端的端口不能使用,要等到2MSL時間結束才可以繼續(xù)使用。當連接處于2MSL等待階段時任何遲到的報文段都將被丟棄。MSL即Maximum Segment Lifetime,就是最大報文生存時間,是任何報文在網絡上的存在的最長時間,超過這個時間報文將被丟棄。
常見面試題:為什么建立鏈接是三次握手,不是二次,四次,關閉鏈接卻是四次不是其它
這是因為服務端在LISTEN狀態(tài)下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個報文里發(fā)送給客戶端。而關閉連接時,當收到對方的FIN報文時,僅僅表示對方不再發(fā)送數據了但是還能接收數據,己方也未必全部數據都發(fā)送給對方了,所以己方可以立即close,也可以發(fā)送一些數據給對方后,再發(fā)送FIN報文給對方來表示同意現在關閉連接,因此,己方ACK和FIN一般都會分開發(fā)送。
2.5應用層:規(guī)定應用程序的數據格式
二、socket介紹
socket是應用層與tcp/ip協議通信的中間軟件抽象層,它是一組接口,它吧復雜的TCP/IP協議隱藏在socket接口后面。
基于文件類型的套接字家族:
套接字家族的名字:AF_UNIX
unix一切皆文件,基于文件的套接字調用的就是底層的文件系統來取數據,兩個套接字進程運行在同一機器,可以通過訪問同一個文件系統間接完成通信
基于網絡類型的套接字家族:
套接字家族的名字:AF_INET
AF_INET被用于ipv4,AF_INET6被用于ipv6
三、套接字使用
importsocket
socket.socket(socket_family,socket_type,protocal=0)
socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默認值為 0。
獲取tcp/ip套接字
tcpSock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
獲取udp/ip套接字
udpSock=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
由于 socket 模塊中有太多的屬性。我們在這里破例使用了'from module import *'語句。使用 'from socket import *',我們就把 socket 模塊里的所有屬性都帶到我們的命名空間里了,這樣能 大幅減短我們的代碼。
例如tcpSock= socket(AF_INET, SOCK_STREAM)
客戶端套接字函數
s.connect() 主動初始化TCP服務器連接
s.connect_ex() connect()函數的擴展版本,出錯時返回出錯碼,而不是拋出異常
公共用途的套接字函數
s.recv() 接收TCP數據
s.send() 發(fā)送TCP數據(send在待發(fā)送數據量大于己端緩存區(qū)剩余空間時,數據丟失,不會發(fā)完)
s.sendall() 發(fā)送完整的TCP數據(本質就是循環(huán)調用send,sendall在待發(fā)送數據量大于己端緩存區(qū)剩余空間時,數據不丟失,循環(huán)調用send直到發(fā)完)
s.recvfrom() 接收UDP數據
s.sendto() 發(fā)送UDP數據
s.getpeername() 連接到當前套接字的遠端的地址
s.getsockname() 當前套接字的地址
s.getsockopt() 返回指定套接字的參數
s.setsockopt() 設置指定套接字的參數
s.close() 關閉套接字
面向鎖的套接字方法
s.setblocking() 設置套接字的阻塞與非阻塞模式
s.settimeout() 設置阻塞套接字操作的超時時間
s.gettimeout() 得到阻塞套接字操作的超時時間
面向文件的套接字的函數
s.fileno() 套接字的文件描述符
s.makefile() 創(chuàng)建一個與該套接字相關的文件
基于tcp協議通信的套接字簡單
from socket importsocket, AF_INET, SOCK_STREAM#socket 套接字#AF_INET IPv4#SOCK_STREAM socket流
IP = "127.0.0.1"PORT= 8888ADDRESS=(IP, PORT)
BUFSIZE= 1024
print("服務器開啟了")#1.創(chuàng)建服務器socket對象
serSocket =socket(AF_INET, SOCK_STREAM)#2.設置服務器地址
serSocket.bind(ADDRESS)#3.設置連接管理隊列
serSocket.listen(5)#4.建立客戶端服務器連接
cliSocket, addr =serSocket.accept()print(cliSocket)print(addr)#5.收發(fā)數據
data =cliSocket.recv(BUFSIZE)print(data.decode("utf-8"))
cliSocket.send("服務器返回的數據".encode("utf-8"))#6.斷開客戶端
cliSocket.close()#7.關閉服務器
serSocket.close()print("服務器關閉了")
server
from socket importsocket, AF_INET, SOCK_STREAM
IP= "127.0.0.1"PORT= 8888ADDRESS=(IP, PORT)
BUFSIZE= 1024
print("客戶端開啟了")#1.創(chuàng)建客戶端socket對象
cliSocket =socket(AF_INET, SOCK_STREAM)#2.連接服務器地址
cliSocket.connect(ADDRESS)print(cliSocket)#3.收發(fā)數據
cliSocket.send("客戶端發(fā)送的數據".encode("utf-8"))
data=cliSocket.recv(BUFSIZE)print(data.decode("utf-8"))#4.關閉客戶端
cliSocket.close()print("客戶端關閉了")
client
總結
以上是生活随笔為你收集整理的python socket编程步骤_python-socket编程(入门,网络基础)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python定义函数的关键字是_pyth
- 下一篇: guido正式发布python年份_Py