1. 傳輸層
1.1. 前言
1.2. 傳輸層概述
傳輸層提供端到端的連接
網絡層提供點到點的連接
1.3. 傳輸層端口
端口號用來區分不同的網絡服務
端口號的範圍0-65535(2的16次方)
0-1023,公認端口號(知名端口號)
1024-49151,註冊端口
49152-65535,動態端口
1.4. 傳輸層協議
1.4.1. TCP協議
TCP協議頭部
整個TCP頭部一共20個字節
Source Port:源端
Destination Port:目的端口
Sequence Number:順序號碼
Acknowledge Number:確認號碼
Header Length;報頭長度
Resv:保留字段
Flag:標誌字段
Window:窗口,用於流量控制
Checksum:校驗字段
Urgent Pointer:緊急位
Options:可選字段
位碼即tcp標誌位,有6種標示:
SYN(synchronous建立聯機) :請求建立連接,我們把含有SYN標識的報文稱爲同步報文段
ACK(acknowledgement確認) :標識確認序列號是否有效
PSH(push傳送) :用來提示接收端應用程序立刻將數據從TCP緩衝區讀走
FIN(finish結束) :通知對端,本端即將關閉。我們把含有FIN標識的報文稱爲結束報文段
RST(reset重置) :請求重新建立連接,我們把含有RST標識的報文稱爲復位報文端
URG(urgent緊急):標識緊急指針是否有效
TCP會話的建立----三次握手
1. 第一次握手:主機A發送位碼爲syn=1(表示要求建立連接),隨機產生seq number的數據包到主機B
2. 第二次握手:主機B收到請求後要確認聯機信息,向A發送ack number=(主機A的seq+1),同時syn=1,ack=1,隨機產生一個seq number的數據包發送給A
3. 第三次握手:主機A收到後檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否爲1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到後確認seq值與ack=1則連接建立成功
TCP會話的確認
上圖給出了主機A分2次(分2個數據包)向主機B傳遞200字節的過程。首先,主機A通過1個數據包發送100個字節的數據,數據包的 Seq 號設置爲 1200。主機B爲了確認這一點,向主機A發送 ACK 包,並將 Ack 號設置爲 1301
爲了保證數據準確到達,目標機器在收到數據包(包括SYN包、FIN包、普通數據包等)包後必須立即回傳ACK包,這樣發送方纔能確認數據傳輸成功。
此時 Ack 號爲 1301 而不是 1201,原因在於 Ack 號增加了傳輸數據的字節數。假設每次 Ack 號不加傳輸的字節數,這樣雖然可以確認數據包的傳輸,但無法明確100字節全部正確傳遞還是丟失了一部分,比如只傳遞了80字節。
因此按如下的公式確認 Ack 號:seq+傳遞的字節數+1
TCP的流量控制
1. 接收端將自己可以接收的緩衝區大小放入 TCP 首部中的 “窗口大小” 字段, 通過ACK端通知發送端;窗口大小字段越大, 說明網絡的吞吐量越高
接收端一旦發現自己的緩衝區快滿了, 就會將窗口大小設置成一個更小的值通知給發送端;發送端接受到這個窗口之後, 就會減慢自己的發送速度
2. 如果接收端緩衝區滿了, 就會將窗口置爲0; 這時發送方不再發送數據, 但是需要定期發送一個窗口探測數據段, 來查看接收端是否有窗口有容量來接收數據
窗口大小決定了在收到確認前可以發送的字節數
TCP會話的拆除----四次握手
TCP的連接的拆除需要發送四個包,因此稱爲四次揮手
由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉
TCP的四次揮手
1. 客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送。
2. 服務器B收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1。
3. 服務器B關閉與客戶端A的連接,發送一個FIN給客戶端A。
4. 客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1。
1.4.2. UDP協議
UDP協議頭部
UDP頭部共8個字節,傳輸數據時沒有確認機制
Source Port:源端口
Destination Port:目的端口
Header;報頭長度
Checksum:校驗字段
當然我還有很多整理好的資料文檔和視頻文件,【 點這裏】 獲得更多資料文檔 往期教學視頻,主要也是想給新手小白少走點彎路。