鏈路層
幀組成(按順序):
目標MAC:6B
源MAC:6B
類型:2B
數據:46B-1500B
CRC:4B
其中,源MAC為主機網卡地址,類型為來源網絡層的數據類型,ipv4為0800,arp為0806,pppoe為8864,1qtag為8100,ipv6為86dd
python可以通過uuid模塊獲取到本機mac地址
網絡層
數據報結構
首部:20-60B,其中前20B必選項,后40B可選項
數據:0-65516B
首部結構
版本:4位,表示ipv4還是ipv6
ihl:4位,表示首部長度,單位位4B,所以最大為4x15=60B,剛好是首部最大長度
ds:區分服務,8位,前三位表示優先級,接下來四位表示最小時延,最大吞吐量,最高可靠性和最小代價,最后一位未使用
總長度:16位,表示首部和數據總長度,單位為B。注意到鏈路層數據長度為46-1500,當網絡層數據報不夠46B時會填補數據,超過1500時會切片
標識:16位,表示分片數據的唯一id
標志:3位,最高位為預留位,第二位表示是否可分片,0表示可分片,1表示不可分片,最后一位表示此數據報是否為分片,0表示非分片,且是最后一個分片,1表示分片,且后面還有分片
分片位移:13位,8B
生存時間,8位,最大255,表示路由最大跳數
協議:8位,表ip數據報類型,如ICMP,IGMP,TCP,UDP等
首部校驗和:16位
源ip地址和目標ip地址,各32位
python獲取網絡信息可通過psutil和netifaces兩個模塊去獲取,其中netifaces版本廢棄了,可以安裝netifacce2
傳輸層
udp
不保證數據可達
報頭8B:源端口2B,目標端口2B,長度2B,校驗和2B
數據0-65527B
TCP
創建連接3次握手,關閉連接4次握手
數據報結構
首部20-60B
數據0-65535B
首部結構
源端口16位
目標端口16位
序號:32位:每個字節的數據都有序號,到pow(2,32)后從0開始
確認號:32位,接收方發給發送方,希望收到下一個數據報文第一個字節的序號,比如發送方發了0-999字節,接收方發的確認號就是1000
數據偏移:4位,單位位4B,類似ipv4報頭的ihl
保留:6位,一般為0
URG:1位,1表示緊急數據,緊急指針有效
ACK:1位,為1表示確認號字段有效
PSH:1位,1表示報文被創建并立即發出去,接收端收到后會立即交給進程,而不是放緩存中等緩存滿了才遞交
RST:1位,為1表示當前連接出現嚴重問題,徐奧釋放連接并重新創建連接,RST為1還可用于拒絕接受非法報文或拒絕打開非法連接
SYN:1位,為1表示報文為連接請求或連接接受報文
FIN:1位,為1表示數據發送完畢并要求釋放連接
窗口:16位,由接收方發給發送方,表示期望接受下個報文的長度
校驗和:16位
緊急指針:16位,URG為1時指出緊急數據結束位置
python獲取網絡信息
psutil可以獲取網絡一些統計信息,net_io_counters方法默認收集整機的網絡統計信息,入參pernic=True會單獨收集每個網卡的統計信息
應用層
http
http默認是無狀態通信,可以通過cookie進行有狀態的服務
http端口一般為80
報文結構
請求報文:方法,url,版本,其他首部字段,報文實體(可選)
應答報文:版本,狀態碼,短語,其他首部字段,報文實體(可選)
方法:有8種,get,post,head,put,delete,option,connect,trace
版本:http版本號
其他首部字段:比如Cache-Control, Accept-Encoding等
報文實體:長度不限,可以為0
狀態碼:即404這種,三位數。1xx表示服務器收到了請求,2xx表示服務器接受客戶端請求,3xx表示服務器對客戶端請求重定向,4xx表示客戶端請求有誤,5xx表示服務端有問題
短語:對狀態碼的注釋,比如202返回碼對應的短語是Accept,404對應的短語是Not Fount
https
http沒有安全保證,可以被抓包,https使用ssl或tls對數據報文加密后tcp傳輸,默認端口443
一般會使用對稱加密和非對稱加密,對稱加密一般用于報文加密,非對稱加密一般用于密碼加密
請求流程
客戶端請求時會將自己支持的一套加密規則發給服務器
服務器根據客戶端加密規則組合出一組加密和hash算法,連同自己的身份信息,以數字證書形式返回給客戶端
客戶端驗證服務器證書合法性,通過后生成一串隨機數密碼,并用服務器公鑰對這個隨機數密碼加密。客戶端對要發送的消息計算hash,用隨機數密碼對要發送的消息和消息的hash值進行加密,最后將服務器公鑰加密的隨機數密碼,用隨機數密碼加密的消息和消息是hash一起返回給服務器
服務端收到客戶端數據后,用自己的私鑰揭密處隨機數密碼,然后用隨機數密碼解密消息和消息hash值,對比解密出的hash值和收到消息的hash值是否一致。若一致,則客戶端和服務端連接建立成功,此后,雙方使用隨機數密碼對數據進行加解密。后續數據傳輸過程中,如果出錯或hash不一致則連接自動終止
ftp
dns
snmp
snmp簡單郵件傳輸協議,用于將郵件從源地址傳送到目的地址,端口一般為25
是常用的郵件發送協議,發郵件后,郵件會發到snmp服務器上
pop3
收信方用來從自己服務器上接受其他用戶發給自己的郵件,端口一般110
pop3是離線協議,用戶登錄時會一次性將pop3服務器的郵件下載到本地,同時服務器的郵件都刪掉自動
imap是在線的收信協議,彌補了pop3離線的問題,是目前最常用的郵件接受協議,端口一般143
dhcp
有dhcp的客戶端連接網絡時,會廣播dhcp disocover報文,按一定規則進行有限次次數廣播后如果未收到響應則dhcp失敗
服務器收到報文后會從可用地址池挑一個ip,廣播形式發送dhcp offer報文把這個ip返回給客戶端
客戶端收到dhcp服務器分配的ip后,會發送一個arp請求看這個ip有沒有被占用,如果被占用了則客戶端發送dhcp decline報給dhcp服務器,如果沒被占用則發送dhcp request給服務器,服務器收到后會給客戶端發送一個dhcp ack響應,至此一個dhcp服務流程結束
dhcp服務端端口一般67,dhcp客戶端端口一般68.dhcp使用udp通信