TCP是面向連接的墓律,傳輸數(shù)據(jù)前要通過“三次握手”建立連接帖努,傳輸完成后也要拆除連接,就像我們打完電話要掛斷一樣琳疏。
TCP通過“四次揮手”拆除連接有决。
假設(shè)電腦A發(fā)送數(shù)據(jù)給電腦B,電腦A已將全部數(shù)據(jù)發(fā)送完畢轿亮,則“四次揮手”過程為:
第一次揮手疮薇,電腦A發(fā)送拆除連接請求(FIN=1);
第二次揮手我注,電腦B收到請求后,需要做個收尾迟隅,比如緩沖區(qū)中還有數(shù)據(jù)沒有處理完但骨。為避免對端超時,發(fā)送ACK=1對電腦A的請求進行確認智袭,意思是“你的請求我收到了奔缠,但我還沒處理完,稍等一下下哦”吼野;
第三次揮手校哎,電腦B處理完成,收尾結(jié)束,向電腦A發(fā)送拆除連接請求(FIN=1)闷哆,意思是“我OK了腰奋,可以拆除了”;
第四次揮手抱怔,電腦A收到后劣坊,向電腦B回復(fù)ACK=1,意思是“收到屈留,可以拆除”局冰。
電腦B收到第四次揮手報文后,立即拆除連接灌危。電腦A發(fā)出第四次揮手報文后康二,經(jīng)過2倍MSL時間后,拆除連接勇蝙。
MSL(Maximum Segment Lifetime赠摇,最大報文段生存時間),不同操作系統(tǒng)默認值也不同浅蚪。
Windows系統(tǒng)藕帜,MSL默認為120秒;
Linux系統(tǒng)惜傲,MSL默認為60秒洽故。
既然是“默認”,那就可以改盗誊。怎么改就不在這兒說了时甚,感興趣的小伙伴自己查查。
電腦A為什么要等待2MAL時間哈踱,而不是發(fā)出第四次揮手后就立即拆除呢荒适?
電腦A發(fā)出第四次揮手報文后,立即拆除連接开镣〉段埽可是,如果這個報文丟失邪财,電腦B就收不到了陕壹。電腦B遲遲收不到確認回復(fù),經(jīng)過RTO超時后會重傳第三次揮手報文树埠,然而糠馆,此時的電腦A已經(jīng)拆除連接,不會再發(fā)ACK確認怎憋,而電腦B則會不停地超時重傳又碌,無法拆除連接九昧!
當然,四次揮手是很佛系的正常拆除毕匀。實際上我們常常會遇到不正常拆除铸鹰,比如斷網(wǎng)了,或者把應(yīng)用程序強行關(guān)閉了期揪,等等掉奄。不正常拆除會通過RST拆除重連,或者通過TCP的保持計時器處理凤薛。
通信雙方如果收到對方的任意報文姓建,都會重置保持計時器。如果長時間沒收到對端的消息缤苫,保持計時器超時后速兔,會每隔75秒發(fā)送探測報文給對方,發(fā)送10次后還沒有收到對方回復(fù)活玲,則拆除連接涣狗。
TCP雖然保證了可靠傳輸,但是它也有缺點:一是數(shù)據(jù)傳輸要確認舒憾、要重傳镀钓,速度很慢,不適合對延時比較敏感的應(yīng)用镀迂,比如語音丁溅、視頻等,流暢比可靠更重要探遵;二是要先建立連接才能通信窟赏,不適合一對多、多對多的應(yīng)用箱季。
所以涯穷,傳輸層還需要一個速度快、簡單的協(xié)議藏雏。它就是UDP(User Datagram Protocol拷况,用戶數(shù)據(jù)報協(xié)議)。
UDP沒有TCP擁有的各種機制诉稍,是一種無連接的傳輸協(xié)議蝠嘉,所以傳輸數(shù)據(jù)非常快杯巨。
看看UDP的封裝格式,太簡單了努酸!
源目端口號服爷、校驗和與TCP的含義一樣。Lenth指整個數(shù)據(jù)段長度,包括data和UDP頭部封裝仍源。
UDP把應(yīng)用程序要發(fā)送的數(shù)據(jù)拿來心褐,加上頭部后就扔給IP了。啥也不管笼踩!連接逗爹?可靠?跟我UDP沒關(guān)系嚎于。
由于沒有連接掘而,也就不需要維護狀態(tài),就可以把數(shù)據(jù)同時發(fā)給多個人于购!所以袍睡,UDP可以支持組播和廣播。
TCP面向字節(jié)肋僧,所以TCP有MSS來保證數(shù)據(jù)段不被IP分片斑胜,減少IP工作量。而UDP是面向報文的嫌吠,就是說應(yīng)用程序要發(fā)多少止潘,UDP只管加頭部交給IP,不關(guān)心報文大小辫诅。大了凭戴,讓IP去分片就好了。
UDP的應(yīng)用非常多泥栖,比如視頻網(wǎng)站簇宽、網(wǎng)絡(luò)游戲、聊天軟件吧享、視頻監(jiān)控魏割,等等。
小Q:既然UDP和IP一樣钢颂,也是無連接钞它、不可靠的,為什么應(yīng)用程序不把數(shù)據(jù)直接交給IP呢殊鞭?
歡迎留言討論遭垛。