Python高级网络编程系列之基础篇
一、Socket簡(jiǎn)介
1、不同電腦上的進(jìn)程如何通信?
進(jìn)程間通信的首要問題是如何找到目標(biāo)進(jìn)程,也就是操作系統(tǒng)是如何唯一標(biāo)識(shí)一個(gè)進(jìn)程的!
在一臺(tái)電腦上是只通過進(jìn)程號(hào)PID,但在網(wǎng)絡(luò)中是行不通的,因?yàn)槊颗_(tái)電腦的IP可能都是不一樣的,因此TCP/IP協(xié)議族通過使用IP地址+端口號(hào)的方式來標(biāo)識(shí)任意一臺(tái)主機(jī)的應(yīng)用進(jìn)程。
因此,利用IP地址 + 協(xié)議 + 端口號(hào)就可以用來標(biāo)識(shí)網(wǎng)絡(luò)進(jìn)程了,網(wǎng)絡(luò)中可以利用這個(gè)標(biāo)識(shí)來與其他進(jìn)程通信。
?
2.什么是socket
Socket簡(jiǎn)稱為套接字,是進(jìn)程間通信的一種方式,它與其他進(jìn)程間通信的一個(gè)不同之處在于:它能實(shí)現(xiàn)不同主機(jī)間的進(jìn)程間通信,網(wǎng)絡(luò)上各種各樣的服務(wù)大多是基于Socket來完成的。
?
二、TCP簡(jiǎn)介
1.介紹:TCP協(xié)議,傳輸控制協(xié)議(Transmission Control Protocol)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。
2.通信流程:建立連接、數(shù)據(jù)傳輸、終止連接,就類似我們生活中的“打電話”。
三、TCP特點(diǎn):
1.面向連接:通信前必須先建立連接才能進(jìn)行數(shù)據(jù)傳輸,雙方都必須為該連接分配必要的系統(tǒng)內(nèi)核資源。
2.可靠傳輸:主要體現(xiàn)在:
1). TCP采用發(fā)送應(yīng)答機(jī)制:TCP發(fā)送的每個(gè)報(bào)文都必須得到接收方的應(yīng)答才能成功傳輸該報(bào)文。
2). 超時(shí)重傳:如果發(fā)出的報(bào)文在一段時(shí)間內(nèi)沒有收到應(yīng)答那么就重新發(fā)送這個(gè)報(bào)文段。此外,TCP是為每個(gè)包都分配一個(gè)序號(hào),用來保證不會(huì)發(fā)送方丟包和用于在接收端重組。
3). 錯(cuò)誤檢驗(yàn):TCP用一個(gè)校驗(yàn)和函數(shù)來校驗(yàn)數(shù)據(jù)是否有誤,
? ?4). 流量控制和阻塞管理:用來避免主機(jī)發(fā)送得過快而使接收方來不及全部收下。
?
四、UDP協(xié)議
UDP是一中無需建立連接就能通信的協(xié)議,只需要發(fā)送數(shù)據(jù)即可。因此一般適用于廣播的應(yīng)用程序。
?
五、TCP與UDP的不同點(diǎn)
- 面向連接(確認(rèn)有創(chuàng)建三方交握,連接已創(chuàng)建才作傳輸。)
- 有序數(shù)據(jù)傳輸
- 重發(fā)丟失的數(shù)據(jù)包
- 舍棄重復(fù)的數(shù)據(jù)包
- 無差錯(cuò)的數(shù)據(jù)傳輸
- 阻塞/流量控制
?
六、TCP/IP協(xié)議族
互聯(lián)網(wǎng)協(xié)議包含了上百種協(xié)議標(biāo)準(zhǔn),但是最重要的兩個(gè)協(xié)議是TCP和IP協(xié)議,因此一般把互聯(lián)網(wǎng)的協(xié)議簡(jiǎn)稱為TCP/IP協(xié)議族。
?
七、TCP/IP協(xié)議傳輸示意圖
以QQ間發(fā)送消息為例!
?
八、TCP通信模型
主要是使用TCP協(xié)議來進(jìn)行通信!
?
注意點(diǎn):
?
代碼實(shí)現(xiàn)如:
1 import socket 2 3 4 def main(): 5 pass 6 # 1.創(chuàng)建TCP套接字 7 tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 8 # 設(shè)置地址可重用 9 tcp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 10 # 2.把套接字綁定到主機(jī)上 11 tcp_sock.bind(('', 6060)) 12 # 3.被動(dòng)套接字 13 tcp_sock.listen(128) 14 print('{}正在監(jiān)聽中'.format(tcp_sock.getsockname())) 15 # 4.與客戶端進(jìn)行連接 16 while True: 17 client, addr = tcp_sock.accept() # Ctrl+Shift +i 18 print('已經(jīng)連接到了客戶端:{}'.format(addr)) 19 # 接收來自客戶端的消息 20 data = client.recv(1024) 21 print(data.decode('utf-8')) 22 # 消息一經(jīng)發(fā)送完畢就斷開了連接 23 client.close() # 短連接 24 25 tcp_sock.close() 26 27 28 if __name__ == '__main__': 29 main()?
轉(zhuǎn)載于:https://www.cnblogs.com/fangtaoa/p/9041603.html
總結(jié)
以上是生活随笔為你收集整理的Python高级网络编程系列之基础篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到蝎子是怎么回事
- 下一篇: Python 08 面向对象