目錄
一. UDP協議
1.UDP協議概念
2.UDP數據報格式
3.UDP協議差錯控制
二. TCP協議
1.TCP協議概念
2.三次握手與四次揮手
3.TCP報文段格式(重點)
4.流量控制
5.擁塞控制
一. UDP協議
1.UDP協議概念
當應用層的進程1要向進程2傳輸報文,會將報文轉給傳輸層處理;UDP會在報文前加上一個UDP首部(只占8字節),組成一個UDP數據包;最后再發到網絡層,網絡層再加上一個IPV4首部,根據這個首部信息找到目的地址;然后主機B收到這個IP數據包以后,進行逆操作
- UDP首部很小,只占8B
- UDP會拒絕過大的報文,因為它每次只能傳輸一個完整報文,不支持拆分、重裝
- UDP無連接、不可靠的(無報錯確認機制,由應用層完成),不支持擁塞控制(路由器過載運作,傳輸數據報的速度不會慢下來)
- UDP支持一對一+一對多(一對一封裝成單播IP數據報,一對多封裝成廣播、多播IP數據報)
UDP一對一的方法與TCP相同
一對多是通過目的IP為 255.255.255.255 (廣播IP,往目的網絡所有的主機進行數據發送),然后后面加上一整個UDP協議下的數據報。UDP能支持廣播很重要的一個原因在于:不需要進行拆分、重裝,可以一次性全部傳輸完;同時,UDP是通過UDP首部中設置目的端口號來尋找目標主機,然后對目的端口的所有主機進行數據傳輸(TCP也是通過目的端口尋找目標主機,但找到一眾目標主機后只能與其中之一進行連接),所以可以通過端口號一次性找到多臺目標主機(如下圖,主機A要向目的網絡的所有端口為711的主機發送消息)
2.UDP數據報格式
UDP長度:聲明數據報大小,固定只有16比特(即65535字節,2^15+2^14+……+2^0 = 65535);由于一個IP數據報可以運輸的最大數據量是65515字節,因此UDP協議下的數據報最大只能是65535字節;UDP長度應該是UDP首部+報文的大小,不是單指報文大小
UDP校驗和:由發送方計算并輸入,接收方檢驗是否錯誤,全0代表無需校驗
3.UDP協議差錯控制
檢驗信息的生成與使用:若有32bit數據信息,相加以后逐位取反;此時數據相加的結果,與取反以后的檢驗和相加,應該正好為全1(數據為0的地方,檢驗和肯定為1;數據為1的地方,檢驗和肯定為0);接收方只要看檢驗和與數據相加以后是否為全1,如果為全1就代表沒出差錯;如果最高位產生進位,就需要“回卷”加到最低位
UPD檢驗的過程:生成檢驗和前,先在UDP首部前生成一個偽首部;把偽首部、UDP首部與數據部分分以16bit為一組,進行檢驗和生成;生成了以后去除掉偽首部,通過網絡層傳輸以后,接收方接受了以后也需要生成偽首部,然后判斷相加是否為1(具體流程如下圖)
IP協議的首部檢驗和方法與UDP大致相同,只是IP檢驗和數據部分不參與,UDP檢驗和要將數據部分也算上;同時,IP進行校驗和時不需要添加偽首部
二. TCP協議
1.TCP協議概念
UDP與TCP之別
TCP首部很大且大小可變,要有20字節~60字節;TCP可以對報文進行分組、重裝傳輸,因此可以傳輸大的報文(類比成分組交換);TCP需要連接(類似于電路交換),且會發送接受成功、接受錯誤信息 -> 可靠,并且能夠進行流量控制,并且只能一對一;TCP傳輸內容叫做報文段(面向字節流),UDP傳輸內容叫做數據報(面向整體報文)
TCP特點
n個TCP報文段可能亂序到達接收方,但TCP協議會按序向應用層遞交;每次建立TCP連接以后,可以雙向傳輸多個報文;MSS是由通信雙方決定的報文段最大段長,TCP不要求報文段滿載,只要別超過MSS即可
2.三次握手與四次揮手
注:揮手操作A、B兩端誰先結束,誰先釋放連接
三次握手
握手1、握手2不能攜帶數據,但是仍要消耗一個序號;握手3可以攜帶數據,不攜帶數據就不消耗序號,此處的序號指的是ack、seq后面的數字;接收端的序號與發送端的區號是可以不一樣的,可以理解成兩端發送的數據不一樣
客戶端、服務器進程TCP狀態變化如下圖所示
四次揮手
揮手1、揮手3即使不攜帶數據,也要消耗1個序號;揮手2可以攜帶數據,揮手4不可以攜帶數據
客戶端、服務器進程TCP狀態變化如下圖所示。MSL指的是最長報文段壽命,1MSL指800ms,2MSL代表1600ms過后客戶端才會真正關閉連接
3.TCP報文段格式(重點)
序號(seq):用于標記數據部分第一個字節在原始字節流的位置,起始序號由發送方自己設置(不一定從0開始)
確認號(ack或者ack_seq):用于反饋,表示序號在該確認號之前的所有字節都已正確收到;ACK = 0 時,ack 無效,ACK = 1 時,ack 有效;只有第一次揮手時,ack會是無效的,其他情況下ack都應該有效(若無效則說明出現了差錯,例如報文段丟失)
數據偏移(data offset):表示TCP首部長度,以4字節為單位(比如現在的tcp首部只有3字節,那么此時就需要通過后面的填充部分加上1字節),表示形式是字節實際存儲用的是比特位
保留:暫時沒用,通常全設置為0
填充:被用來解決數據偏移問題,湊足4字節的整數倍
URG(緊急位):只占1bit,為1時表示是緊急數據要盡快插隊發送;當該位為1時,會讓緊急指針有效,緊急指針存放了緊急數據專用序號
PSH(推送位):為1時希望接收方盡快回復
RST(復位位):為1時表示出現嚴重差錯(例如主機崩潰),必須釋放連接;或者需要拒絕一個非法報文段(例如惡意的黑客攻擊)
SYN(同步位):為1時表示這是一個連接請求或連接接受報文;只在握手1、握手2中,SYN = 1
FIN(終止位):為1時表示請求釋放連接報文;只在揮手1、揮手3中,FIN = 1
窗口(rwnd或者rcvwnd):用作流量控制,假設現在的接受緩沖區還剩下500B空間,那么此時的rwnd = 500(即接收方還能接受多少數據)
檢驗和:和UDP原理一樣
選項(長度可變):協商決定了在握手1、握手2當中,MSS字段大小多少
4.流量控制
窗口大小與MSS大小不一的原因:接受發送的端口,主機的處理能力不一樣
如果緩沖區域大小為3000字節,那么滑動窗口大小為3000字節,當被占滿以后處理了2000字節,此時的滑動窗口大小為2000字節。不同的滑動窗口大小,在回復信息時的rwnd大小都不一樣,同時為0時的ACK主要是告訴發送方接受成功。
5.擁塞控制
cwnd是針對發送方而言的,一個限制性的滑動窗口
超時:如果發送了當前窗口大小的數據量,在規定的時間內沒有接收到接收方發來的確認好,那么就會超時重傳;發送超時重傳以后,慢開始的下限值會變成當前滑動窗口的一半大小,然后又開始進入到慢開始階段
3-ACK:收到了一條數據的三次確認信息,說明有該數據發送失敗了;此時停止發送,然后將傳輸失敗的數據快重傳;因為并非由于數據過多而導致的傳輸失敗,因此不用進行慢開始;變一半同超時