傳輸層
傳輸層是為應用程序間提供邏輯通信。
1.1. UDP協定
1.1.1. UDP的主要特點
(1) UDP是無連接配接的,在傳輸資料之前不需要建立連接配接。
(2) UDP是盡最大努力傳遞的。UDP不提供可靠傳遞。
(3) UDP是面向資料報的。
(4) UDP支援一對一,一對多,多對一,多對多通信。
(5) UDP不提供擁塞控制。
(6) UDP首部開銷小隻有8個位元組。
1.1.2. UDP的首部格式
源端口 | 目的端口 | 長度 | 校驗和 |
源端口:在需要對方回信時選用,不需要時全置0
目的端口:在終點傳遞時使用
長度:UDP封包的長度(包括首部和資料字段)
校驗和:檢測使用者資料在傳輸時是否出現錯誤,出現就丢棄。
1.2. TCP協定
1.2.1. TCP的主要特點
(1) TCP是面向連接配接的,在傳輸資料之前需要建立連接配接。
(2) TCP是可靠傳輸的。
(3) TCP隻支援一對一通信。
(4) TCP是面向位元組流的。
(5) TCP有擁塞控制
(6) TCP是全雙工通信
(7) TCP首部長度是20個位元組
1.2.2. TCP的首部格式
源端口号 | 目的端口号 | |||||||
序号 | ||||||||
确認序号 | ||||||||
資料偏移 | 保留 | URG | ACK | PSH | RST | SYN | FIN | 視窗 |
檢驗和 | 緊急指針 | |||||||
選項(長度可變) | 填充 |
(1) 源端口号和目的端口号與UDP一樣。
(2) 序号:TCP連接配接中傳送的位元組流,每一個位元組都按序号編号。
(3) 确認序号:期望收到對方下一個封包段的第一個位元組的序号。
(4) 資料偏移:這個字段實際指出了TCP封包首部長度。
(5) URG:緊急标志位,表示此封包段中有緊急資料,應該快速發送。
(6) ACK:确認序号有效标記位。
(7) PUSH:推送标志位,當兩個程序進行通信時,有時需要一端輸入一個指令時,立即能夠收到對方的響應。
(8) RST:複位标志位,RST=1,表示TCP連接配接中出現嚴重差錯,需要釋放連接配接,然後重建立立連接配接。
(9) SYN:在連接配接建立時用來同步序号
(10) FIN:用來釋放連接配接。
(11) 視窗:指的是對方的接收視窗。接收視窗,是發送方設定發送視窗的依據。
1.2.3. 可靠傳輸的原理
通信雙方,發送方A,和接收方B。
停止等待協定:停止等待協定就是,每發送完一個分組就停止發送,等待對方的确認。在确認收到後再發送下一組。
A. 無差錯情況:發送方A發送分組M1後停止發送,等待接收方B發送确認信号。接收方B接受到分組M1後,向發送方A發送确認信号。發送方A接受到B的确認信号後,繼續發送分組M2。
B. 出現差錯情況:接收方B接受到發送A的分組M1,檢測出了差錯,就丢棄該封包什麼也不做。發送方A等待接收方B的确認資訊,A隻要超過一段時間沒有收到接收方B的确認資訊,就重新發送分組M1。
C. 确認丢失和确認遲到:接收方B發送的對M1确認資訊丢失了,A在逾時計時器到期後就重新發送M1分組。接收方B接收到該重複的分組M1将該重複分組丢棄,并且向A發送确認資訊。
滑動視窗協定:ARQ
位于視窗内的分組可以被連續的發送出去,而不需要等待對方的确認。連續ARQ協定規定,發送方每收到一個确認資訊就向前移動一個分組的位置。接受方一般采用累積确認的方式,不必對收到的分組注意發送确認,而是在接到幾個分組後,對按序到達的最後一個分組發送确認資訊,表示這個分組之前的所有分組都已到達。
1.2.4. TCP的流量控制
流量控制是讓發送方的速率不要太快,讓接收方來得及接收。
TCP使用滑動視窗進行流量控制,接收方會向發送方發送一個接收視窗大小。發送方發送的視窗不能超過接收方給出的接收視窗。
1.2.5. TCP的連接配接和釋放
TCP連接配接的建立:三次握手
1) 用戶端向服務端發送連接配接請求,将同步位SYN=1,同時講seq=x。這時用戶端進入SYN-SENT。
2) 服務端接收到用戶端的請求,如果同意建立連接配接,則向服務端發送确認封包。将SYN=1,ACK=1,ack=x+1,seq=y。服務端進入SYN-RCVD。
3) 用戶端接收到服務端的封包,還需要向用戶端确認。将ACK=1,ack=y+1,seq=x+1。連接配接建立完成,用戶端和服務端進入ESTABLISHED
為什麼需要用戶端第三次發送确認?
防止失效的資訊重新請求連接配接。用戶端向服務端發送連接配接請求,請求封包在某個網絡節點阻塞,用戶端逾時重傳新的連接配接請求,并建立連接配接,傳輸資料完成後。失效的請求封包到達用戶端,如果沒有第三次用戶端的确認。則伺服器建立連接配接後,用戶端沒有資源傳輸,這樣空的連接配接就會浪費資源。
TCP連接配接的釋放:四次揮手
1) 用戶端向服務端發送連接配接釋放封包,并停止發送資料。将FIN=1,seq=u(等于前 面發送的最後一個位元組的序号加1)。進入FINAL-WAIT-1
2) 服務端接受到封包後,發送确認信号,将ACK=1,ack=u+1,seq=v(等于其那面接 受到最後一個位元組的序号加1)。進入CLOSE_WAIT狀态。這時用戶端到服務端 的連接配接斷開。用戶端接受到确認信号後進入FINAL-WAIT-2狀态。等待服務端 發送連接配接釋放信号。
3) 服務端向用戶端發送連接配接釋放封包,将SYN=1,ack=u+1,seq=w。LAST-ACK
4) 用戶端接收到服務端的了封包後,向用戶端發送确認。将ACK=1,ack=w+1,seq=u+1.進入TIME-WAIT狀态。