一、網(wǎng)絡(luò)協(xié)議
1、七層模型:包括物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層,表示層,應(yīng)用層,由左至右,一層層往上構(gòu)建而成。
物理層:建立、維護(hù)、斷開物理連接數(shù)據(jù)鏈路層:底層的電子設(shè)備不認(rèn)識(shí)IP,只認(rèn)識(shí)MAC,數(shù)據(jù)鏈路層用的就是MAC尋址網(wǎng)絡(luò)層:進(jìn)行邏輯地址尋址,實(shí)現(xiàn)不同網(wǎng)絡(luò)之間的路徑選擇。我們使用的IP地址就處于這個(gè)層傳輸層:定義傳輸數(shù)據(jù)的協(xié)議端口號(hào),以及流控和差錯(cuò)校驗(yàn)。協(xié)議有:TCP和UDP。數(shù)據(jù)包一旦離開網(wǎng)卡即進(jìn)入網(wǎng)絡(luò)傳輸層會(huì)話層:建立、管理、終止會(huì)話。對(duì)應(yīng)主機(jī)進(jìn)程,指本地主機(jī)與遠(yuǎn)程主機(jī)正在進(jìn)行的會(huì)話(在五層模型里面已經(jīng)合并到了應(yīng)用層)表示層:數(shù)據(jù)的表示、安全、壓縮。(在五層模型里面已經(jīng)合并到了應(yīng)用層)比如:格式有,JPEG、ASCll、EBCDIC、加密格式等應(yīng)用層:網(wǎng)絡(luò)服務(wù)與最終用戶的一個(gè)接口。協(xié)議有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP,我們看到的大部分協(xié)議都處于這個(gè)層,建立在TCP和UDP協(xié)議之上,就像不同國(guó)家的語(yǔ)言,定義了怎么收(解釋語(yǔ)義)和怎么發(fā)(語(yǔ)法)
2、而socket就是封裝了這些協(xié)議的簡(jiǎn)單使用接口,如果需要開發(fā)自己的協(xié)議,至少要掌握socket的編程
二、socket中的地址簇:包括socket.AF_UNIX,socket.AF_INET,socket.AF_INET6
1、socket.AF_UNIX:用于本機(jī)間的進(jìn)程通信,如果不用這個(gè)也可以用pickle序列化實(shí)現(xiàn),不過效率低
2、socket.AF_INET:IPV4通信
3、socket.AF_INET6:IPV6通信
三、socket的類型:包括socket.SOCK_STRAEM,socket.SOCK_DGRAM,socket.SOCK_RAW
1、socket.SOCK_STRAEM:用于TCPIP通信
2、socket.SOCK_DGRAM:用于UDP通信
3、socket.SOCK_RAW:原始套接字,可以用來構(gòu)造IP頭
四、基本的通信思路:
1、首先是先有接受端計(jì)算機(jī),選擇socket地址簇和socket的類型(相當(dāng)于告訴計(jì)算機(jī)使用何種方式發(fā)送和解析數(shù)據(jù)),需要監(jiān)聽某個(gè)端口,等待遠(yuǎn)程計(jì)算機(jī)發(fā)送數(shù)據(jù),接受此數(shù)據(jù),然后發(fā)送新的數(shù)據(jù)給遠(yuǎn)程計(jì)算機(jī),繼續(xù)保持監(jiān)聽狀態(tài)。
2、然后有發(fā)送端計(jì)算機(jī),選擇socket地址簇和socket的類型(相當(dāng)于告訴計(jì)算機(jī)使用何種方式發(fā)送和解析數(shù)據(jù)),接受數(shù)據(jù),關(guān)閉遠(yuǎn)程連接。
3、客戶端代碼如下:
import socket
# 如果socket不給參數(shù),默認(rèn)用AF_INET:IPV4通信,SOCK_STREAM:用于TCPIP通信
sock = socket.socket()
sock.connect(("localhost",56418))
sock.send(b"hello")
data = sock.recv(1024)
print("服務(wù)器返回了數(shù)據(jù):%s" % data.decode("utf-8"))
sock.close()
4、服務(wù)器端代碼如下:
import socket
# 如果socket不給參數(shù),默認(rèn)用AF_INET:IPV4通信,SOCK_STREAM:用于TCPIP通信
server = socket.socket()
# 綁定IP和端口
server.bind(("localhost",56418))
# 監(jiān)聽
server.listen()
print("開始等待!")
# 等待遠(yuǎn)程對(duì)象連接,當(dāng)有遠(yuǎn)程計(jì)算機(jī)連接到此服務(wù)器,就會(huì)得到一個(gè)遠(yuǎn)程對(duì)象和遠(yuǎn)程對(duì)象的地址(遠(yuǎn)程IP和遠(yuǎn)程端口)
clinet_obj,addr = server.accept()
print("有數(shù)據(jù)進(jìn)來了!", clinet_obj, addr)
# 接收信息
data = clinet_obj.recv(1024)
# 發(fā)送信息
clinet_obj.send(data.upper())
# 關(guān)閉服務(wù)器
server.close()
print("服務(wù)器關(guān)閉了!")
今天文章有點(diǎn)短,但是內(nèi)容豐富,希望你們能夠喜歡,請(qǐng)關(guān)注,收藏,轉(zhuǎn)發(fā)。再次感謝!