本篇包括網絡編程概述、UDP簡介、TFTP簡介、TCP編程等。
目錄
一、tcp/ip協議簡介
二、埠
三、IP位址
四、MAC地址
五、socket簡介
六、UDP網絡通信過程
七、模擬QQ聊天-多線程實現
八、wireshark抓包工具的使用
九、tftp下載器的使用(tftpd64或tftpd32)
十、UDP廣播
十一、TCP伺服器、客戶端簡介及實現
11.1 TCP簡介
11.2 TCP和UDP通信模型
11.3 python實現tcp伺服器和客戶端
一、tcp/ip協議簡介
tcp/ip不是兩個協議,而是一個協議組,實際為4層,邏輯上可以為7層,如下圖所示:
二、埠
為什麼使用埠?只有ip地址時只知道發往哪個電腦而不知道發往哪個程序,埠用來辨識要發往的具體程序。
為什麼不用PID辨識進程?因為進程是動態的,遠端電腦可能不知道本地的pid號。
知名埠:大家都知道的約定好的埠,如80埠為HTTP服務,21埠為FTP服務,範圍為0~1023。
動態埠:用戶自己定義的埠,範圍為1024~65535.
查看埠命令:netstat -an
注意:在同一個OS中,埠不允許相同,如果某個埠已經被使用了,那麼在這個進程釋放這個埠之前,其他進程不能使用這個埠。因為埠用來區分一個進程。
三、IP位址
用來邏輯上表示網絡上的唯一一台電腦。
注意:一個電腦可以有多個網卡,即多個IP位址!
IP位址分類
其中網絡號固定不變,表示位於同一網絡中的電腦,主機號為當前網絡中的電腦號。
主機號為0時表示網段號,主機號為255時為網關。
D類用於多播(不是廣播),例如視頻會議,只有一些人可以看到。
E類實驗和開發用。
私有ip
用於區域網中,訪問公網時不能使用,需要轉換為公有ip訪問外網。範圍如下:
注意
IP位址127.0.0.1~127.255.255.255用於迴路測試,即測試當前電腦tcp/ip協議能不能用,例如ping 127.0.0.1,即使拔掉網線也能ping得通。
Linux伺服器開發學習視頻資料,包括Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK等等。
需要知識技術學習視頻文檔資料的朋友可以後台私信【架構】獲取
四、MAC地址
網卡的序列號,形如XX:XX:XX:XX:XX:XX,六組十六進位數,前三組表示廠商序列號,後三組表示網卡序列號。
五、socket簡介
socket:通過網絡使進程間通信。
注意:一個進程可以有多個socket!
python測試程序如下:
埠綁定(只能綁定自己的埠!)
上面程序每次運行時作業系統為它分配的埠不一樣,這導致了遠端電腦不知道每次運行的埠,不能發送信息到本地。
python程序如下:
注意:bindAddr中第一個參數為空,因為該參數表示本地IP位址,但本地可能有多個IP,空表示任意ip都進行綁定。
六、UDP網絡通信過程
應用層填寫需要發送的數據;傳輸增加上埠號等;網絡層加上目的ip等;鏈路層加上目的mac等;如下圖:
七、模擬QQ聊天-多線程實現
全雙工實現QQ聊天,代碼如下:
from threading import Thread
from socket import *
#1. 收數據,然後列印
def recvData():
while True:
recvInfo = udpSocket.recvfrom(1024)
print(">>%s:%s"%(str(recvInfo[1]), recvInfo[0]))
#2. 檢測鍵盤,發數據
def sendData():
while True:
sendInfo = input("<<")
udpSocket.sendto(sendInfo.encode("gb2312"), (destIp, destPort))
udpSocket = None
destIp = ""
destPort = 0
def main():
global udpSocket
global destIp
global destPort
destIp = input("對方的ip:")
destPort = int(input("對方的ip:"))
udpSocket = socket(AF_INET, SOCK_DGRAM)
udpSocket.bind(("", 4567))
tr = Thread(target=recvData)
ts = Thread(target=sendData)
tr.start() #啟動接收數據線程
ts.start() #啟動發送數據線程
tr.join() #等待兩個線程結束
ts.join()
if __name__ == "__main__":
main()
八、wireshark抓包工具的使用
wireshark工具可以抓取當前電腦中所有網絡數據,具體如圖所示:
九、tftp下載器的使用(tftpd64或tftpd32)
tftp是tcp/ip協議族中用來將客戶端和伺服器之間進行簡單文件傳輸的協議。
特點如下:
基於UDP實現,可能會丟包,實現過程為收到-回復,下載過程如下:
TFTP數據表格式如下:
讀寫請求格式:操作碼為1或2,分別表示讀或寫;文件名為文件名稱;0為固定寫法;模式有幾種,最常用的為octet;最後跟一個0