?絡相關基礎知識
協議
兩設備之間使?光電信號傳輸信息數據
要想傳遞不同信息 那么?者?就需要約定好的數據格式
層
封裝 繼承 多態是計算機的性質 它們?持了軟硬件分層的實現
同層協議可以?接通信
同層協議?不直接通信 是各?調?下層提供的結構能?完成通信
分層是解耦的有效?式 提?了軟件的可維護性
?段優秀的代碼是?內聚(class) 低耦合的
OSI(Open System Interconnection) 開放系統互聯 七層模型
物理層 數據鏈路層 ?絡層 傳輸層 會話層 表示層 應?層
嚴格來說只實現了2 3 4 7層
因為標準定制者和標準實現者是兩碼事
TCP/IP協議簇
存在意義 IP地址是?絡中計某主機唯?標識符
計算機F諾伊曼體結構就是?個?絡 只不過是距離問題
TCP/IP是為了給計算機之?的通信距離問題提供?案
通信是?段
?絡和OS之間的關系
即使兩臺電腦?OS不同 只要?者?絡協議棧相同
它們便可以通信 所以傳輸層和?絡層?定相同
?絡層IP和傳輸層TCP?定在OS內核中實現
應?層在?戶層實現 數據?路層屬于驅動層
所以?絡是OS的?個模塊
OS存在?協議并以先描述 再組織的?式管理 所以協議就是結構體
不同機器需要通信那么協議結構體?絡代碼相同
協議就是雙?共識的結構化數據類型
TCP/IP五層(四層)模型
TCP/IP是?組協議的代名詞 它還包含許多協議 組成TCP/IP協議簇
TCP/IP?了五層結構 每?層都呼叫其下?層所組成的?絡完成其需求
物理層:例如?卡 光纖 貓之類 ?于和外間1交換光電信號完成數據交互
集線器 ?于信號放? 減少物理層數據衰減的影響
數據鏈路路層:例如交換機 ?于局域?(短距離)間通信
?絡層:IP 如路由器 ?于短距離?絡通信
傳輸層:如傳輸控制協議TCP ?于保證源機將數據傳輸到?標機
應?層:如?件傳輸協議 電?元件傳輸 負責程序?溝通
MAC地址
?卡出場?時?帶的?串48位的序列號 發送信息是會?動帶上
其他設備接受到此信號后會???的MAC地址與其進??較
相同則接收 反之丟棄
MAC地址具有唯?性
很多設備都有類似唯?值
LAN的碰撞檢測和碰撞避免
?個主機發送數據后會?直不斷檢測(碰撞檢測)
此數據是否會和其他機器發送的數據發?碰撞
若發?碰撞 則休眠??段時?再發送(碰撞避免)
?個以太?僅允許?段時?內?個主機發送數據 故以太?也是公共資源
碰撞檢測和碰撞避免也是為了保證以太?被使?的唯?性
故?以太?也是臨界資源 數個主機就是臨界區或線程
交換機可以緩解碰撞避免導致的?絡持續休眠問題
信號?絡傳輸基本流程
IP地址
在IP協議中?于表示?絡下的不同主機
IP協議有兩個版本 ,分別是IPv4和IPv6,?般情況下指IPv4
IP地址是4字節32位整數
這是點分十進制表示方案
IP地址和MAC地址區別
超長距離?絡傳輸的本質是 按照指定路徑
數據從?個局域?(??)躍遷到下?個局域?
如此循環最終到達?的地
IP地址在?絡信號傳輸中扮演?的地地址??
?MAC地址扮演中繼局域?主機地址??
所以MAC地址僅在局域?或??中有效
IP地址作為?的地地址?乎不變
主機依托路由器長距離通信簡圖
以太網
由于?開始科學不發達 聲?傳播需要媒介
于是物理學家誤以為光傳播也需要媒介
因此將傳播光的媒介叫做aether
后來科技發展才知道光傳播不需要媒介,便拋棄以太的概念
計算機科學中數據遠距離傳輸需要媒介,將此媒介叫做以太
路由器
路由器:???通信媒介
處于?絡層,路由器橫跨兩?絡
就必須有鏈接兩?絡的接?,和連接兩點??的驅動程序
路由器可構建?? 是??出?,上?主機需要連接路由器
在連接路由器的同時路由器會主機的IP地址和MAC地址記錄
主機發現此報?不屬于??便返回給路由器
端?號
端?號是傳輸層協議內容 是2字節16位整數
?戶標識?個進程 當前數據要交給哪個進程處理
IP地址+端?號可以?于標識?絡上某?個主機的某?個進程
PID屬于進程管理范疇
端?號屬于?絡操作進程范疇
使?兩種類型數據來管理進程是為了解耦
端?號范圍劃分
0-1023:主流端?號 HTTP FTS SSH 是?為流傳的應?層協議
它們的端?號是固定的
1024-65535:操作系統動態分配的端?號 客戶端程序的端?號
由OS從此范圍分配
源端?號和?的端?號
傳輸層協議(TCP和UDP)的數據段有兩個端?號 源端?號
和?的端?號
分別描述是誰發的和發給誰的
源IPscrip 源端?srcport ?的IPdstIP ?的端?dstprot
四元組便可標識互聯?唯?兩個進程
傳輸層的重要成員TCP和UDP
TCP 傳輸層協議 有連接 可靠傳輸 ?向字節流(按需收取)
UDP 傳輸層協議 ?連接 不可靠傳輸 ?向數據報(整個收取)
socket
socket分三種 ?絡socket 本地socket(unix域間socket)
原始socket(和?絡?具有關)
?絡socket既可以本地通信 也可以遠距離?絡通信
套接字就是?絡中兩個app進通信時各?連接通信的端點
struct sockaddr
存在?的是為了socket常?接?參數類型統?
先聲明?個struct sockaddr類型結構體
再強制類型轉換成struct sockaddr_in
struct sockaddr_un即可
端口號轉大端的函數接口
#include <arpa/inet.h>
字節序轉換函數
功能:進??絡字節序和主機字節序的轉換
因此需要使?這些函數將將要發送到?絡中的端?號port轉換
uint32_t htonl(uint32_t hostlong); 類型是?符號32位整數
htonl就是host to network long
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
常?IP地址如 192.168.34.45屬于字符串?格IP地址
點分?進制 可讀性較好
?絡通信 char char char char 4字節表示IP地址
IP地址轉網絡風格接口
in_addr_t inet_addr(const char *cp);對于IPv4:inet_pton,inet_addr對于IPv4和IPv6:inet_pton作?:它?于將?個點分?進制格式的 IPv4 地址字符串轉換為?個32 位的?符號整整型(uint32_t)數值也稱為?絡字節序(network byte order) 是?端cp:指向?個以 null 結尾的字符串該字符串表示?個點分?進制的IPv4地址返回值:如果函數執?成功,它將返回?個?符號整整數該整數表示輸?字符串對應的IPv4地址的?絡字節序如果輸?字符串不是?個合法的IPv4地址,函數將返回INADDR_NONE(通常定義為 -1)
socket相關常?API介紹
1. socket()
功能:創建?個套接字。
函數原型:SOCKET socket(int domain, int type, int protocol);
參數
domain:指定應?程序使?的通信協議的協議族 對于TCP/IP協議族 該參數置為AF_INET(IPv4)
type:指定要創建的套接字類型 常?的有SOCK_STREAM(流式套接字 對應TCP協議)和SOCK_DGRAM)數據報套接字 對應UDP協議)
protocol:指定套接字使?的協議 常?的有IPPROTO_TCP(TCP協議)IPPROTO_UDP(UDP協議) ?般默認為0即可
返回值:成功時返回新創建的套接字的描述符 所以本質上是創建了?個?件 失敗時返回INVALID_SOCKET
2. bind()
功能:將套接字與特定的IP地址和端?號綁定
函數原型:int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen);
參數
sockfd:套接字描述符 由socket()函數返回
addr:指向包含本地地址(IP+PORT)的套接字地址結構的指針
addrlen:套接字地址結構的?? sizeof(addr)
返回值:成功時返回0 失敗時返回SOCKET_ERROR
3.recvfrom()
功能:使?UDP協議進?數據傳輸時
這個函數主要?于從?個套接字接收數據,并且能夠同時獲取發送?的地址信息
即收取對象發送的報?和地址
函數原型:ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
sockfd:指定要接收數據的套接字描述符
buf:指向?于存儲接收到的數據的緩沖區
len:指定緩沖區buf的度,即最多能接收多少字節的數據
flags:指定接收數據的選項 通常設置為0 但也可以使??些特定的標志來修改接收?為(如MSG_PEEK、MSG_WAITALL等)
src_addr:指向?個sockaddr結構體 ?于存儲發送?的地址信息 即?標主機 如果不需要這個信息 可以設置為NULL
addrlen:是?個輸?/輸出參數 在調?前 它應該包含src_addr結構體的??(通常是sizeof(struct sockaddr_in))
在調?后,它會被設置為實際存儲在src_addr中的地址信息的??。
參數具體含義:從指定的sockfd處以flag(?般為0阻塞?式)?式收取len長度的消息到buf中 成功返回收到的字節數
4.sendto()
功能
函數原型:ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
參數
sockfd:套接字描述符或套接字對象 ?于標識要發送數據的?絡套接字
sockfd既可以向任意?發送數據 也可以接受來?任意?的數據 這種特性叫做---全雙?
結論 sockfd即可以是接收?的套接字 也可以是發送?的套接字
buf:指向要發送數據的緩沖區的指針或字節數組
len:要發送的數據的度
flags:發送選項 通常設置為0即可 但也可以設置為其他值以改變發送?為,如MSG_DONTWAIT等
dest_addr:指向?標地址的指針 通常是?個sockaddr結構體 包含IP地址和端?號 ?標主機和進程
addrlen:?標地址的長度 通常為sizeof(struct sockaddr)
5.inet_aton()
功能:將字符串形式的IP地址轉換為?個32位的?絡序列(?進制)IP地址
函數原型:int inet_aton(const char *string, struct in_addr *addr);
參數
const char *string:這是?個指向以空字符結尾的字符串的指針
該字符串表示?個點分?進制的IPv4地址(如“192.168.1.1”)
struct in_addr *addr:這是?個指向in_addr結構的指針 該結構將?于存儲轉換后的32位?絡序列IP地址
in_addr結構通常包含?個名為s_addr的成員 它是?個32位?符號整數 ?于存儲IP地址的?進制表示
成功返回?個string類型的IP地址
struct sockaddr_in ?般如何設定
需要對三個成員變量進?初始化 分別是協議簇 IP地址與端?
服務器視?下三次握?和TCP常?握?相關接?和SYN ACK等對應
1.listen():開啟監聽,等待?接(但不接受?接)
2.connect():觸發 第?次握?,發送 SYN
3.服務器收到SYN并回復SYN-ACK(第?次握?)
4.客戶端收到SYN-ACK并回復ACK(第三次握?)
5.三次握?完成后,服務器的accept()取出已建?的鏈接
TCP_socket封裝(服務端)
1.藍圖抽象類
2.針對不同平臺使?的不同代碼
3.以生類具體實現
成員變量和構造函數
套接字創建
將已被bind的套接字變為被動套接字
使被動套接字請求與?戶連接進?通信(與?戶建?通信通道)
4.正式開始通信
與?戶進?通信--接受消息接?
與?戶進?用信--發送消息接?
序列化和反序列化
序列化:將字符串多變?的過程(例如將結構體中數據合并為?個字符串)
反序列化:將字符串還原成結構體(結構化數據)的過程
序列化的?的是?便?絡發送 反序列化是為了?便上層處理
協議定制:定制雙?都能認識,符合通信業務所需的結構化數據,就是struct或class
有關TCP的全雙?性
UDP發送的報??定是完整的 TCP發送報?可以不完整
發送數據的本質是將數據拷?到緩沖區中
OS中存在?量報?且?先描述后組織的?式管理
使?鏈表進?組織
JSON實現序列化和反序列化
序列化接?
這個序列化步驟?致分為三個步驟
1:初始化JSON配置root
2:配置寫??為
3:將root序列化?stringstream
反序列化接?
應?層HTTP協議
對搜索引擎關鍵詞進行編址
Encode的?的是為了避免搜索關?字和URL中的關鍵字形成沖突進?導致URL解析失敗
圖示代理服務器基本運作方式
狀態碼
靜態數據和交互式數據
靜態資源:圖? css js 視頻等
交互式資源:user上傳數據后服務器要對其進?處理(例如登錄)
PUT 傳輸?件?法
DELETE 刪除?件?法
cookie
http基于cookie的會話保持原理
情景:打開B站 此時處于未登錄狀態 登錄 關閉B站
再打開B站 它就保持登錄狀態
cookie也有內存級和硬盤級
瀏覽器關閉后要重新登錄就是內存級
http是?連接 ?狀態的協議
?狀態意思是每個HTTP請求獨?
服務器不記錄之前任何請求(每次訪問新??都要登錄)
為了提?user體驗 所以我們將user相關數據放?cookie
PS ?向鏈接!=有鏈接
Session
如果服務器檢測到userのip地址變化異常
服務器會使user的session_id失效
達成凍結賬號效果 使hacker?法盜取數據
總結:session的主要功能
1 狀態管理(有狀態) 服務端存儲會話數據
2 ?戶認證 記錄登錄(記住賬號密碼)
3 數據持久化 記錄會話期??戶數據(收藏)
4 避免重復請求和攻擊守護
5 跨??傳遞狀態
實現?式
客戶端 通過cookie存儲session ID or URL傳遞
服務端 通過session ID查找在內存or數據庫中會話數據
綜上:cookie+session=http會話保持方法
Fiddler
https加密概念簡述
加密方式簡述
對稱加密 什么?法加密 對應?法解密 常?算法AES DES RC4
?對稱加密 ?個公鑰 另?私鑰 公鑰加密 私鑰解密 算法更復雜
數據摘要&數據指紋 哈希函數對數據運算?成固定長度數據摘要
?于判斷數據有沒有被篡改
秒傳的原理就是將user的傳遞?件數據摘要進?對?
有同樣的保留?份 讓這?份獨?上傳即可
為了同時保證安全性與效率性 常?混合加密?式
?對稱加密?于密鑰交換(cli和ser)
對稱加密?于數據傳輸
中間人攻擊原理簡述
證書(反中間?攻擊)
UDP協議
UDP如何做到解包 直接讀取UDP報?前?個字節
UDP是如何做到分? 看哪個進程和16位端?號關聯
將特定報?轉給特定進程 進?對報?進?分?
UDP添加報頭過程
step1:head-=sizeof(struct udphdr)
step2:(struct udphdr*)head->source = 8080;
(struct udphdr*)head->dst = 9090;
UDP?法送buffer 只有接收buffer TCP是兩者都有
UDP接收到的報?未必是發送順序 但是TCP?定是
TCP協議
TCP基本字段
TCP確認應答ACK機制
實際上TCP發送?式是?次發送N個報?
且?次返回N個報頭確認(有丟包?險)
Q 消息太多服務器來不及接收咋辦
A 流量控制:服務器(將要)過載減緩cli發送速率直?0
Q 發送?如何知到對?將要過載?
A 16位窗???就是接收buffer剩余空???
傳遞過來的數據是2000 確認應答序列號是2001
其真正含義是2001及其之前所有的數據都確認收到
什么是連接
?個連接?定和?個?件(fd)對應 所以OS對鏈接 先描述 后組織管理
所以對連接的管理就是增刪查改 維護連接需要時間和內存
超時重傳?TCP丟包問題
丟包存在兩種情況:1 數據未到接收? 2 應答未echo到發送?
主機?法確認是哪種丟包 只可知到?echo
這種情況下只能超時重傳 ?隔的時?較短且不固定
標志位作用
TCP報?=報頭+有效載荷
標志位?于區分不同報?類型
ACK(acknowledgment)確認報? 需關注序列號
由于捎帶應答 tcp的ACK?部分為1
SYN(synchronize)同步標志位 建?鏈接請求
FIN(final) 鏈接斷開標志位
TCP三次握?和四次揮?
connect是觸發三次握? 其本身不直接參與三次握?過程
三次握?是因為 1.建?發接需要雙?的同意 2驗證全雙?通道通暢性 即?絡允許
總之需要雙?和環境的同時許可
第?次 客戶端發送FIN請求關閉連接
第?次 服務器收到FIN后,發?ACK確認
第三次 服務器發送FIN請求關閉連接
第四次 客戶端收到服務器的FIN后 發送ACK確認
由于TCP的全雙?性 所以要關閉兩個朝上的連接
詳解四次揮?
int shutdown(int sockfd, int how); 了解 ?需會?
sockfd:需要關?的套接字描述符
how:指定關閉的?式,表示關閉套接字的哪個部分(發送,接收或兩者)
how
SHUT_RD (0):只關?套接字的接收?向(即不再接收數據)
發送數據仍然可以進?
SHUT_WR (1):只關閉套接字的發送?向(即不再發送數據)
接收數據仍然可以進?
SHUT_RDWR (2):關閉套接字的發送和接收?向
套接字將完全被關閉
既不能發送也不能接收數據
如果服務器不關閉sockfd 僅完成兩次揮?
BUG:如果服務器出現?量CLOSE_WAIT狀態 說明服務器并且真正關閉socket
加上對應的close即可(現象就是服務器很卡)
FIN_WAIT_1:表示主動關閉?已經發送了 FIN 包
并等待對?的 ACK 確認
此時,主動關閉?仍可以接收數據
FIN_WAIT_2:表示主動關閉?已經收到對?的 ACK 確認
并且處于等待對?發送 FIN 包的狀態
等待對?關閉連接
TIME_WAIT:表示連接的?個端點已經完成了連接的關閉
但仍然保持?段時間 (這個狀態下連接并為真正被關閉)
以確保所有的報?都能正確到達并且不會丟失
主動斷開閉接?端 發送完畢最后?次握?后
會等待兩個MSL(max segment lifetime)時間
BUG:為什么在TCP下第?次在客戶端連接服務器后再殺進程(關閉連接)
再次?接服務器會出現“bind error”的錯誤
A:原因在于端?占? 在 TCP 連接關閉時,客戶端進? TIME_WAIT 狀態,
這個狀態會持續?段時?, TIME_WAIT 狀態期間,客戶端的源端?被占
?,即使連接已經斷開,操作系統也不允許?即?這個端?,因為它需要
確保所有可能的延長報?都已經到達并被處理
C:可以等四分或使?其他端?
也可以使?setsockopt減少端?被調?時間
TCP策略
滑動窗口
窗???:TCP 連接中,接收?為每個連接設置?個接收窗?(Receive Window)
表示接收?當前可以接收的最?字節數。接收?會在每個 ACK 包中向發送?告它的窗???
每個窗?最?64k
為什么不將滑動窗?里的數據達成?整塊報??是分成數個數據段?
數據鏈路層規定單次發送的數據幀有效載荷長度
(IP報?進?數據鏈路層會被封裝成數據幀)不可超過mtu長度(?般是1500)
由?絡層??分?和組裝
滑動窗口簡圖示意
滑動窗?數據結構上就是個?位數組
滑動窗???=接收?窗???
滑動窗??作模式是?邊向右移?邊將范圍內數據發送,所以流量控制是通過滑動窗?實現的
發送buffer可以看成?個環形順序表 不會越界
已發送確認數據區域本質是數據被釋放
所以這就是“環形產消模型”
滑動窗?丟包問題
1 最左側丟失
滑動窗?不會右移 因為后續數據會阻塞
直到丟包數據被重傳并確認
(ps被發出數據不會被?即刪除
?是暫存在滑動窗?左側
收到應答后才可刪除)
2 中間丟失 同1
3 最右側丟包 同1
確認數據報定義是之前所有數據都收到
哪里開始丟失就在哪里停滯然后重傳
超重傳
快速傳的?作原理
丟包檢測:當 TCP 發送?發送的數據包到達接收?時
接收?會對每個正確接收的數據包發送?個確認(ACK)
如果接收?發現?個數據包丟失,它會繼續重復確認最后?個成功接收的數據包
這些重復的 ACK 就是快速傳機制的信號
重復 ACK:當發送?收到多個重復的 ACK 時(通常是三個重復的 ACK)
就意味著某個數據包丟失了
此時,發送?不需要等待超時,?是?即認為丟失的數據包需要重傳
觸發重傳:在收到三個重復 ACK 后,發送?會?即重傳丟失的數據包
?不是繼續等待重傳超時
PSH標志位:PUSH=1 請盡快將你的buffer數據交給上層
RST標志位:三次握?建?鏈接異常時 雙?皆可reset(?接重置)
URG標志位:值為1時處理緊急數據
例如:
1 發送?發送的數據包 1, 2, 3, 4, 5;
接收?收到 1, 2, ,4, 5(假設包 3 丟失)
2 接收?會重復發? ACK 3 次
3 確認數據包 2(即重復 ACK)
4 發送?收到三個重復的 ACK 后
?即重傳丟失的包 3
?路擁塞
?路擁塞?量數據丟包會發??絡擁塞?題
解決?題不是重傳 ?是慢啟動
先發送少量數據測試當前?絡壓?
如果每次都會得到對?的ACK 則多次加倍發送數據
這是?個指數算法
擁塞窗口
為了衡量接收主機接收能?問題 使?滑動窗?解決
為了衡量傳輸數據能??題 可以使?擁塞窗?
每次發送數據包 將擁塞窗?和接受端主機反饋窗?進??較 取?的
擁塞窗?增加已開始是指數 到達?定閾值(慢啟動閾值)后呈線形增加
擁塞控制算法:慢啟動+加法增?+乘法減少
擁塞窗?本質是對?絡健康擁堵狀態的評估
延時應答
?作原理:
TCP協議在收到數據段時
通常會?即發送?個ACK報?來確認收到數據
但是在某些情況下,TCP可以延遲這個確認
(每收到固定數量的報?就應答?次)
以便在?定時間內合并多個確認應答
減少?絡上的ACK報?數量
不同層下協議及數據單位
?絡層結構淺析
路徑選擇
?標決定路徑
憑借什么交給下?個route(?絡層IP問題)
根據?的IP和?身路由表&從?確定?絡號
然后不停在??間轉發直?到公?
為何將數據交給路由器F(局域?通信問題)
?的IP地址=?標?絡+?標主機
TCP和IP的關系
IP核?作?是將數據報跨?絡傳輸給?標主機
如果丟包不需要關? 由TCP協議的超時重傳機制解決
所以滑動窗? 超時重傳 擁塞窗? ?絡擁塞都是TCP的策略
IP報頭簡述
IP=?標(?)?絡地址+主機地址
??
路由器擁有構建??能?
?個IP地址 被轉發:
1 根據?標?絡 轉發報?到?標(內)?絡
2 轉發到?標?絡后 再在內?進?轉發
??劃分
??劃分就是調整??掩碼,把?個??絡分成多個??絡
??掩碼越長(如 /26, /27),??數量越多,但每個??可?主機越少
合理劃分??可以提??絡性能,管理效率和安全性
為什么要劃分???
提??絡性能:減少?播域,降低?絡擁塞
增強安全性:不同??可以隔離,提?安全管理能?
優化IP地址使?:避免IP浪費,提?IP地址利?率
?便管理
如何進???劃分
IP地址 = ?絡號 + 主機號
?絡號:確定IP地址屬于哪個?路(??地址)
主機號:區分具體設備
??IP是??個IP地址塊(A/B/C類?絡)劃分出來的
??掩碼
??掩碼作?于區分IP地址中?絡號(??)和主機號的?個32位數
??掩碼的1表示?絡號 0表示主機號
??掩碼的格式
A類默認??掩碼:255.0.0.0
(11111111.00000000.00000000.00000000)
B類默認??掩碼:255.255.0.0
(11111111.11111111.00000000.00000000)
C類默認??掩碼:255.255.255.0
(11111111.11111111.11111111.00000000)
??掩碼的作?
?于區分?絡號和主機號
計算公式: IP地址^??掩碼=?絡號
??掩碼計算示例
設備A:192.168.1.10
設備B:192.168.1.20
??掩碼:255.255.255.0
?絡號計算:
A 的?絡號:192.168.1.0
B 的?絡號:192.168.1.0
?
相同,A和B在同???
可直接通信
如果設備C的 IP 是 192.168.2.5
C 的?絡號:192.168.2.0
?
不同?絡,必須通過路由器通信
??掩碼決定了此????(多少個IP可?于主機)
(??)
IP地址=?絡號(?標??)+主機號(?標主機)
??掩碼?來區分?絡號和主機號的界限
網段劃分具體運算概述
??劃分的主要步驟就是使???掩碼和 IP 地址進?計算
1.確定原始 IP 地址和??掩碼
先確定要劃分的 ?絡地址 和 默認??掩碼。
例如:
IP地址:192.168.1.0/24
(其中/24表示前24位是?絡號,后8位是主機號 24+8=32)
默認??掩碼:255.255.255.0(/24)
2.確定要劃分的??數量
如果要劃分成 N 個??,需要借?主機位來創建更多的?絡號
計算需要的額外?絡位數:(N:需要的??數)
計算 2^X = N,求出X值(X 是額外增加的??位數)
新的??掩碼就是 原??掩碼 + X。
3.計算新的??掩碼
默認/24(255.255.255.0)的主機位是8位,如果要劃分4個??2^3 = 8(所以借? 3 位主機位)
新的??掩碼變為 /27(255.255.255.192)
舊的默認??掩碼
11111111.11111111.11111111.00000000
( 255 . 255 . 255 . 0 )
現有新的??掩碼
11111111.11111111.11111111.11100000
( 255 . 255 . 255 . 224 )
轉換成?進制:255.255.255.224
4.計算每個??的 IP 范圍
??的增?(步長):256 - ??掩碼的最后??分
256 - 192 = 64
私有IP和公?IP
WAN和LAN
運營商
基本?絡狀況
1:普通路由器不會存儲所有公?IP的路徑
只存"如何到達下?跳"的信息
2:家庭/公司路由器只存本地?絡和默認路由
它們根本不知到具體的公?服務器IP地址如何到達
3:ISP和???路由器存儲全球BGP路由表
但它們存的是?塊IP前綴的路由信息
?不會存單個主機的路徑
4:IP數據包的轉發是逐跳(Hop-by-Hop)進?的
每個路由器只負責找到下?跳,?不是提前計算整個路徑
1.互聯?的路徑是預先規劃好的嗎?
不是完全規劃好的,?是動態學習的!
2.路由器是如何知道其"下?跳"是有效的
(1).路由器主要通過路由協議來學習和維護可達的路徑
這些協議可以分為內聯?關協議(IGP)和外部?關協議(EGP)
常?協議有:
RIP(路由信息協議):?舊,基于"跳數"選擇路徑
OSPF(開放最短路徑優先):基于Dijkstra算法,計算最優路徑
IS-IS(中?系統-中?系統):ISP內部?泛使?
(2).如何?作
鄰居發現:路由器會定期向周圍的路由器發送Hello消息,確保對?在線(爬?)
路徑計算:每個路由器會計算從??到所有?標的最佳路徑
動態更新:如果某條路徑故障,路由表會?動更新
公?(全球?絡)
本質就是對全球IP進?劃分的過程
?絡通信必須經過帶有公?ip的服務器
這就是為什么我們需要qq微信
登錄同?臺公?IP服務器
ps:申請公?IP以組織為單位(如落云宗公?IP)
由IANA統?進?分部 管理
如果路由表中沒有?標怎么辦
缺省路由(Default Route)是?絡路由中的?種特殊路由
?于在路由表中找不到匹選項時提供默認的去向
它們常?于處理?本地或未知?的地址的流量
指向?個默認的下?跳?關
數據鏈路層和以太?協議
數據鏈路層作用
數據?路層解決相鄰主機直接通信問題
「?絡層」和「數據鏈路層」間關系
就是唐僧和???
以太?
不是具體?絡 ?是?種技術標準
是?種軟硬件結合的協議
以太?的?線必須是雙絞線
它是當前最?泛使?的局域?技術協議
以太?幀格式
1.Preamble(前導碼)和SFD(起始定界符)在以太?幀的最前?,主要?于同步和標識幀的開始
Preamble使?0xAA字節來標記數據流的開始,SFD字段標識幀的開始(固定值 0xAB)
2.Destination MAC Address和Source MAC Address
?于標識?絡中接收?和發送?的硬件地址(MAC地址)
每個MAC地址是?個48位(6 字節)地址
3.Type/Length字段表示數據的類型或長度,常?的類型值有:
0x0800:IPv4
0x0806:ARP
0x86DD:IPv6
0x8847:MPLS
...?于確定將報?傳遞給上層哪個協議
4.Data 字段是實際承載的數據,長度可以變化,通常包含上層協議數據(如IP數據包)
5.FCS(幀校驗序列)是?個4字節的CRC校驗碼,?于檢查數據傳輸中的錯誤
MAC地址:mac地址是當前地址或下?跳地址
作?:位于?卡層?于識別數據?路層中相?的節點 僅可?于局域?通信
MTU對UDP影響
MTU對UDP影響設MTU=20
?旦UDP攜帶的數據超過1472(1500-20(IP??)-8(UDP?部)),那么?絡層會分成多個IP數據報
但此IP數據報有任意?個丟失,那會引起?絡層重組失敗,所以UDP的數據報分?使重傳的概率增?
MTU對TCP影響
TCP數據報??受制于MTU TCP單個數據報最?消息長度,成為MSS(Max Segment Size)
TCP建?時,送信雙?會進?MSS協商
雙?發送SYN時會進?協商在TCP頭部寫??持的MSS值
得知雙?的MSS后,會取較?的MSS位最終值
IP地址和MAC地址的區別和聯系
由于?絡是臨界資源 所以任何時刻僅容許?臺主機發送的信號
涉及和別的主機發?碰撞 那么碰撞的主機會進?休眠 讓數據鏈路層重發
整個局域? 我們可稱其為碰撞域 所以?個碰撞域中主機越少越好
單主機發送數據幀應盡量短[45,1500]
如何駭?個局域??不斷向局域?發送垃圾數據,?條件觸發碰撞
映射關系:
局域?中,IP地址通過ARP(地址解析協議)映射到MAC地址
設備需要知到?標MAC地址才能正確發送數據包
傳輸過程:
發送端根據?標IP查找?標MAC(ARP請求)
數據包在局域?內根據MAC地址傳輸
如果數據包要跨?傳輸,會經過路由器,路由器使?IP地址決定下?跳
但每?跳的MAC地址那可能改變
收到的報?會在數據鏈路層進行MAC地址核實 如果不是就直接丟棄
如何緩解碰撞問題?交換機劃分交換域
ABD組成?個碰撞域,CE組成?個碰撞域
如果A要發送數據給D,數據會先交給交換機
交換機發現AD在?個碰撞域,就將數據轉發給主機D
這樣就避免了和CD所形成的碰撞域發?碰撞
ARP協議(地址解析協議)
數據報發送主要依靠IP路由
但實際轉發依賴于?卡層MAC地址
先看op 是請求還是應答
ARP 過程
發送ARP請求(ARP Request):
發送?(主機A)想要知道?標IP地址(主機B)的MAC地址
發送?會構成?個ARP請求數據包
并使??播(MAC地址FF:FF:FF:FF:FF:FF)在局域?內發送該數據包
接收并響應ARP 請求(ARP Reply):
?標設備(主機B)收到ARP請求后,檢查其中的?標IP地址是否與??的IP地址匹配
如果匹配,主機B構成?個ARP應答包(ARP Reply)
其中包含??的MAC地址,并以單播(unicast)?式發送回給主機A
緩存 ARP 信息并送信:
發送?(主機A)收到ARP應答后,會將?標的MAC地址緩存到??ARP表中
以便后續送信時?需再次發送ARP請求
NAPT轉換表
內網穿透
內?穿透(NAT穿透)是?種技術,?于突破 NAT(?絡地址轉換)或放?墻的機制
使得位于私有?絡(內?)中的設備能夠直接與外部?絡進?通信
由于?多數家庭或企業?絡都使?路由器進? NAT,這會導致外??法直接訪問內?設備
內?穿透技術通過各種?式解決了這個?題,常?的應?場景包括遠程訪問,視頻監控,即時通訊等
內?打洞
1 上傳各?IP到云服務器
2 交換各?路由器IP
3 僅通過各?路由器進?通信 完成內?打洞
P2P模式概述 Peer-to-Peer
如果甲要在某視頻?站下載電影A
且?正好在看此電影
?絡打洞會將甲?的路由器連接形成通道
使?看電影的同時也將數據推送給甲下載
此時?即是客戶端 也是服務器
代理服務器
NAT和代理服務器區別和聯系
NAT位于路由器中 屬于?絡層
代理服務器屬于應?層
代理服務器通過充當客戶端和?標服務器之間的中介
提供多種功能,包括匿名訪問,內容過濾,緩存加速,安全性增強等
相當于?個?于路由器和主機之間傳遞數據的中間?
可以對資源進?緩存 優化上?體驗
客戶端發出請求會互聯?會將此請求給反向代理
反向代理再分配給服務器
防?墻突破—欺騙運營商路由器
由于威權管控愈加嚴格
運營商路由器發現異常報?會直接丟棄
所以開發商會買復數臺代理服務器
打開clash,會有HongKong代理1,新加坡代理2…
?臺被封死換另?臺,針對防?墻GFW,IP封鎖
提供更多流量??,增加訪問成功率
DNS
Domain Name System
域名會被DNS轉換成IP地址
com:?級域名,表示機構性質
baidu:?級域名,表示具體機構
根域名服務器(Root Name Servers)是 DNS(域名系統)的核?組成部分
負責將域名解析為IP地址的最頂層的服務器
它們在全球范圍內提供域名解析服務
確保整個互聯?的域名解析體系能夠正常運作
ICMP
ICMP是?絡層協議
會通知出錯原因
?于在?絡設備(如路由器主機)之間傳遞控制信息
幫助診斷和管理 IP ?絡的通信狀況
它主要?于報告?絡錯誤,測試聯通性和提供調試信息
ping ww.baidu.com 測試是否能進?此?址 若不能 返回錯誤
IO的簡介和阻塞?式的介紹以及對IO阻塞?式的控制?法介紹
I/O操作中,通常可以分解為兩個主要階段:
I/O 操作的時? = 等待數據的時? + 復制數據的時間
等待數據 (Wait)
例如,讀取?件時,操作系統需要從磁盤加載數據到內核緩沖區,這個過程可能涉及等待(例如磁盤I/O,?絡I/O)
這個?段可能會導致線程阻塞,特別是在同步I/O模型下
拷?數據 (Copy)
數據從內核緩沖區復制到?戶態緩沖區(例如 read()系統調?)
這個數據拷?過程也需要時間,尤其是在?量數據傳輸時會影響性能。
其中,等待時間占主要?重,
?效IO就是單位時間內??減少等待時間
建?鏈接后進程需要?直阻塞等待
等待<--->不等待 有條件變化
1阻塞和?阻塞
1.1阻塞是?論buffer有?數據都會等待
1.2?阻塞是buffer?數據就?即返回,有數據才拷?
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* 可變參數 */);
?件描述符控制函數,可以修改I/O?為,設置?件鎖,管理進程信號...
?fd:要操作的?件描述符
?cmd:控制命令,決定 fcntl 執?什么操作
?F_GETFL:獲取 fd 的?件狀態標志(如 O_NONBLOCK)
?F_SETFL:設置 fd 的?件狀態標志
?...:根據cmd可能需要提供額外的參數
2信號驅使
通過信號(signal)來通知進程I/O事件的發?,?如某個?件描述符(socket?件等)變得可讀或可寫
3多路轉接/復?
?個監測者同時監測多個IO進程,誰有數據就拷?誰
4異步I/O
異步I/O的核?就是先讓進程先提交I/O請求,OS負責執?I/O操作,進程則繼續執?其他任務,不會被I/O阻塞
當 I/O完成后,OS會通知進程,進程再回來處理數據
異步IO效率最?,但也是最受?于平臺的
同步I/O vs 異步I/O
?同步I/O:進程在發起I/O請求后,必須等待I/O完成后才能繼續執?后續操作
?異步I/O:進程在發起I/O請求后,?即返回并繼續執?其他任務,I/O由OS負責處理,完成后通知進程
控制IO?為
阻塞和?阻塞
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* 可變參數 */);
?件描述符控制函數,可以修改I/O?為,設置?件鎖,管理進程信號...
?fd:要操作的?件描述符
?cmd:控制命令,決定 fcntl 執?什么操作
?F_GETFL:獲取 fd 的?件狀態標志(如 O_NONBLOCK)
?F_SETFL:設置 fd 的?件狀態標志
?...:根據cmd可能需要提供額外的參數
select系統調用
#include <sys/select.h>
#include <sys/time.h>
int select(int nfds, fd_set *readfds,fd_set *writefds, fd_set *exceptfds,struct timeval *timeout);
作?:允許進程同時監聽多個?件描述符(如socket,pipe,?件)
并在其中任意?個變為可讀/可寫時返回,從?避免阻塞等待單個I/O事件
fe_set:是使?bitmap實現的集合數據類型,OS給?戶提供的數據類型,可以添加多個?件描述符
?其每?個fd對應?個?進制位
使?位圖這?數據結構來保存0,1,2,3...,向select傳遞這些數據
nfds:輸?輸出型參數,?件描述符的最?值 +1(即max_fd+1)
?輸?時:?戶告訴內核,哪些fd被設置成可讀
??特位位置:fd具體編號
??特位內容:是否關?
?輸出時:內核通知?戶,在?戶關?的readfds中,誰已就緒
?fd :0123 4567
?狀態:0000 0010:fd=7的讀事件已就緒
?總結,在admin要關?的fd中,fd=max{fd},且nfds=max{fd}+1
readfds:這是?個指針,監聽可讀事件的fd_set指指針(若不關?填NULL)->buffer是否有數據
writefds:監聽可寫事件的fd_set 指針(若不關?填 NULL)->buffer是否有space
??特位位置:fd具體編號
??特位內容:是否就緒 對已就緒的fd進?IO讀取 讀取?次?定不會被阻塞
exceptfds:監聽異常事件的fd_set 指針(通常?于OOB數據(帶外數據))?般填 NULL->fd是否正確
這三個參數意義是將指定fd設置進?某個集合
timeout:
?NULL:阻塞等待(直到某個 fd 發?事件)。
?{0, 0}:?即返回(?阻塞模式)。
?{sec, usec}:等待指定時間,超時后返回。
就緒:
?讀就緒:底層有數據
?寫就緒:底層有空間
select的優缺點
?每次調?select之前都要進?參數重置,接?使?不?便
?每次調?select都要在內核遍歷所有的fd,開銷較?
??持的fd數量較少
返回值
?> 0:有I/O事件發?,返回就緒的fd數量
?= 0:超時,?事件發?
?-1:出錯,errno記錄錯誤原因
注意:每次調?select之前,我們都需要將位圖重新設置
因為我們給了select?張位圖之后它會將位圖進?更改給我們?張全新的位圖
也正因如此,我們也需要?個輔助數組將歷史的所有?件描述(fd)保存起來
說?了select就是使?位圖readfds來表示哪些fd上的哪些數據已經就緒
ps:常輔助select函數?起使?的接?
FD_ZERO(&fd_set):清空?件描述符集合fd_set,即將集合中的所有位設置為0
FD_SET(fd, &fd_set):將?件描述符fd加?到fd_set集合中,表示該?件描述符在select函數檢查時應該被關注
FD_CLR(fd, &fd_set):從fd_set集合中移除?件描述符fd,即表示該?件描述符不再被select關注
FD_ISSET(fd, &fd_set):檢查?件描述符 fd 是否在 fd_set 集合中
位圖bitmap簡介
位圖的核?思想是使?**位數組(bit array)**來表示數據,每?位(bit)只有兩種狀態:
0:通常表示"不存在"或"關閉"
1:通常表示"存在"或"開啟"
所以,具體關?兩個??,1:?特位位置表示(?件描述符)fd具體編號 2:?特位內容表示是否關?
例如,假設要存儲0~15這16個整數,并且只存儲其中的{1, 3, 4, 8, 12, 15}:
索引: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
位圖: 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 1
// 位圖結構體
typedef struct {unsigned char *bits; // 存儲位的數組size_t size; // 位的總數
} Bitmap;
為什么使?結構體對數組封裝?為了防?數組傳參可能發?的降維問題
fd_set
代碼?致如下
typedef struct {unsigned long fds_bits[__FD_SETSIZE / (8 * sizeof(long))];
} fd_set;
fd_set:就是?個struct+數組的位圖
fd_set:就是?個具體數據類型,其??固定,表示其可包含的fd個數有上?(可管理?件描述符(fd)為1024個)
fd_set 是 select() 的?件描述符集合,主要?于監視多個?件描述符的狀態(可讀,可寫,異常)
需要配合 FD_ZERO、FD_SET、FD_CLR、FD_ISSET 進?操作。
受 FD_SETSIZE ?制,不?合?并發場景,?常在現代開發中被 poll() 和 epoll() 取代。
所以說select可管理的fd有上?
得出結論--->poll,epoll
?--->上限是多少
epoll多路轉接簡介與常?接?
poll?于檢查多個?件描述符(通常是?于 I/O 操作的)是否就緒
是否可以執?某些操作(如讀,寫,異常處理等)它?常在事件驅動的程序設計中使?
尤其是在需要處理多個I/O流(如?絡?接)的情況下
所以說poll就是"select+"
poll是為了select存在的fatal?題
?1.輸?輸出參數是?個bitmap,導致參數每次都需要重置
?2.等待的fd個數有上?
所以poll可以做到將輸?輸出參數進?分離同時其可等待的fd沒有上?
#include <poll.h>
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
fds:指向?個 pollfd 結構體數組的指?.每個pollfd結構體表示?個待監控的?件描述符及其相關事件
?struct pollfd {int fd; // ?件描述符short events; // 表示此fd是否就緒的標記short revents; // 發?的事件類型};
?events:指定感興趣的事件類型,可以是以下之?或多個的組合(按位或):
?(ps:這些事件都是宏,short類型可以?來表示bitmap)
?POLLIN:?件描述符可讀(數據可?)//#define POLLIN
0x001
?POLLOUT:?件描述符可寫(可以寫?數據)
?POLLERR:?件描述符發??誤
?POLLHUP:?件描述符被掛起
?POLLNVAL:?件描述符?效
?events:表示期望的?件描述符功能或狀態(如?件描述符是否可讀,可寫等)
?它是你對?件描述符的"需求"
?revents:返回的事件類型,表示實際發?的事件.這個字段會由poll()填充
?綜上所述
?revents:表示?件描述符是否就緒,也就是實?發?的事件類型
?它反映了?件描述符的當前狀態,即是否滿?你在events中設置的條件(如是否可讀,是否可寫等)
nfds:fds 數組中的元素個數,也就是需要監控的?件描述符數量
timeout:等待事件發?的時間,單位為毫秒.timeout 的值可以有三種情況:
?正數:表示等待的最?時間(ms),如果在此時?內沒有事件發?,則返回
?0:表示?阻塞模式,即?即返回,檢查是否有事件
?-1:表示阻塞模式,poll()將會?直等待直到有事件發?或被信號中斷
返回值:
?n>0:有n個fd就緒
?n=0:timeout
?n<0:error
EpollServer常?接?簡介
epoll和poll select?樣,都是就緒事件通知機制
int epoll_create(int size);
功能:創建?個epoll模型
size:已廢棄,但是必須>0
成功返回值:fd
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
功能:向epoll中添加要關?的事件,admin告訴內核想要關?的fd的事件
作?說明:向指定的epoll模型epfd(epoll_create返回值)中"增刪改(op)"指定fd上的指定事件event
epfd:通過epoll_create或epoll_create1 創建的epoll?件描述符
op:操作類型,以下是常?的操作:
?EPOLL_CTL_ADD:將?件描述符fd加?到epoll實例中進?監聽
?EPOLL_CTL_MOD:修改已經添加的?件描述符fd的監聽事件
?EPOLL_CTL_DEL:從epoll實例中刪除?件描述符fd
fd:需要添加,修改或刪除的?件描述符
event:描述?件描述符的事件類型,struct epoll_event 類型,定義如下:
輸?輸出型參數?
struct epoll_event {__uint32_t events; // 表示輸?輸出時代表的事件epoll_data_t data; // 關聯的數據(?常是?件描述符)};
?events=:宏(marco)
?EPOLLIN:有數據可讀
?EPOLLOUT:可以寫數據
?EPOLLERR:發?錯誤
?EPOLLHUP:掛起狀態
?EPOLLRDHUP:遠程掛起(即遠程關鏈接)
?EPOLLET:邊緣觸發模式(Edge-Triggered)在此模式下,事件只會在?件描述符的狀態發?變化時通知?次
?typedef union epoll_data {void *ptr; // ?戶?定義的指?int fd; // ?件描述符uint32_t u32; // ?符號 32 位整數uint64_t u64; // ?符號 64 位整數} epoll_data_t;
※MAIN POINT:事件中,admin應重點關注的是
epoll_event.events(事件類型)
epoll_data_t.fd(?件描述符)
綜上:_epfd是epoll_create的返回值,這個函數需要重點關注的是struct epoll_event *event
返回值:成功返回0,失敗-1
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
功能:?于等待事件的發?,并返回已就緒的?件描述符
作?說明:
epfd:由epoll_create或epoll_create1創建的epoll實例的?件描述符
events:輸出型參數,告訴admin所關?的fd上哪些事件已就緒
maxevents:events數組的最?容量,epoll_wait最多返回maxevents個事件
timeout:等待時間