TCP/IP 協(xié)議族
通常我說 TCP/IP 是指 TCP/IP 協(xié)議族。它是基于 TCP 和 IP 這兩個最初的協(xié)議之上的不同的通信協(xié)議的大集合。例如:http、https、ftp、icmp、arp、rarp、smtp(簡單郵件傳輸協(xié)議)
一個網(wǎng)絡(luò)請求是怎么傳輸?shù)模?/h2>
我們拿訪問瀏覽器舉個栗子,如圖所示:
TCP、UDP有什么區(qū)別?各有什么優(yōu)劣?
TCP 面向連接,提供可靠交付。通過 TCP 連接傳輸?shù)臄?shù)據(jù),無差錯、不丟失、不重復、并且按序到達。相對 UDP 開銷大UDP 面向無連接,不保證可靠交付。無擁塞控制,支持一對一、一對多、多對多,開銷小。
關(guān)于 TCP 協(xié)議
- 確認 ACK – ACKnowledgement 僅當ACK = 1 時,確認才有效。簡單來說,就是確認收到數(shù)據(jù)。
- 復位 RST – ReSet 標明 TCP 出現(xiàn)嚴重差錯時,必須釋放連接,重新建立連接。
- 同步 SYN – SYNchronization 在建立連接時,用來同步序號。當 SYN = 1,ACK = 0 時,表名這是一個連接請求報文。 SYN = 1,ACK = 1 表示這是一個同意請求報文。
- 終止 FNI – FINis(表示終、完)用來釋放連接。當 FNI = 1 表示此段報文發(fā)送方已發(fā)送完畢。
關(guān)于 UDP 協(xié)議
解釋三次握手
- 確認號 ack 期望收到對方下一個報文的序列號
- 序列號 seq
- SYN = 1 請求同步序列號,A 的序列號為:x
- SYN = 1 ACK = 1,表示確認請求。B 發(fā)送的數(shù)據(jù)的序列號為:y,期望收到 下一個 A 的數(shù)據(jù)的序列號為:x + 1
- ACK = 1 ,表示確認請求。A 發(fā)送的數(shù)據(jù)的序列號為:x + 1,期望收到下一個 B 的數(shù)據(jù)的序列號為:y + 1
說說TCP三次握手?為什么不兩次?
如果發(fā)送兩次就可以建立連接話,那么只要客戶端發(fā)送一個連接請求,服務(wù)端接收到并發(fā)送了確認,就會建立一個連接。
可能出現(xiàn)的問題:如果一個連接請求在網(wǎng)絡(luò)中跑的慢,超時了,這時客戶端會從發(fā)請求,但是這個跑的慢的請求最后還是跑到了,然后服務(wù)端就接收了兩個連接請求,然后全部回應(yīng)就會創(chuàng)建兩個連接,浪費資源!
如果加了第三次客戶端確認,客戶端在接受到一個服務(wù)端連接確認請求后,后面再接收到的連接確認請求就可以拋棄不管了。
說說TCP四次揮手?為什么不是三次?
據(jù)傳輸結(jié)束后,通信的雙方都可以釋放連接?,F(xiàn)在 A 和 B 都處于 ESTABLISHED 狀態(tài)。
第一次揮手:A 的應(yīng)用進程先向其 TCP 發(fā)出連接釋放報文段,并停止再發(fā)送數(shù)據(jù),主動關(guān)閉 TCP 連接。A 把連接釋放報文段首部的終止控制位 FIN 置 1,其序號 seq = u(等于前面已傳送過的數(shù)據(jù)的最后一個字節(jié)的序號加 1),這時 A 進入 FIN-WAIT-1(終止等待1)狀態(tài),等待 B 的確認。請注意:TCP 規(guī)定,F(xiàn)IN 報文段即使不攜帶數(shù)據(jù),也將消耗掉一個序號。
第二次揮手:B 收到連接釋放報文段后立即發(fā)出確認,確認號是 ack = u + 1,而這個報文段自己的序號是 v(等于 B 前面已經(jīng)傳送過的數(shù)據(jù)的最后一個字節(jié)的序號加1),然后 B 就進入 CLOSE-WAIT(關(guān)閉等待)狀態(tài)。TCP 服務(wù)端進程這時應(yīng)通知高層應(yīng)用進程,因而從 A 到 B 這個方向的連接就釋放了,這時的 TCP 連接處于半關(guān)閉(half-close)狀態(tài),即 A 已經(jīng)沒有數(shù)據(jù)要發(fā)送了,但 B 若發(fā)送數(shù)據(jù),A 仍要接收。也就是說,從 B 到 A 這個方向的連接并未關(guān)閉,這個狀態(tài)可能會持續(xù)一段時間。A 收到來自 B 的確認后,就進入 FIN-WAIT-2(終止等待2)狀態(tài),等待 B 發(fā)出的連接釋放報文段。
第三次揮手:若 B 已經(jīng)沒有要向 A 發(fā)送的數(shù)據(jù),其應(yīng)用進程就通知 TCP 釋放連接。這時 B 發(fā)出的連接釋放報文段必須使 FIN = 1。假定 B 的序號為 w(在半關(guān)閉狀態(tài),B 可能又發(fā)送了一些數(shù)據(jù))。B 還必須重復上次已發(fā)送過的確認號 ack = u + 1。這時 B 就進入 LAST-ACK(最后確認)狀態(tài),等待 A 的確認。
第四次揮手:A 在收到 B 的連接釋放報文后,必須對此發(fā)出確認。在確認報文段中把 ACK 置 1,確認號 ack = w + 1,而自己的序號 seq = u + 1(前面發(fā)送的 FIN 報文段要消耗一個序號)。然后進入 TIME-WAIT(時間等待) 狀態(tài)。請注意,現(xiàn)在 TCP 連接還沒有釋放掉。必須經(jīng)過時間等待計時器設(shè)置的時間 2MSL(MSL:最長報文段壽命)后,A 才能進入到 CLOSED 狀態(tài),然后撤銷傳輸控制塊,結(jié)束這次 TCP 連接。當然如果 B 一收到 A 的確認就進入 CLOSED 狀態(tài),然后撤銷傳輸控制塊。所以在釋放連接時,B 結(jié)束 TCP 連接的時間要早于 A。
什么是擁塞控制?
簡單來說,就是通過網(wǎng)絡(luò)的擁塞情況來調(diào)整 TCP 發(fā)送端發(fā)送的數(shù)據(jù)量。發(fā)送量先由 1 指數(shù)級遞增,到一定量時(65535 個字節(jié))開始慢下來,這個時候還是遞增的。等到開始丟包時,又開始降低發(fā)送速度。
什么是流量控制?
簡單來說,就是 TCP 的接受端處理不過來,讓 TCP 的發(fā)送端發(fā)送慢一點。接收端會維護一個處理窗口,即是接收端所能處理數(shù)據(jù)的能力。接收端將這個處理能力不斷反饋給發(fā)送端,以此來讓發(fā)送端調(diào)整發(fā)送的數(shù)據(jù)量的多少。
未經(jīng)允許不得轉(zhuǎn)載:445IT之家 » ?TCP/IP 協(xié)議詳解