1. UDP 與 TCP
UDP:無連接、盡最大可能交付吏祸、無擁塞控制对蒲、面向報文。
TCP:連接、提供可靠交付齐蔽、有擁塞控制两疚、流量控制、面向字節(jié)流含滴。
面向報文指的是對應用層傳下來的報文原封不動诱渤,只是添加 UDP 首部。
面向字節(jié)流指的是對應用層傳下來報文組織成大小不等的數(shù)據(jù)塊谈况。
2. UDP 首部
偽首部是為了計算檢驗和而臨時添加的
3. TCP 首部
第二個四字節(jié):
序號:報文段首字節(jié)編號勺美。指的是自身報文段。第三個四字節(jié):
確認號:期望收到下一個報文段序號碑韵。即另一方下次發(fā)送的序號赡茸。第四個四字節(jié):
數(shù)據(jù)偏移:即首部長度。
確認 ACK :為 1 時祝闻,「確認號」才有效占卧。連接建立后,必定為 1 联喘。
同步 SYN :建立連接時用來同步「序號」华蜒。
終止 FIN :為 1 時,表示釋放連接豁遭。
窗口:讓發(fā)送方合理設置其發(fā)送窗口叭喜。因為接收方數(shù)據(jù)緩存空間是有限。
4. TCP 三次握手
- 一握:客戶端請求連接報文段:SYN = 1 蓖谢。序號 0捂蕴,確認號 0 。
- 二握:服務器連接確認報文段:ACK = 1闪幽,SYN = 1 啥辨。序號 0,確認號 1 盯腌。
- 三握:客戶端確認收到報文段:ACK = 1 委可。序號 1,確認號 1 腊嗡。
發(fā)送方:第一次序號 x着倾,第二次序號 x + 1。
接收方:第一次序號 y燕少。連接后首次序號 y + 1卡者。
三次握手是為了讓客戶端和瀏覽器知道自己和對方的收包和發(fā)包能力都沒問題。
- 一握:服務器知道自己收包能力 OK客们,客戶端發(fā)包能力 OK崇决。
- 二握:客戶端知道服務器收包和發(fā)包能力都 OK材诽,自己發(fā)包和收包能力都 OK。
- 三握:服務器知道自己發(fā)包和收包能力都 OK恒傻,客戶端收包和發(fā)包能力都 OK脸侥。
5. TCP 四次揮手
發(fā)送方:第一次序號 u,第二次序號 u + 1盈厘。
接送方:第一次序號 v睁枕,半關閉狀態(tài),第二次序號 w沸手。
連接釋放報文段:FIN = 1 外遇。
(1)、客戶端發(fā)送連接釋放報文段契吉。(一揮)跳仿。
(2)、服務器確認收到捐晶。此時 TCP 處于半關閉狀態(tài)菲语。(二揮)。
(3)惑灵、服務器發(fā)送連接釋放報文段谨究。(三揮)。
(4)泣棋、客戶端確認收到。(四揮)
TIME_WAIT:
客戶端收到服務器的 FIN 報文后進入畔塔。而不是直接進入 CLOSED 狀態(tài)潭辈。
(1)、確保最后的確認報文能到達澈吨。
(2)把敢、為了防止已失效的連接請求報文段出現(xiàn)在本次連接之外。
6. TCP 滑動窗口
窗口是緩存的一部分谅辣,用來暫時存放字節(jié)流修赞。
接收方通過 TCP 報文段中的窗口字段告訴發(fā)送方自己的窗口大小,發(fā)送方根據(jù)這個值和其它信息設置自己的窗口大小桑阶。
接收窗口只會對窗口內最后一個按序到達的字節(jié)進行確認柏副。
發(fā)送窗口:左部字節(jié)已發(fā)送且確認,則右滑蚣录,直到左部第一個字節(jié)不是已發(fā)送且確認的狀態(tài)割择。
接收窗口:左部字節(jié)已發(fā)送且確認并交付主機,就向右滑萎河。
7. TCP 可靠傳輸
TCP 使用超時重傳來實現(xiàn)可靠傳輸:如果一個已經發(fā)送的報文段在超時時間內沒有收到確認荔泳,那么就重傳這個報文段蕉饼。
8. TCP 流量控制
控制發(fā)送方發(fā)送速率,保證接收方來得及接收玛歌。
原理是:接收方發(fā)送的確認報文中的窗口字段可以用來控制發(fā)送方窗口大小昧港。
9. TCP 擁塞控制
為了降低整個網絡的擁塞程度。
在沒有擁塞控制情況下支子,如果發(fā)生擁塞创肥,則因為超時重傳導致更嚴重的擁塞。
所以译荞,一旦發(fā)生擁塞瓤的,則必須控制發(fā)送方發(fā)送速率。與流量控制手段一樣吞歼,但目的不同圈膏。
TCP 通過四種算法來進行擁塞控制:慢開始、擁塞避免篙骡、快重傳稽坤、快恢復。
發(fā)送方需要維護有一個叫做擁塞窗口(cwnd)的狀態(tài)變量糯俗。
為了便于討論尿褪,做如下假設:
(1)、接收方有足夠大的接收緩存得湘,因此不會發(fā)生流量控制杖玲;
(2)、雖然 TCP 的窗口基于字節(jié)淘正,但是這里設窗口的大小單位為報文段摆马。
慢開始
令 cwnd=1,發(fā)送方只能發(fā)送 1 個報文段鸿吆,然后加倍囤采。
擁塞避免
先設一個慢開始閾值 ssthresh,當 cwnd >= ssthresh惩淳,進入擁塞避免蕉毯。此狀態(tài)每次 cwnd 只加 1。
如果出現(xiàn)了超時思犁,則令 ssthresh = cwnd / 2代虾,然后重新執(zhí)行慢開始。
快重傳與快恢復
接收方每收到一個失序的報文段激蹲,則立即發(fā)送重復確認褐着。
圖中,M3 丟失托呕,M4含蓉,M5频敛,M6 都是失序報文段,因此接收方共發(fā)送 4 次對 M2 的確認馅扣,后三次是重復確認斟赚。
在這種情況下,只是丟失個別報文段差油,而不是網絡擁塞拗军,因此執(zhí)行快恢復,令 ssthresh = cwnd / 2 蓄喇,cwnd = ssthresh发侵,此時直接進入擁塞避免。