① 網路基礎-傳輸層, 網路層數據鏈路層
同軸電纜: 半雙工通訊;
集線器: 類似同軸電纜, 半雙工通訊;容易沖突;
網橋: 兩個介面, 通過自學習記錄每個介面側的 mac 地址;從而起到隔絕沖突域的作用;
交換機: 相當於介面更多的網橋, 全雙工通訊;
路由器: 可以在不同網段之間發送數據, 隔絕廣播域;
IP地址的組成:
IP地址有兩部分組成: 網路標識(網路ID, 網段), 主機標識( 主機ID);
如何避免浪費IP資源?
信道:信息傳輸的通道, 一條傳輸介質上(比如網線), 可以有多條信道;
單工通信: 信號只能往一個方向傳, 任何時候不能改變信號的方向;
半雙工通信:信號可以雙向傳播, 但是必須交替進行, 同一時間只能往一個方向傳播;
全雙工通信:信號可以同時雙向傳播;
數據幀:數據鏈路層
如何確保一個數據幀的完整性:
幀的尾部有FCS標識符是根據幀首和幀尾計算得來的, 在獲得一個幀數據後幀首幀尾根據計算計算如果值等於FCS則數據幀完整, 去掉幀首幀尾即可獲得中間的數據buffer;
數據鏈路層的數據(MTU)大小為不超過1500個位元組,因此我們可以推斷出傳輸層的數據段最大為不超過1460位元組;(網路層的首部最小20個位元組, 傳輸層首部最小20個位元組, 因此傳輸層的數據段最大為1460);
ping 的幾個用法:
通過tracert, pathping ip地址的方式, 可以查看途徑的路由器;
TTL : Time To Live(生存時間) 每經過一個路由器值就會減1; 為0時數據包不再傳輸;
埠:
UDP首部中埠是佔用2個位元組(因此其取值范圍是0-65535);
防火牆可以可以設置開啟/關閉某些埠提升安全性;
常用命令:
傳輸層的兩個協議
TCP: 傳輸控制協議;
UDP: 用戶數據報協議;
TCP的數據格式:
TCP標志位的作用:
如果數據超時或者收到三次確認都會重新發送保證數據完整性;
主要是通過ARQ(自動重傳技術-超時重發)+滑動窗口協議實現(例如一次可以接收4個數據包, 就是一個緩沖區的設置);
另外通過SACK(選擇性確認)來告訴發送方哪些數據已經接收到哪些數據丟失, 這樣TCP就只發送丟失的部分即可;
如果接收方的數據緩沖區已經滿了, 而發送方還在不停的發數據, 則需要進行流量控制;如果不進行控制則接收方只能將大量的數據包進行丟棄, 造成的大量的網路資源浪費;
什麼是流量控制?
讓發送方的發送速度不要太快, 讓接收方有足夠的時間和空間來處理和接受數據;注意這個概念是指點對點之間;
原理:
通過確認報文中的窗口欄位來控制發送方的發送速率;
發送方的發送窗口大小不能超過接收方的窗口大小;
當發送方收到接收方的窗口為0時則不再發數據;
特殊情況:
剛開始接收方發送了0窗口報文給發送方, 然後發送方停止了發送數據;
後面接收方有空間了, 發送了非0窗口報文給發送方結果報文丟失了;
則接收方和發送方陷入循環;
解決方案: 發送方收到0窗口報文的時候停止發送數據, 同時開啟一個定時器, 隔一段時間發送測試報文取詢問接收方窗口的大小, 如果仍然收到0窗口報文則重新刷新啟動定 時器;
鏈路的吞吐量在過載的時候會導致擁塞;直觀的理解為, 一條路可以同時供100輛車100km/h通過, 但是當有200輛車的時候估計只能以50km/h通過, 當有300輛車時估計會堵的動不了;
擁塞控制是指避免過多的數據注入到網路中, 避免網路中的路由器或者鏈路過載;擁塞控制是一個全局性的過程, 涉及到所有的主機, 路由器; 是大家共同努力的結果; 注意區分流量控制是點對點之間的;
幾個縮寫:
MSS: 每個段最大的數據部分大小, 在建立鏈接是確定;
swnd: 擁塞窗口;
rwnd:接收窗口;
swnd:發送窗口; swnd=min(swnd, rwnd);
擁塞控制思路:
慢開始(慢啟動)-擁塞避免- 快速重傳-快速恢復;
a. 慢開始 :
b. 擁塞避免 :
c. 快重傳 :
d. 快恢復 :
e. 用圖片表示擁塞控制
狀態解讀:
Closed: Client處於關閉狀態;
Listen: Server處於監聽狀態, 等待Client鏈接;
SYN-RCVD: 表示Server收到SYN報文, 當收到Client的ack報文後進入ESTABLished狀態;
SYN-SENT: 表示Client已經發出SYN-SENT報文, 等待Server的第二次握手;
ESTABlished: 已經建立鏈接;
TCP建立鏈接前兩次握手的特點:
ACK和ack的區別:
大寫的ACK(Acknowledgement)是標識位, 可以通過它標識包的性質, [ACK] or [SYC] or [FIN] .
小寫的ack(Acknowledgement Number), 是確認號。 即收到seq=x 的數據包後,回復 ack=x+1 的確認。
狀態解讀
FIN-WAIT1: 表示向主動斷開, 向對方發送了FIN報文後進入FIN-WAIT1狀態;
CLOSE-WAIT: 表示等待關閉, 當對方發送FIN報文給自己,會回應一個ACK報文, 同時進入CLOSE-WAIT狀態, 此狀態下如果仍然有數據發送給對方則會繼續發送, 如果沒有數據發給對方,則發送FIN給對方;
FIN-WAIT2: 主動方收到對方的ACK報文後就會處於FIN-WAIT2狀態然後等待對方的FIN報文;
LASK-ACK: 被動一方在發送FIN報文後處於LAST-ACK狀態, 收到主動方的ACK報文後就進入CLOSED狀態;
TIME-WAIT: 主動方收到對方的FIN報文後回復ACK報文給對方並進入TIME-WAIT狀態, 等待2MSL時間後進入CLOSED狀態;
如果在FIN-WAIT1狀態下同時收到對方的FIN和ACK報文則直接進入TIME-WAIT狀態, 無需經過FIN-WAIT2狀態;
CLOSED: 關閉狀態;
CLOSING: 一種比較罕見的狀態, 表示發出FIN報文後沒有收到對方的ACK報文反而也收到了FIN報文,即雙方幾乎同時發送FIN報文時就會進入CLOSING狀態;表示雙方都在進行關閉鏈接;
細節補充
為了提高重傳的性能; 可靠性傳輸是在傳輸層進行控制的;
這個取決於系統的設置, 例如有些系統在重新傳輸5次後仍然不能成功, 就會發送reset報文( RST )斷開TCP鏈接;
三次握手的目的: 防止伺服器端一直等待, 浪費資源;
如果改成兩次握手會出現的情況: 假如client客戶端第一次發送的請求報文段, 因為網路延遲的原因, 在釋放鏈接後才到達伺服器端, 本來這是一個應該失效的請求鏈接, 但是server端收到這個請求後會誤認為這是client發送的新的鏈接請求, 於是sever端就會再次給client發送確認報文然後建立鏈接, 等待client發送數據過來, 這樣的話, server端就會一直處於鏈接狀態等待;
採用三次握手的方法可以防止上述情況發生:例如上述情況, client沒有向server發出確認, server端收不到確認就知道client不是建立鏈接;
另一種解析的思路 : client和server建立鏈接是為了相互交換數據, 所以得確保自己和對方的數據收發功能都處於正常狀態;
第一次握手: server端可以確認自己的接收功能和client端的發送功能正常;
第二次握手: client端可以確認自己的發送和接收功能都是正常, 並且server端的接收和發送功能都是正常的;
第三次握手: server端確認自己的發送功能和client的接收功能正常;;
第三次握手的時候server處於SYB-RCVD狀態, 如果等不到client端的ACK, server端會再次發送ACK+SYN包, 如果多次發送後仍然等不到client的ACK包, 則server端發送RST包, 強制斷開鏈接;
有必要, 而且不能省去, 原因如下: 假如Client在發送ACK報文後立即進入了斷開狀態, 然後因為網路狀態Server端沒有收到這個ACK報文則會重發FIN報文給Client, 則可能會出現的情況如下:
a. Client端沒有反應, Server重復嘗試發送FIN給Client, 浪費資源;
b. Client剛好有個新的應用分配了同一個埠, 新應用本是想建立鏈接, 結果收到FIN報文後就會進入斷開鏈接操作;
e
② 數據鏈路層協議和傳輸層協議的區別
數據鏈路層:數據鏈路層的最基本的功能是向該層用戶提供透明的和可靠的數據傳送基本服務。透明性是指該層上傳輸的數據的內容、格式及編碼沒有限制,也沒有必要解釋信息結構的意義;可靠的傳輸使用戶免去對丟失信息、干擾信息及順序不正確等的擔心。在物理層中這些情況都可能發生,在數據鏈路層中必須用糾錯碼來檢錯與糾錯。數據鏈路層是對物理是對物理層傳輸原始比特流的功能的加強,將物理層提供的可能出錯的物理連接改造成為邏輯上無差錯的數據鏈路,使之對網路層表現為一無差錯的線路。功能:差錯控制、流量控制
傳輸層:Internet 在傳輸層有兩種主要的協議:一種是面向連接的協議 TCP ,一種是無連接的協議 UDP,在TCP/IP 協議簇中, IP 提供在主機之間傳送數據報的能力,每個數據報根據其目的主機的 IP 地址進行在 Internet 中的路由選擇。傳輸層協議為應用層提供的是進程之間的通信服務。為了在給定的主機上能識別多個目的地址,同時允許多個應用程序在同一台主機上工作並能獨立地進行數據報的發送和接收, TCP/UDP 提供了應用程序之間傳送數據報的基本機制,它們提供的協議埠能夠區分一台機器上運行的多個程序。也就是說, TCP/UDP 使用 IP 地址標識網上主機,使用埠號來標識應用進程,即 TCP/UDP 用主機 IP 地址和為應用進程分配的埠號來標識應用進程。埠號是 16 位的無符號整數, TCP 的埠號和 UDP 的埠號是兩個獨立的序列。盡管相互獨立,如果 TCP 和 UDP 同時提供某種知名服務,兩個協議通常選擇相同的埠號。這純粹是為了使用方便,而不是協議本身的要求。利用埠號,一台主機上多個進程可以同時使用 TCP/UDP 提供的傳輸服務,並且這種通信是端到端的,它的數據由 IP 傳遞,但與 IP 數據報的傳遞路徑無關。網路通信中用一個三元組可以在全局唯一標志一個應用進程: