網絡編程——協議基礎

lee哥說架構 發佈 2020-07-09T22:29:53+00:00

# 2. udp在發送數據的時候,因為沒有之前的連結,所以需要 在每次的發送中 都要填寫接收方的ip和port----->寫信。

本篇包括網絡編程概述、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

關鍵字: